20145205 《网络攻防》第一次实验

逆向及BOF基础实践

实践目标

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

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

  • 该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。

  • 根据老师给的实验指导,本次实践共使用两种方法

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

实践原理

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

  • 因为对于可执行文件来说,本质上讲还是也是通过机器语言与计算机进行交互,本方法是直接对于该文件进行程序机器指令进行修改,对其在之前对应返回值进行修改,让返回值直接跳转到我们所需要的位置。

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

  • 方法二其实就是上个学期有提及的缓冲区溢出攻击,因为对于有些没有设防的缓冲区来说,如果一次输入的指令超过了缓冲区的有效负载,那么便出现了缓冲区溢出,溢出的数据就会对其他本该是别的程序参数的位置进行挤占,我们实践就是在确认到溢出的数据的哪几位将会挤占本该是call函数返回的值的内存空间地址,然后我们在输入数据时将需要的返回值写在溢出位上,之后在次执行程序就可以完成函数的跳转。

实践过程

方法一

1.在我们先将pwn1文件复制后,对复制的文件进行反汇编

2.在反汇编后,我们可以看到mian函数在正常情况下是将会调用foo函数,所以我们找到了我们的修改值,然后就是进行修改

3.我们在使用VI打开文件后开始时因为不是16进制显示的文件格式,所以是一堆乱码,输入:%!xxd讲文件格式显示方式转变成16进制,然后使用/e8 d7(注意中间的空格)找到我们需要修改的地方

4.将需要修改的部分进行修改后保存文件并退出

5.此时我们重新对于文件进行反汇编,就可以发现成果的修改了call函数的调用函数

方法二

1.重新对于文件pwn1进行备份
2.使用gdb进行调试,输入一串感觉足够长的数字,开始对于具体哪几位是溢出位进行测试,并观察各个寄存器的值,此时eip寄存器中的值为0x35353535,即5555ASCII码。eip寄存器的值是保存程序下一步所要执行指令的地址,此处我们可以看出本来应返回到foo函数的返回地址已被5555覆盖

3.之后我们测试一下是哪几位的对于eip内进行了覆盖,重新输入数字,但是将八个5,换位数字不相同的1~8,进行测试。根据eip的值我们发现是1234这四位覆盖了eip内原本的返回值,所以我们只需将1234这四位上输入可以返回到getShell的对应的返回值,那么便完成了实践目的。

4.但是我们还需得知机器字节序存储所采取的方式,所以在输入字符串的地方0x804847d处设置断点,查其eip 0x804847d 0x804847d,可以发现是大端模式。


5.由为我们没法通过键盘输入\x7d\x84\x04\x08这样的16进制值,所以提前生成包括这样字符串的一个文件。\x0a表示回车,如果没有的话,在程序运行时就需要手工按一下回车键。

6.用“xxd input”检查是否操作成功;最后将input的输入,通过管道符“|”,作为pwn1的输入,执行得到结果

实践感想

对于本次的实验,其实预防来说早已经被前人实现,一般情况下我们都无法直接获得权限去修改可执行文件,而且缓冲区溢出只需对于缓冲区定义明确即可,就可以杜绝类似的攻击,但是本次确实让我们了解到了一些十分有用的知识,对于一些程序如若我们想对于加以修改并应用一些自己的添加的代码,就使用方法一对其某个阶段的返回值进行修改,然后达到我们的目的。

posted @ 2017-02-28 16:01  20145205武钰  阅读(261)  评论(0编辑  收藏  举报