首页
社区
课程
招聘
0CTF 2018 BabyHeap
发表于: 2018-4-15 19:20 11488

0CTF 2018 BabyHeap

2018-4-15 19:20
11488

上周0CTF临危受命,就做出一道题, 感觉思路很新颖, 分享一下.

1. checksec

结论: 保护全开, 必是堆溢出之类的.
2. 结构体

3. 菜单

4. Allocate(可以申请最大0x58字节的内存)

5. Update(Off_By_One漏洞)

6. Delete

7. View

8. Exit

Off_By_One:Off_By_One是指我们能够多写入一个字节, 这种漏洞往往和对边界的长度验证不严格和字符串操作有关.
小栗子:

编译
gcc -g example.c -o example
运行

结论: 可以修改chunk size大小.

漏洞点: Update功能可以允许我们多输入一个字节.
我们需要解决如下问题

第一个问题

知识点: 当只有一个 small/large chunk 被释放时,small/large chunk 的 fd 和 bk 指向 main_arena 中的地址.

答: Overlap

相关内存

整体思路: 分配三个,0,1,2.通过Off_By_One可以将1chunk size改为0xa1, free(1)等于将1和2一起释放, 但标识着未释放.alloc(0x48)0x7f46a1c7cb78移到2中, 打印即可泄露地址.

第二个问题

fastbin attack, 在ralloc_hook写入execve("/bin/sh")来获取shell

通过上一个问题的回答, 我们有可能申请两个,这两个的content指向同一块内容.

结论: 由于fastbin是单链表链接的, 所以2的fd(下一个)指向了1, 我们可以任意修改这个地址, 来达到任意写的目的.

由于我们题目限制最大申请内存为88, 不能直接修改calloc__hook, 于是我们借助修改top chunk, 将top chunk 修改至calloc_hook附近, 然后再将execve("/bin/sh")地址填入calloc_hook.
修改: 

完整EXP

可能在尝试的过程中, EXP会出现失败的情况, 我建议多试几次

0CTF Babyheap 2018


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 1
支持
分享
最新回复 (3)
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
想问下one_offset是什么来得到
2018-4-17 11:20
0
雪    币: 4975
活跃值: (3848)
能力值: ( LV13,RANK:270 )
在线值:
发帖
回帖
粉丝
3
命令
one_gadget ./libc.so.6

结果
0x45216    execve("/bin/sh", rsp+0x30, environ)
constraints:
  rax == NULL

0x4526a    execve("/bin/sh", rsp+0x30, environ)
constraints:
  [rsp+0x30] == NULL

0xf02a4    execve("/bin/sh", rsp+0x50, environ)
constraints:
  [rsp+0x50] == NULL

0xf1147    execve("/bin/sh", rsp+0x70, environ)
constraints:
  [rsp+0x70] == NULL
2018-4-18 17:08
0
雪    币: 1689
活跃值: (178)
能力值: ( LV7,RANK:103 )
在线值:
发帖
回帖
粉丝
4
想请教下,在泄露libc的时候,delete(1)后再allocate,chunk2为什么会被放入unsordtedbin?
2018-10-19 15:28
0
游客
登录 | 注册 方可回帖
返回
//