[CTF] PICOCTF2019

picoCTF 2019 – asm3

レ(゚∀゚;)ヘ=З=З=З 2023. 12. 29. 15:53
728x90

asm30xd2c26416, 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
→ ebpesp 값을 복사한다.

<+3>: xor eax, eax
→  같은 값인 eaxxor연산하기 때문에 결과가 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]에 해당하는 0x64ah에 복사한다.

더보기

※ ah, ax, al

<+8>: shl ax, 0x10
→  ax 비트를 왼쪽으로 0x10만큼 이동시킨다. 0x1010진수로 16이므로 16만큼 이동한다. 원래 0x6400이었는데, 16비트 이동시켰으니 ax0x0000이 된다.

<+12>: sub al, BYTE PTR [ebp+0xe]
→  al에서 [ebp+0xe]에 있는 값을 빼준 다음 다시 al에 저장한다. [ebp+0xe]e6 cf 51 f0 (f e d c)이므로 0xcf가 된다. eax0이었으므로 al 또한 0x0000이다.

al은 하위 8bit에 해당하는 값이므로 0x31al이 된다.

<+15>: add ah, BYTE PTR [ebp+0xf]
→  위에서 구한 0x00ah[ebp+0xf]에 해당하는 값을 더한 다음 다시 ah에 저장한다. [ebp+0xf]0xe6이다. 0x000xe6을 더하면 0xe6이 된다.

<+18>: xor ax, WORD PTR [ebp+0x12]
→  axah + al해준 값과 같으므로 0xe631이 된다. word ptr이므로 [epb+0x12]에서 2byte에 해당하는 값과 axxor연산을 해준다. [ebp+0x12]0xe544가 된다.

계산기를 통해 xor연산을 해주었더니 0x0375 나왔다.

<+22>: nop
<+23>: pop ebp
<+24>: ret
→  eax값인 0x0375return 된다.

flag값인 picoCTF{0x0375}을 구하였다.

 

'[CTF] PICOCTF2019' 카테고리의 다른 글

picoCTF 2019 - asm2  (0) 2023.12.29
picoCTF 2019 - asm1  (0) 2023.12.29