本篇文章是对CTF WIKI
Off-By-One
漏洞类型的补充. CTF WIKI
上面Off-By-One
这一章节中两个例子均没有给出相应的EXP
, 本次总结将其中一个例子详细分析一下, 希望能够对其他学习者有帮助
该程序是一个图书管理系统,可以添加书名,修改作者名以及写备注等功能.
1. Welcome
输入一个name
2. Create a book
3. Delete
4. Edit a book
5. Print book detail
6. Change current author name
7. Exit
1.b00k
结构体
程序运行, 创建一个结构体数组,设为b00ks
.
2.b00ks
位置
3.Null byte overflow
修改author
, 输入32
个字符,会出现空子节覆盖first b00k
指针最后一个字节
Off-By-One
顾名思义就是我们能够多写入一个字节的内容.
举一个简单的例子:建造一条直栅栏(即不围圈),长30米、每条栅栏柱间相隔3米,需要多少条栅栏柱?
最容易想到的答案是10
, 但正确答案是9
或11
. 这种错误是C语言初学者常犯的错误, 经常在数组或循环出现.
漏洞点: 问题出在对author
的处理上, 当我们输入32个字符时, 程序会将第33个字符赋值为"\x00"
, 从而出现了Null Byte Overflow
.

思路分析: 创建两个b00k
, 在first b00k
中伪造b00k
进而控制second b00k
的description
指针, 将该指针改为__free_hook
, 修改second b00k
的description
为execve("/bin/sh")
, 最后free
1. 创建第一个first b00k
结论: 当0x55f276c74160 --> 0x55f276c74100
时, 0x55f276c74100
正好落在first b00k
的description
中, 属于可控范围, 为我们伪造b00k
打下了基础.
2. 伪造b00k
结论: 可以看到0x55f276c74100
已经是fake b00k
3. 空字节覆盖
泄露的是second b00k
的name pointer
和description pointer
.
这个指针和libc base address是有直接联系的.
offset = 0x7f282b8e7010 - 0x00007f282b33e000 = 0x5a9010
结论: 通过伪造的b00k
, 我们泄露了 libc base address
.
4.获取相关指针
主要是两个
结论: 通过libc base address
, 退出了__free_hook
和execve_addr
在程序中的实际位置.
5.修改
通过first b00k
修改second b00k
的description
指针为__free_hook
, 在修改second b00k的description内容为execve("/bin/sh", null, environ)
, 最后执行free
结论: 由于__free_hook
里面的内容不为NULL
, 遂执行内容指向的指令, 即execve("/bin/sh", null, environ)
为什么第二个 b00k
申请的空间那么大?
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2018-4-20 19:25
被baolongshou编辑
,原因: 贴中有稍许错误