hitcon2014_stkof-unlink
unlink–只有add,free,edit
知识点
unlink修改free_got,利用puts_got,puts_plt
题目速览
经典堆菜单
add:
- 注意先加一,才记录地址
delete:
edit:
- 漏洞点,未对size检查
思路分析
- 本题目没有后门函数,所以需要我们泄露libc
- 开启了PIE,且只有free,add,edit函数可以使用,正常的uaf通过unsortedbin泄露main_arena肯定不行了
- 但是我们还有一个unlink,以前都是修改free_got为sysem,现在我们可以将free_got修改为puts_plt,然后调用free就相当于puts_plt,将puts_got写入chunk中,就可以得到libc地址了。
- 然后就是正常的修改free_got为system_plt,写入/bin/sh,然后free就getshell了
gdb调试
1.实现unlink
1 | s = 0x0602140 |
- bss中0x0602140是add函数中s的地址,也是存储chunk的地址,但是之前也说了,我们是先+1再储存chunk地址的,因此chunk1对应于s[1],也就是0x0602140+0x8
- unlink可以使当前储存chunk的地址指向target_addr-0x18,这样改的话会出现下面情况:
1 | s[2]- 0x18 |
2.修改free_got为puts_plt,泄露libc
1 | payload = flat( [ cyclic(0x10), free_got, puts_got] ) |
- 第一个payload:
修改chunk2,其实相当于修改 s-0x18地址的值,修改的是画框部分:
修改可以参考非栈上格式化字符串所说的A ->B ->C,修改A其实是修改C。
往下写0x10垃圾数据,然后填写free_got,puts_got,那么就会出现下面情况:
这里一定要记住got@plt会自动的指向plt表,也就是说,修改got表到A-B这样的地址结构的时候,会形成A->GOT@plt->plt,这样三地址结构,所以我们再次修改A地址为plt才会成功。
成功修改,然后free(2),2处存储的是puts_plt的地址。
3.修改free_got为system,然后getshell
1 | edit(1,0x8,p64(system)) |
- 没什么说的,和之前一样的。
- 标题: hitcon2014_stkof-unlink
- 作者: D0wnBe@t
- 创建于 : 2024-09-03 21:14:27
- 更新于 : 2024-09-05 10:08:44
- 链接: http://downbeat.top/2024/09/03/hitcon2014-stkof-unlink/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论