20145218PC平台逆向破解
20145218PC平台逆向破解
实践目标
本次实践的对象是一个名为pwn1的linux可执行文件。
- 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
- 该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。
我们将学习两种方法
- 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
- 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
这几种思路,基本代表现实情况中的攻击目标
- 运行原本不可访问的代码片段
- 强行修改程序执行流
- 注入运行任意代码。
实践要求
- 掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码(1分)
- 掌握反汇编与十六进制编程器 (1分)
- 能正确修改机器指令改变程序执行流程(1分)
- 能正确构造payload进行bof攻击(2分)
- Optional:进阶,shellcode编程与注入
基础知识
汇编指令
- NOP:NOP指令即“空指令”,在x86的CPU中机器码为0x90(144)。执行到NOP指令时,CPU什么也不做,仅仅当做一个指令执行过去并继续执行NOP后面的一条指令。可以用于破解程序的call验证。
- JNE:条件转移指令,如果不相等则跳转,机器码75。
- JE:条件转移指令,如果相等则跳转,机器码74。
- JMP:无条件转移指令。段内直接短转Jmp short(机器码:EB)段内直接近转移Jmp near(机器码:E9)段内间接转移Jmp word(机器码:FF)段间直接(远)转移Jmp far(机器码:EA)
- CMP:比较指令,功能相当于减法指令,只是对操作数之间运算比较,不保存结果。cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。
- CALL:将下一条指令的所在地址入栈,并将子程序的起始地址送入PC(于是CPU的下一条指令就会转去执行子程序)。
Linux指令
objdump -d test:反汇编testinfo r:查看寄存器%!xxd:查看二进制文件
反汇编了解程序基本功能
- 输入指令
objdump -d 20145218 | more 找到该程序的关键函数,如下图所示:

- foo函数功能:将用户输入的字符再次在屏幕上显示出来。
- getshell函数功能:打开一个可用Shell。
main函数中调用了foo函数。
第一种方法——直接修改机器指令
- 我们如果想要用到shell功能,就要使main函数不调用foo函数,而是调用getshell函数,这一点我们可以通过直接修改机器指令做到。
- 找到与调用foo函数有关的机器指令,由图可得,
call 8048491是汇编指令,即,将调用位于地址8048491处的foo函数;对应机器指令为e8 d7ffffff,所以我们要将机器指令中foo函数的物理地址改为getshell函数的。 - 由汇编指令及其对应的机器指令,我们可得:
0xd7ffffff+0x80484ba = 0x8048491
即:call机器码 = 跳转地址 - call指令的下一个eip所以可以算出调用getshell函数的机器码为e8 c3ffffff,所以我们只要将d7修改为c3即可。
具体步骤
我们可以先运行一下原文件,看一下foo函数功能,如下图所示:

- 然后输入
vi 20145218,查看可执行文件20145218 进入后发现是乱码,输入
%! xxd查看十六进制表示:


- 输入
/e8 d7查找需要改动的地方,按i进入文本编辑模式,改为e8 c3:


- 输入
%! xxd -r,退出16进制模式(若不退回到乱码模式,运行文件会报错) - 输入
:wq!,保存并退出。 - 这时我们再运行文件,结果如下图所示:

第二种方法——通过构造输入参数造成bof攻击改编程序执行流
通过观察foo函数的汇编代码,我们可以发现其存在BOF漏洞,但并不知道需要输入多少字符才会造成BOF,所以我们一个字节一个字节的输入,不断尝试,观察程序什么时候崩溃,即出现
Segmentation fault字样。

- 使用gdb调试,看什么时候可以覆盖寄存器%eip的值,且要让程序调用完foo函数后再调用getshell函数。(%eip寄存器就是保存下一条指令的内存地址)
gdb 20145218,进入gdb调试info r,查看溢出时寄存器状态如下,尤其观察%eip的值:

再次调试查看是哪个字符被覆盖到了eip中:

- 我们可以发现,“1234”覆盖了其新的eip,所以我们只需要将getshell的内存地址替换这4个字符,getShell的内存地址是0804847d,替换后即,简单说是输入11111111222222223333333344444444\x7d\x84\x04\x08(低字节在高位)
- 因为无法通过键盘输入\x7d\x84\x04\x08这样的16进制值,所以先生成包括这样字符串的一个文件,
perl -e 'print "12345678123456781234567812345678\x7d\x84\x04\x08\x0a"' > input(\0a代表回车键) (cat input; cat) | ./20145218,将input文件作为输入:

