asm3은 0xd2c26416, 0xe6cf51f0, 0xe54409d5가 인자일 때 return값을 구하는 문제이다.
<주어진 코드>
asm3:
<+0>: push ebp
<+1>: mov ebp,esp
<+3>: xor eax,eax
<+5>: mov ah,BYTE PTR [ebp+0x9]
<+8>: shl ax,0x10
<+12>: sub al,BYTE PTR [ebp+0xe]
<+15>: add ah,BYTE PTR [ebp+0xf]
<+18>: xor ax,WORD PTR [ebp+0x12]
<+22>: nop
<+23>: pop ebp
<+24>: ret
<+0>: push ebp
<+1>: mov ebp, esp
→ ebp에 esp 값을 복사한다.
<+3>: xor eax, eax
→ 같은 값인 eax를 xor연산하기 때문에 결과가 0이 되고, eax값이 0이 된다.
<+5>: mov ah, BYTE PTR [ebp+0x9]
→ [ebp+0x8]에 0xd2c26416이 저장되어있다. 리틀 엔디안 방식으로 저장되므로 16이 [ebp+0x8]에, 64가 [ebp+0x9], c2가 [ebp+0xa], d2가 [ebp+0xb]에 저장된다. 이 중 [ebp+0x9]에 해당하는 0x64를 ah에 복사한다.
※ ah, ax, al
<+8>: shl ax, 0x10
→ ax 비트를 왼쪽으로 0x10만큼 이동시킨다. 0x10은 10진수로 16이므로 16만큼 이동한다. 원래 0x6400이었는데, 16비트 이동시켰으니 ax는 0x0000이 된다.
<+12>: sub al, BYTE PTR [ebp+0xe]
→ al에서 [ebp+0xe]에 있는 값을 빼준 다음 다시 al에 저장한다. [ebp+0xe]는 e6 cf 51 f0 (f e d c)이므로 0xcf가 된다. eax가 0이었으므로 al 또한 0x0000이다.
al은 하위 8bit에 해당하는 값이므로 0x31이 al이 된다.
<+15>: add ah, BYTE PTR [ebp+0xf]
→ 위에서 구한 0x00인 ah에 [ebp+0xf]에 해당하는 값을 더한 다음 다시 ah에 저장한다. [ebp+0xf]는 0xe6이다. 0x00과 0xe6을 더하면 0xe6이 된다.
<+18>: xor ax, WORD PTR [ebp+0x12]
→ ax는 ah + al해준 값과 같으므로 0xe631이 된다. word ptr이므로 [epb+0x12]에서 2byte에 해당하는 값과 ax를 xor연산을 해준다. [ebp+0x12]은 0xe544가 된다.
계산기를 통해 xor연산을 해주었더니 0x0375가 나왔다.
<+22>: nop
<+23>: pop ebp
<+24>: ret
→ eax값인 0x0375가 return 된다.
flag값인 picoCTF{0x0375}을 구하였다.
'[CTF] PICOCTF2019' 카테고리의 다른 글
picoCTF 2019 - asm2 (0) | 2023.12.29 |
---|---|
picoCTF 2019 - asm1 (0) | 2023.12.29 |