实验文件:https://download.csdn.net/download/qq_49712456/35501236
一、 实验目的
1)更好地从硬件层面理解程序调用过程
2)理解操作系统为实现程序安全提供的保护
3)完成实验后,能得到启发,写出更安全可靠的代码
二、 实验环境
1)获取权限
三、 实验过程
1)第一关第一问
利用缓冲区溢出,调用touch1
gdb attack
在getbuf函数处设置断点并运行程序
反汇编最顶层函数: test()
在第三行,test调用了getbuf函数
反汇编getbuf函数
第一行,getbuf开辟了0x28字节的空间,即40byte
但Gets函数读取没有限制,可以超过40byte
getbuf的返回地址为test
为了不让getbuf返回到test中,而返回到touch1
要将getbuf的返回地址用touch1的地址覆盖
字符串中要用40个字节占位置,再填入8字节的touch1地址
反汇编touch1
其开始地址为0x0000000008000894
填入地址时用小端法
退出程序
为避免遭遇段错误,先关闭操作系统的ASLR
sudo bash -c ‘echo 0 > /proc/sys/kernel/randomize_va_space’
运行后,通关
得到下一个的重要参数Cookie:383875107
2)第一关第二问
在 getbuf函数返回的时候,执行 touch2而不是返回 test
要求以正确的参数调用touch2,即要让输入参数val=cookie
注入新的代码,让touch2以为它接收到的参数是自己的 cookie
run程序后,反汇编touch2
第一行可得到touch2的首地址0x0000555555554acd
第三行得到cookie的存储地址,查看cookie的值
cookie的值取第一个数0x0000000016e17823
由此可得到攻击代码:
将rdi寄存器的值修改为cookie值,使输入参数val=cookie
将touch2的首地址传给一个寄存器,再将该值压入栈中
将该代码写入touch2.s文件,并汇编
得到其对应的二进制代码
将该二进制代码填入exploit.txt中
为了完全覆盖40字节地址,要将剩余位用0补满:
48 c7 c7 23 78 e1 16 49
b8 cd 4a 55 55 55 55 00
00 41 50 c3 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
函数返回到getbuf函数中,将返回地址改为getbuf的栈指针指向的地址
再getbuf处设置断点
单步运行到Gets函数处
可查看Gets函数开辟空间后栈指针rsp所指位置
rsp指针:0x7fffffffde10
用小端法将该地址输入到exploit.txt中,覆盖返回地址
运行后通过
3)第二关
无法插入指令执行,利用已有的指令进行攻击
调用touch2函数。即要把cookie压入%edi中再访问%rsp的值
用命令objdump -d attack查看所以函数
在0000000000000b20 <__libc_csu_init>中找到
b82: 41 5f pop %r15
从b83截断代码,就可以获得这个结果
将这个函数反汇编
取b83处的地址,即0x555555554b83
攻击代码:
前40字节覆盖开辟的空间
第六行是gdb调试后获得的b83处地址
第七行是cookie的值
第八行是touch2的地址
运行通过
四、 问题及反思
1)操作报错:
安装环境时,报错Unable to locate package lib32ncurses5
将apt-get install libncurses5改为apt-get install libncurses5-dev即可解决
2)子系统和kali虚拟机都无法运行第一关第二问和第二关
会报错
最后,借同学的电脑,用Ubuntu虚拟机完成实验