Wargame & CTF/picoCTF

[picoCTF][Reverse Engineering]asm2 문제 풀이

seomj 2021. 1. 7. 01:13

문제

 

풀이

<+3>: sub    esp,0x10

esp의 주소값에서 0x10(16byte)를 빼서 esp에 넣음

-> 16 byte의 공간을 확보

 

<+6>: mov    eax,DWORD PTR [ebp+0xc]

<+9>: mov    DWORD PTR [ebp-0x4],eax

<+12>: mov    eax,DWORD PTR [ebp+0x8]

<+15>: mov    DWORD PTR [ebp-0x8],eax

ebp-0x4 및 ebp-0x8에 두 개의 새로운 위치가 생성

ebp + 0xc의 값이 저장

-> ebp-0x4는 0x21을 저장

-> ebp-0x8은 0x4를 저장

 

<+18>: jmp    0x509 <asm2+28>

28행으로 무조건 점프

 

<+28>: cmp    DWORD PTR [ebp-0x8],0xfb46

ebp-0x8에 저장된 값과 0xfb46를 비교

 

<+35>: jle    0x501 <asm2+20>

0x4 < 0xfb46 이므로 20행으로 점프

(ebp-0x8에는 0x4가 저장)

 

※jle : 비교 결과 값이 0이거나 작을 경우 점프 (Operand 1 <= Operand 2)

 

<+20>: add    DWORD PTR [ebp-0x4],0x1

epb-0x4의 값에 0x1을 더한 뒤 ebp-0x4에 저장

-> 0x21 + 0x1


<+24>: add    DWORD PTR [ebp-0x8],0x74

ebp-0x8의 값에 0x74를 더한 뒤 ebp-0x8에 저장

-> 0x4 + 0x74


<+28>: cmp    DWORD PTR [ebp-0x8],0xfb46

다시 ebp-0x8에 저장된 값과 0xfb46를 비교

 

jle를 충족시키지 못하면 계속하여 20행과 24행을 반복

즉, jle를 충족시켜야 함

-> ebp-0x8에 저장된 값이 0xfb46보다 커져야 함

 

a = 0x21
b = 0x4

while b <= 0xfb46:
    a += 0x1
    b += 0x74

print(hex(a))

while문을 통해 0xfb46보다 커지면 hex값으로 변환하여 a를 출력

-> 0x24c

 

 

0x24