实验二:格式化字符串漏洞实验
实验原理:格式化字符串漏洞是由像 printf(user_input) 这样的代码引起的,其中 user_input 是用户输入的数据,具有 Set-UID root 权限的这类程序在运行的时候,printf 语句将会变得非常危险,因为它可能会导致下面的结果:
• 使得程序崩溃
• 任意一块内存读取数据
• 修改任意一块内存里的数据
最后一种结果是非常危险的,因为它允许用户修改 set-UID root 程序内部变量的值,从而改变这些程序的行为
实验过程
一、找出secret[1]的值
1、在/home/shiyanlou/目录下新建vul_prog.c文件(wget
http://labfile.oss.aliyuncs.com/courses/228/vul_prog.c)
2、编译vul_prog.c并关闭栈保护
3、运行vul_prog去定位int_input的位置,确认%s在格式字符串中的位置为第8个
4、输入secret[1]的地址,转换为十进制后为6299668,将第八个位置的字符串替换为%s,则打印出secret[1]的值,U的ascii码为55
二、修改secret[1]的值为1000
1、输入secret[1]的地址,转换为十进制后为6299668,将第八个位置的字符串替换为%n,则将secret[1]的值修改为了0x77。%n将前面的字符数存储到变量中,7个地址共有7*16个字符,再加上7个逗号则有119个字符,即0x77.
2、用格式化字符填充将secret[1]的值改为十进制的1000,%.897u表示填充897个字符
三、修改secret[0]的值
1、在vul_prog.c中删去与int_input相关的语句
2、在终端中关闭地址随机化选项,使每次运行程序得到的secret地址不变
3、在/home/shiyanlou目录下新建程序write_string.c
4、编译vul_prog.c和write_string.c
5、先运行vul_prog,再运行write_string生成mystring文件
6、输入./vul_prog < mystring
则我们将secret[0]的值由0x44改成了0x8c