20145218PC平台逆向破解的更多相关文章
- 20165223《网络对抗技术》Exp1 PC平台逆向破解
目录--PC平台逆向破解 1 逆向及BOF基础实践说明 1.1 实践内容 1.2 实践要求 1.3 基础知识 2 实验步骤 2.1 直接修改程序机器指令,改变程序执行流程 2.2 通过构造输入参数,造 ...
- 20155324《网络对抗》Exp1 PC平台逆向破解(5)M
20155324<网络对抗>Exp1 PC平台逆向破解(5)M 实验目标 本次实践的对象是一个名为~pwn1~的~linux~可执行文件. 该程序正常执行流程是:~main~调用~foo~ ...
- 2018-2019-2 20165237《网络攻防技术》Exp1 PC平台逆向破解
2018-2019-2 20165237<网络攻防技术>Exp1 PC平台逆向破解 一.实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调 ...
- 2018-2019-2 20165234 《网络对抗技术》 Exp1 PC平台逆向破解
实验一 PC平台逆向破解 实验目的 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序同时包含另 ...
- 20165221 《网络对抗技术》EXP1 PC平台逆向破解
20165221 <网络对抗技术>EXP1 PC平台逆向破解 一.实验内容 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函 ...
- 2018-2019-2 网络对抗技术 20165325 Exp1 PC平台逆向破解
2018-2019-2 网络对抗技术 20165325 Exp1 PC平台逆向破解(BOF实验) 实验有三个模块: (一)直接修改程序机器指令,改变程序执行流程: (二)通过构造输入参数,造成BOF攻 ...
- 2018-2019-2 20165206《网络对抗技术》Exp1 PC平台逆向破解
- 2018-2019-2 20165206<网络对抗技术>Exp1 PC平台逆向破解 - 实验任务 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:mai ...
- Exp1 PC平台逆向破解 20165235 祁瑛
Exp1 PC平台逆向破解 20165235 祁瑛 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件.该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字 ...
- 2018-2019-2 20165317《网络对抗技术》Exp1 PC平台逆向破解
2018-2019-2 20165317<网络对抗技术>Exp1 PC平台逆向破解 实验目的 掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码 NOP:无作用,英文&quo ...
随机推荐
- nginx config的多个config配置
在我们的一台服务器上,一个nginx服务器下面可能跑着许多许多的项目; 那么就需要配置多个对应的配置 端口号 已经文件入库目录等等 那么项目多了以后,把这些项目都写到一个文件里 到后期难以查看与管理 ...
- Java课程设计——坦克大战
坦克大战——坦克类 一. 团队课程设计博客链接 https://www.cnblogs.com/chenhuilin/p/10275664.html 二.个人负责模块和任务说明 模块:坦克类(玩家坦克 ...
- 【转】Jmeter分布式部署文档
很多时候,我们测试时,如果进行大数据量的并发测试时,单个电脑的CPU和内存可能无法承受,这个时候,我们需要进行一个分布式的测试,比如10000个并发,使用三台电脑来进行并发,Jmeter提供了这种功能 ...
- 全文检索引擎Solr系列——整合中文分词组件IKAnalyzer
IK Analyzer是一款结合了词典和文法分析算法的中文分词组件,基于字符串匹配,支持用户词典扩展定义,支持细粒度和智能切分,比如: 张三说的确实在理 智能分词的结果是: 张三 | 说的 | 确实 ...
- Lua文件操作和串行化
function n_serialize(data) if type(data)=="number" then io.write(data,"\n") else ...
- CSS JQuyer 元素选择
$(this) 当前 HTML 元素 $("p") 所有 <p> 元素 $("p.intro") 所有 class="intro" ...
- ffmpeg-URL(转)
ffmpeg中为方便对资源进行访问,定义了两个结构体,URLContext中是对具体资源文件进行操作的上下文,URLProtocol则是在将资源进行分类的基础上,对某一类资源操作的函数集,熟悉Linu ...
- Oracle行转列LISTAGG函数
工作过程中需要将查询的数据分组并显示在一行.以往的工作经验,在sql server中可以用for xml path来实现. 现提供Oracle数据库的行转列方式 oracle11g官方文档简介如下: ...
- 最长上升子序列(LIS)
最长递增子序列,Longest Increasing Subsequence 下面我们简记为 LIS.排序+LCS算法 以及 DP算法就忽略了,这两个太容易理解了. 假设存在一个序列d[1..9] = ...
- bash shell笔记1 脚本基础知识
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://twentyfour.blog.51cto.com/945260/505644 * ...