2017-2018-2 20155315《网络对抗技术》Exp1:PC平台逆向破解
实验目的
- 本次实践的对象是一个名为pwn1的linux可执行文件。
- 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
- 该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。
实验内容
- 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
- 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
- 注入一个自己制作的shellcode并运行这段shellcode。
实验要求
- 熟悉Linux基本操作
- 理解Bof的原理
- 会使用gdb,vi
实验步骤
(一)直接修改程序机器指令,改变程序执行流程
- 知识要求:Call指令,EIP寄存器,指令跳转的偏移计算,补码,反汇编指令objdump,十六进制编辑工具
- 学习目标:理解可执行文件与机器指令
- 进阶:掌握ELF文件格式,掌握动态技术
思路
- 一个程序的可执行文件可通过
objdump命令对其进行反汇编,通过对汇编语言的学习可以看出程序读取数据的过程。

- 从反汇编的文件来看,main函数中调用foo函数,使用call指令。通过分析发现foo函数与getShell函数的首地址之间
存在偏移,两者之间相差了14。系统调用foo函数对应机器指令为e8 d7ffffff,则如果想调用getShell函数,就要对e8 d7ffffff进行修改。 - 已经知道电脑是小端模式,即数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中。因此,如果要修改,就要将"d7"改为"c3"。
- 具体操作过程:
- 将pwn1进行备份,修改备份文件
- 用vi打开备份文件,用
:%!xxd将显示模式切换为16进制模式 - 用
/d7查找要修改的内容,定位后将d7改为c3 - 用
:%!xxd -r将转换16进制为原格式,保存退出。
- 再次反汇编之后,确定已经将程序修改为调用getShell函数,接下来就是运行程序了。
- 运行时发现无法找到目录或文件,按照老师提供的教程进行操作就可以了。
运行截图

思考
运行成功之后就完成了实验的第一个部分,按照老师的指导一步步操作还算顺利。遇到的问题是,第一次在16进制模式修改完数据后出现操作失误,先保存后转换,在运行的时候导致文件损坏不可用。这是因为一开始保存的时候就改变了文件的格式,使得它不再是一个可执行文件的格式。查找资料后没有找到能将其再次转换的方法,只好重新进行实验。
参考资料
(二)通过构造输入参数,造成BOF攻击,改变程序执行流
- 知识要求:堆栈结构,返回地址
- 学习目标:理解攻击缓冲区的结果,掌握返回地址的获取
- 进阶:掌握ELF文件格式,掌握动态技术
思路
- 利用缓存区溢出进行攻击,是利用输入的数据将返回值进行覆盖。如果用getShell函数的地址进行覆盖,就会使程序调用getShell函数实现BOF攻击。
- 调用函数的时候,就会将函数的地址作为返回值压栈,即放入栈顶。字符串字节数足够大的时候就能覆盖返回值。
- 理清思路,使用gdb进行调试,弄清楚是哪几个字节会覆盖返回地址。

- 将“1234”替换为getShell函数的地址,即
0x0804847d。已经知道电脑是小端模式,输入的时候要注意使用正确的字节序。 - 同时,输入的时候要注意,我们是没办法直接输入ASCII码值为“0804847d"的字符,需要使用
perl命令先生成包括这样字符串的一个文件。
perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input
- 用
xxd input查看input文件的内容 - 后将input的输入,通过管道符“|”,作为输入。运行之后就进入了getShell函数,实验的第二部分就完成了。
运行截图


思考
- 已经确定了使用getShell的地址进行覆盖,要注意的是在输入地址的时候,只输入
0804847d不会被计算机识别为16进制值,要使用/x08/x04/x84/x7d - 关于Perl:Perl有很多命令行参数,通过它可以让你的程序更简练,并且可以写出很多只有一行命令的perl。
-e:用于在命令行而不是在脚本中执行 Perl 命令。- perl遵循正则表达式的标准。
- 尝试过用vim编辑器输入16进制,将其变为16进制编辑状态编辑后总会有错误,是因为无法同时改变ASCII码值与其对应的符号。
- 关于“|”管道:将第一条命令的结果作为第二条命令的参数来使用。用“;”区分两条命令,如果直接在命令行输入cat而不输入其余的任何东西,这时候的cat会等待标准输入。
(cat input; cat) | ./pwn1先运行程序,将input的内容作为输入显示在程序中,第二个cat就会等待标准输入,此时就可以输入shell命令了。
参考资料
(三)注入Shellcode并执行
- 准备一段Shellcode
- shellcode就是一段机器指令(code)
- 通常这段机器指令的目的是为获取一个交互式的shell(像linux的shell或类似windows下的cmd.exe),
所以这段机器指令被称为shellcode。 - 在实际的应用中,凡是用来注入的机器指令段都通称为shellcode,像添加一个用户、运行一条指令。
- 通常这段机器指令的目的是为获取一个交互式的shell(像linux的shell或类似windows下的cmd.exe),
思路
- 使用shellcode进行攻击,经过验证结构为:
anything+retaddr+nops+shellcode.nop一为是了填充,二是作为“着陆区/滑行区”,猜测返回地址只要落在任何一个nop上,自然会滑到我们的shellcode。 - 一开始没有关闭地址随机化,每一次操作esp的地址都会变化,因此实验的关键就是要关闭地址随机化。

- 之后使用gdb调试程序,使用
ps -ef | grep 文件名获取程序运行的PID,在gdb中对其进行追踪。查询esp寄存器的内容,并用x/16x查看其中的内容,看到01020304

