'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 |