漏洞分析上学期期末考试题
Question 1: 缓冲区溢出1
Step 1: 在root下解压final.tar.gz文件
Step 2: 关闭地址随机化
Step 3: 查看q1是否为set-UID程序
Step 4: 尝试运行q1, 并查看q1.c内容
Step 5: 把shellcode放进环境变量MYSH
Step 6: 编写输出MYSH地址的文件getenvaddr.c, 并编译运行输出结果
获得环境变量MYSH的地址代码如下
编译原型,得到MYSH的地址为0XBFFFFA74
Step 7: 将MYSH地址写入, 并运行(由于地址偏移, 实际地址为0xbffffa80), 成功获得rootshell
如果环境变量名的长度和获得环境变量地址的代码文件名长度一致,地址不会发生偏移,由于此处MYSH和getenvaddr.c的长度相差6个字符,所以地址偏移量为6 * 2 = 12
Question 2: 格式化字符串
Step 1: 查看q2是否为set-UID程序
Step 2: 关闭地址随机化
Step 3: 尝试运行q2, 并查看q2.c内容
Step 4: 把shellcode放进环境变量QT
Step 5: 编写输出QT地址的文件g2.c, 并编译运行得到QT地址
g2.c内容如下
可以得知QT地址为0xbffffc4c
值得注意的是, 环境变量名要和获取地址的程序名长度一致,不然地址会发生偏移
Step 6: 使用objdump -R q2查看exit函数的地址,准备将其替换
可以得知exit的地址为0x0804a00c
Step 7: 查找printf参数在栈中的位置,找到对应字母ASCII码位置,并尝试将exit两个地址写入栈中
Step 8: 计算写入的位置,进行替换,成功获得rootshell
Question 3: 缓冲区溢出2
Step 1: 查看q3是否为set-UID程序
Step 2: 开启地址随机化
Step 3: 尝试运行q3, 并查看q3.c内容
Step 4: 反汇编查看vul函数的返回地址
可以得知vul函数的返回地址为0x0804851d
Step 5: 继续反汇编vul函数, 查看memcpy的地址,在该函数之后设断点,查看内存
之所要在memcpy函数之后设断点查看内存,原因在于,根据vul函数的代码可以知道,在执行memcpy(b, argv[2], j)时会溢出,导致j不满足if语句条件,所以需要在此处进行缓冲区溢出,查看内存,查找j的位置,使其满足条件
由上图可以知道,试探的AAAA距离vul函数返回地址0x0804851d的距离是65个字节,知道了ret的地址(0x0804851d)就可以找到ebp指针指向的地址,即0xbff38af8,且count的地址为0x0804a028
由上图的初步试探可知,j在距离AAAA起始地址52到56(134~144)
进一步反复试探,得知j的位置在距离AAAA起始地址52字节的位置
Step 6: 构造攻击语句,获得rootshell
由step 5可以知道,只需要将j(距离52字节)替换成满足if语句的58623(十六进制0xfc),且在rip的位置填count地址,使其跳转到esp,进而向下执行shellcode
Question 4: Return-to-libc
Step 1: 查看q4是否为set-UID程序,并关闭地址随机化