20145204《网络对抗》逆向及bof基础实践

20145204《网络对抗》逆向及bof基础实践

实践目的说明

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

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

  • 该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。

  • 实践一是直接修改程序机器指令,改变程序执行流程。

  • 实践二的目标是利用foo函数中的Bof漏洞,触发getshell代码运行。

  • 实践三的目标是构造shellcode,实现缓冲区溢出攻击。

实践一

知识要求:

1.反汇编指令:objdump;
2.十六进制编辑工具(wxhexeditor);
3.vi下显示模式转化为16进制指令:%!xxd;
4.Call指令执行后,EIP寄存器,指令跳转的偏移计算方法:EIP(after)=EIP(befor)+x(未知数)。

按照老师给出的步骤call指令的目标地址由d7ffffff变为c3ffffff。

以下是实验结果:

实践二

如下图所示:

我们需要构造数据填充缓冲区直到覆盖ebp和返回地址的数据。

1、刚开始构造的时候,字符串长度不够,看图中ebp覆盖了两个字节的数据36(6的ascii码),eip没有变化。如下图

2、增加长度,使得eip值改变为:0x373737(7的ascii)码。

3、确定返回地址被覆盖的位置。eip的值为36353433,即为3456这四个数字的位置。

4、在确定内存地址的格式后,构造输入字符串。得到最终结果如下:

实践三

知识要求:

shellcode:指溢出后执行的能开启系统shell的代码。但是在缓冲区溢出攻击时,也可以将整个触发缓冲区溢出攻击过程的代码统称为shellcode,因此可以将shellcode分为以下4个部分:

1、核心shellcode代码,包含了攻击者要执行的所有代码。

2、触发shellcode的溢出地址。

3、填充物,填充未使用的缓冲区,一般使用nop指令填充——0x90表示。

4、结束符号0,对于符号串shellcode需要用0结尾,避免溢出时字符串异常。

5、linux下有两种构造shellcode的方法:retaddr+nop+shellcode;nop+shellcode+retaddr。


实践过程:

按照要求设置基本环境后开始(其中shellcode直接用的老师代码):

尝试第一种构造shellcode方法:retaddr+nop+shellcode

1、在一个终端中构造shellcode,并在终端中注入这段攻击(其中“x4x3x2x1”处是即将要填的shellcode起始地址),如下图所示:

2、打开另一个终端,查看./pwn进程的ID号,并进行gdb调试,如下图所示,可以看到ret地址是0x080484ae(ret后就会跳到即将要覆盖的返回地址的位置处):

3、开始在0x080484ae处设置断点,并不断向前查看地址知道找到shellcode起始地址,最终找到shellcode起始地址为0xffffd2e0(0xffffd2dc+4)。

4、将构造的shellcode中“x4x3x2x1”改为“0xffffd2e0”,结果不成功。

尝试第二种构造方法:anything+retaddr+nops+shellcode。

1、如下图“x4x3x2x1”处是即将要覆盖的shellcode返回地址为:0xffffd300。

2、构造shellcode:perl -e 'print "A" x 32;print "x00xd3xffxffx90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90xe0xd2xffxffx00"' > input_shellcode

最终成功。如下图:

参考资料

原文地址:https://www.cnblogs.com/yayaer/p/6476742.html