- shellcode在retaddr之后,因此我们要插入的地址是
01020304地址加上0x04
运行截图

思考
一开始做实验的时候,没有认真思考shellcode的结构问题,再次打开虚拟机之后也没有关闭地址随机化,导致实验遇到了问题。重新开始之后,跟着老师的教程走来完成实验。其实确立了思路之后,重要的就是查命令来完成实验,对shellcode也不是很了解,还要继续学习。
参考资料
2017-2018-2 20155315《网络对抗技术》Exp1:PC平台逆向破解的更多相关文章
- 20155324《网络对抗》Exp1 PC平台逆向破解(5)M
20155324<网络对抗>Exp1 PC平台逆向破解(5)M 实验目标 本次实践的对象是一个名为~pwn1~的~linux~可执行文件. 该程序正常执行流程是:~main~调用~foo~ ...
- 20155232《网络对抗》 Exp1 PC平台逆向破解(5)M
20155232<网络对抗> Exp1 PC平台逆向破解(5)M 实验内容 (1).掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码(1分) (2)掌握反汇编与十六进制编程 ...
- 20155227《网络对抗》Exp1 PC平台逆向破解(5)M
20155227<网络对抗>Exp1 PC平台逆向破解(5)M 实验目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数 ...
- 2018-2019-2 20165236郭金涛《网络对抗》Exp1 PC平台逆向破解
2018-2019-2 20165236郭金涛<网络对抗>Exp1 PC平台逆向破解 一.实验内容 1.掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码(0.5分) 2.掌 ...
- 20155208徐子涵 《网络对抗》Exp1 PC平台逆向破解
20155208徐子涵 <网络对抗>Exp1 PC平台逆向破解 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数 ...
- 20145325张梓靖 《网络对抗技术》 PC平台逆向破解
20145325张梓靖 <网络对抗技术> PC平台逆向破解 学习任务 shellcode注入:shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对方的堆栈中,并 ...
- # 《网络对抗》Exp1 PC平台逆向破解20155337祁家伟
<网络对抗>Exp1 PC平台逆向破解20155337祁家伟 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会 ...
- 20145206邹京儒《网络对抗技术》 PC平台逆向破解
20145206邹京儒<网络对抗技术> PC平台逆向破解 注入shellcode并执行 一.准备一段shellcode 二.设置环境 具体在终端中输入如下: apt-cache searc ...
- 20145331魏澍琛 《网络对抗技术》 PC平台逆向破解
20145331魏澍琛 <网络对抗技术> PC平台逆向破解 学习任务 1.shellcode注入:shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对方的堆栈中 ...
- 20145336张子扬 《网络对抗技术》 PC平台逆向破解
#20145336张子扬 <网络对抗技术> PC平台逆向破解 ##Shellcode注入 **基础知识** Shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对 ...
随机推荐
- 初探diskstats
内核很多重要子系统均通过proc文件的方式,将自身的一些统计信息输出,方便最终用户查看各子系统的运行状态,这些统计信息被称为metrics. 直接查看metrics并不能获取到有用的信息,一般都是由特 ...
- vuejs electron webpack集成使用
传统的vue SPA页面在浏览器环境中使用,但是有的时候我们还希望能够做成一个类似于桌面的app在PC上使用,希望不仅可以使用所有的浏览器SPA的功能,你也可能外加host os的功能,比如文件的本地 ...
- Windows server 安装
运行管理员CMD --先切换到安装环境目录cd C:\Windows\Microsoft.NET\Framework\v4.0.30319 --安装服务 InstallUtil.exe D:\绝对路劲 ...
- Spring MVC 4常用的那些注解
Spring从2.5版本开始在编程中引入注解,用户可以使用@RequestMapping, @RequestParam, @ModelAttribute等等这样类似的注解.到目前为止,Spring的版 ...
- c# 托管和非托管的介绍
在.net 编程环境中,系统的资源分为托管资源和非托管资源. 对于托管的资源的回收工作,是不需要人工干预回收的,而且你也无法干预他们的回收,所能够做的 只是了解.net CLR如何做这些操作.也就是说 ...
- 深入理解python中的yield关键字
想必大家都看过这样的代码: 上面的这段代码会计算0-9的平方并打印出来. 那么问题来了,这段代码和我们要说的东西有什么区别呢? 这里的关键字,yield,我在前面的文章里已经发过了.那么yield是什 ...
- php常用算法和数据结构
</pre><pre name="code" class="php"><?php /** * Created by PhpStor ...
- Springboot 报application.properites文件找不到的解决方法
部署项目遇到了找不到application.properties的问题.网上搜了找不到答案,后面经过测试发现,问题在于clean了maven之后,target包还没删除,所以编译的时候才会出现 ...
- 个人作业2——集大通APP案例分析
个人作业2——集大通APP案例分析 产品:集大通 我认为这个是我们学校的APP,我们应该支持一下. 一.个人体验 1.下载并使用,描述最简单直观的个人第一次上手体验. ①界面美观,可以感受到丰富的校园 ...
- UE4中动画蒙太奇的合成
在游戏中的技能施法动作是可以通过软件合成的,笔者在这里介绍一种用UE4合成多个动画的操作. 在UE4中角色的动作可以由多种方式达成,一种是混合空间,例如角色的跑动和跳跃,其中的动作是由状态机控制的,原 ...