본문 바로가기

문제

picoCTF 2018 assembly-2 풀이

'What does asm2(0x8,0x21) return?' picoCTF 2018 assembly-2문제입니다. 파라미터는 0x8, 0x21 두개 입니다.  소스를 열어보면 아래와 갔습니다.


asm2:
push    ebp
mov    ebp,esp
sub     esp,0x10   //스택프레임 생성

mov    eax,DWORD PTR [ebp+0xc]  // [ebp+c] -> 21
mov    DWORD PTR [ebp-0x4],eax  //  [ebp-4] -> 21 
mov    eax,DWORD PTR [ebp+0x8] //  [ebp+8] -> 8
mov    DWORD PTR [ebp-0x8],eax //   [ebp-8]  -> 8
jmp     part_b
part_a:
add     DWORD PTR [ebp-0x4],0x1 // +1
add     DWORD PTR [ebp+0x8],0xa9 // +a9
part_b:
cmp    DWORD PTR [ebp+0x8],0x3923 // ↓
jle      part_a  //  조건문 ([ebp+8] <= 3923)을 만족하면 part_a로 점프
mov    eax,DWORD PTR [ebp-0x4]
mov    esp,ebp
pop     ebp
ret


우선 part_b 가 먼저 실행됩니다. [ebp+0x8]에 있는 값 즉 8이 3923보다 작거나 같다는 식이 만족하면 part_a로 점프하는 반복문입니다. part_a에서 [ebp - 0x4]와 [ebp+0x8]을 보면 각각 1과 a9를 더해 주는 것을 볼 수 있습니다. 즉 8이 3923이 될 때까지 반복해야 합니다. 식을 세워보면 ( 8+n*a9 = 3923 )과 같이 쓸 수 있습니다. n은 56이 나옵니다. n이 56일 때 즉 56번을 반복했을 때 [ebp+0x8] 값이 3923이 됩니다. 그래서 [ebp-0x4]의 초깃값 21 + 56 + 1을 하면 = 0x78 이 됩니다. 1을 더한 이유는 조건문이 작거나 같다 이기에 같을 때 즉 [ebp+0x8] 값이 3923일 때 한 번 더 반복하기 때문입니다. 최종 답은 0x78입니다.

 

 

 

 

'문제' 카테고리의 다른 글

suninatas web challenge 2  (0) 2021.04.01
suninatas web challenge 1  (0) 2021.04.01
CodeEngn #1  (0) 2020.03.11
picoCTF 2018 assembly-1 풀이  (0) 2019.05.20
picoCTF 2018 assembly-0 풀이  (0) 2019.05.20