格式化字符串漏洞实验
作业信息
|这个作业属于哪个课程|<[格式化字符串漏洞实验]https://www.lanqiao.cn/courses/228/learning/?id=734)>|
|-- |-- |
|这个作业要求在哪里|<第十一周作业](https://edu.cnblogs.com/campus/besti/2020-2021-1LKPA/homework/11269>|
|这个作业的目标|<练习安全类实验>|
|作业正文|... https://www.cnblogs.com/assignment/p/14146283.html |
目录
一、实验原理
- 目标:我们需要得到一段数据的内存地址,但我们无法修改代码,供我们使用的只有格式字符串。
- 方法:
1.定位:利用printf 函数获取目标地址
2.获取目标值,最大的挑战:使用四个 %x 来移动 printf 函数的栈指针到目标位置,使用 %s 来目标地址的值(因为是将其作为字符串来处理,所以会一直打印到结束符为止)
3.修改目标值:利用%n和%.目标数字u,计算所需的字符数
4.利用文件输入目标地址,避免ASILL码转换问题
二、 实验 1 修改secret[1]为期望值
攻击程序
1.新建vul_prog.c文件
在/home/shiyanlou/目录下,新建vul_prog.c文件,输入以下代码内容:
2.编译
可以添加以下参数关掉栈保护
gcc -z execstack -fno-stack-protector -o vul_prog vul_prog.c
3.增加权限
sudo chmod u+s vul_prog
找出 secret[1]的值
1.定位目标地址
运行 vul_prog 程序去定位 int_input 的位置,这样就确认了 %s 在格式字符串中的位置。
2.更改攻击程序
输入 secret[1] 的地址,记得做进制转换,同时在格式字符串中加入 %s
3.修改目标地址的值
修改secret[1]为期望值
三、实验 2 使用文件实现特殊字符的输入
1.修改攻击程序
vul_prog.c
程序
现在让我们把第一个 scanf 语句去掉,并去掉与 int_input 变量相关的所有语句
2.设置关闭地址随机化选项:
sudo sysctl -w kernel.randomize_va_space=0