2018-2019-2 《网络对抗技术》Exp1 PC平台逆向破解 Week2 20165115

EXP1 PC平台逆向破解 20165115 张承昱

一 实践目标

1、实验背景

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

2、实验内容

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

二、实验步骤

1、实验内容一

具体步骤


预备知识要求:

Call指令,EIP寄存器,指令跳转的偏移计算,补码,反汇编指令objdump,十六进制编辑工具

首先进入pwn1文件所在的文件夹,将pwn1备份为pwn20165115-1。然后输入objunmp -d pwn20165115 | more指令将pwn20165115-1进行反汇编,然后找到main函数当中的foo函数。如果想要实现我们想让main函数不跳转到foo函数只需要修改call后面的地址。

使用vim编辑器对pwn20165115-1文件进行编辑

通过:%!xxd指令转化为16进制显示,使用/d7命令查找我们需要修改的机器指令的位置,然后将d7修改为c3。

然后使用:%!xxd -r转换到ASCII码模式,保存并退回终端页面。再次反汇编查看机器指令和汇编指令,已经可以看到call的返回指令已经转变,说明修改成功。

此时通过./pwn20165115-1指令运行文件即可成功获取shell。

实验步骤2

具体步骤


预备知识要求:

BOF攻击的相关知识

该攻击的原理是向缓冲区中填入过多的数据,超出边界从而导致数据外溢,覆盖相邻的存储空间。所以可以利用缓冲区溢出攻击实现改写数据、改变程序执行流程干扰系统运行、破坏系统完全性、任意执行恶意代码等攻击操作。原理示意图如下:

函数调用的过程中有三个步骤,分别为:
prologue:保存当前的栈基址(ebp)
call:调用参数和返回地址(eip)压栈,跳转到函数入口
return:恢复调用者原有栈
本实验利用的是foo函数的BOF漏洞,在执行foo函数时构造一个超出buff大小的字符串将堆栈中的返回地址构造成我们需要的地址即可实现出发getshell函数。

首先还是备份pwn1文件为pwn20165115-2。进入gdb对文件进行调试,输入r执行,随意输入40个字符,可以发现终端显示了Segmentation fault,表示出现了错误的0x31313131 in ?? ()表示改地址并不存在。

通过对函数地址进行计算可以得出缓冲区总共的大小,因为我们不能直接使用键盘输入\x7d\x84\x04\x08这样的16进制值,所以我们就需要一个包含这些十六进制数的文件。具体操作如图所示:

其中,perl -d 'print "11111111222222223333333344444444\x7d\x84\x04\x08x0a"' > input为创建十六进制文件的指令。上图中已经攻击成功。

实验步骤三

具体操作

预备知识

Linux下有两种基本构造攻击buf的方法:
retaddr+nop+shellcode
nop+shellcode+retaddr。
因为retaddr在缓冲区的位置是固定的,shellcode要不在它前面,要不在它后面。
简单说缓冲区小就把shellcode放后边,缓冲区大就把shellcode放前边

然后进行堆栈可执行的设置:
apt-get install execstack//安装execstack
execstack -s pwn20165115_3 //设置堆栈可执行
execstack -q pwn20165115_3 //查询文件的堆栈是否可执行

此外,需要关闭地址随机化,否则每次操作esp的地址都会发生变化,这会非常麻烦。输入相关指令echo "0" > /proc/sys/kernel/randomize_va_space关闭。

然后继续构造shellcode,构造方法与上一个实验步骤相似。

perl -e 'print "A" x 32;print "\x4\x3\x2\x1\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_shellcode

然后在终端运行(cat input_shellcode;cat) | ./pwn20165115-3,然后代开一个新的终端页面,查询运行的文件的端口号(5128)

进入gdb对该端口进行测试。输入指令disassenmbl foo进行反汇编查看具体的指令地址并设置断点。然后在另一窗口回车,回到gdb的窗口c指令continue。最后就是输入info r esp查看栈底位置。

然后就跳入了老师在教程中挖的坑。嗯,很巧妙。正确的找寻地址的方式是在找到的地址上+4。






实验收获与感想

虽然大学三年以来已经做过很多很多各式各样的实验,但这一次的实验内容还是让我有一种更前所未有的新鲜感。因为相较于其他课程的实验,网络对抗课上的实验内容具体化、工具化更加明显。以本次实验为例,虽然这次实验的操作在实际的操作中会面临很多的局限性,但shellcode在运用原理上就是这样的使用方式。举一个不太恰当的例子,大多数课程就是展示给你一个锤子,实验就是让你重复单调的使用这个锤子;而运用性实用性抢的实验则是告诉你锤子大致上的作用,然后让你去构造这个锤子。至于锤子具体的使用方式则是在你自己造出锤子之后就顺理成章的掌握的东西。这就是这次实验课给我的感触。

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

漏洞是受限制的计算机、组件、应用程序或其他联机资源的无意中留下的不受保护的入口点。一般是因为黑客的攻击或者使用者刻意寻找而被发现。漏洞的存在让病毒和黑客攻击有了可乘之机,并且会对计算机拥有者个人信息、财产安全等造成极大的威胁。

posted @ 2019-03-17 11:38  20165115  阅读(139)  评论(0编辑  收藏  举报