20145328 《网络对抗技术》逆向及Bof基础实践
20145328 《网络对抗技术》逆向及Bof基础实践
实践内容
- 本次实践的对象是一个名为pwn1的linux可执行文件。
- 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
- 该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。
实践方法
- 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
- 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
其实我们还可以做的更多,比如说注入一个自己制作的shellcode并运行这段shellcode。
- 这几种思路,基本代表现实情况中的攻击目标
- (1)运行原本不可访问的代码片段
- (2)强行修改程序执行流
- (3)以及注入运行任意代码。
实践要求
1. 掌握NOP,JNE,JE,JMP,CMP汇编指令的机器码
2. 掌握反汇编与十六进制编程器
3. 能正确修改机器指令改变程序执行流程
4. 能正确构造payload进行bof攻击
5. Optional:进阶,Shellcode编程与注入
实践基础知识
- (1)NOP指令即“空指令”(机器码:90)。执行到NOP指令时,CPU什么也不做,仅仅当做一个指令执行过去并继续执行NOP后面的一条指令。所以NOP指令自然也会占用执行一个指令的CPU时间片。
- (2)JNE是一个条件转移指令(机器码:75)。当ZF=0,转至标号处执行。
- (3)JE是一个条件转移指令(机器码:74)。如果相等则跳转。
- (4)JMP是无条件转移指令。段内直接短转Jmp short(机器码:EB)段内直接近转移Jmp near(机器码:E9)段内间接转移Jmp word(机器码:FF)段间直接(远)转移Jmp far(机器码:EA)
- (5)CMP为比较指令,功能相当于减法指令,只是对操作数之间运算比较,不保存结果(机器码:39)。cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。
实践过程
方法一 直接修改可执行文件的机器指令
键入指令
objdump -d pwnx | more
找到程序关键函数(即去除运行所添加的各种库函数),
getShell
,foo
,main
:从图中可以看出该程序正常运行顺序是从main函数入口开始进行执行,而后调用foo函数,并没有对getShell函数进行调用,而我们可以通过修改main函数中call指令来将原本程序对于foo函数的调用改为对getShell函数的调用。
首先我们要了解call指令是通过修改eip寄存器的值来实现对于函数的调用的,因为eip寄存器永远指向下一条指令的地址,call指令的汇编代码与机器指令间的关系为
0x8048491 = 0x80484ba + 0xd7ffffff
,其中0x80484ba
是原本下一条指令的地址,0x8048491
为经过call指令修改后下一条指令的地址,机器指令中的e8
是call指令的机器码因此想要调用getShell,只要修改
d7ffffff
为,getShell-80484ba
对应的补码c3ffffff
就行了。接下来输入
vi pwnx
打开可执行文件pwnx;输入
:%!xxd
将文件转换成16进制显示输入
/e8 d7
搜索查询需要修改的机器码位置,锁定位置后按i
进入插入模式进行将e8 d7
修改为e8 c3
输入
:%!xxd -r
取消16进制显示,并输入:wq
对文件的修改进行保存并退出(注:若不退出16进制显示直接保存,运行文件会出错)再次使用反汇编指令
objdump -d pwnx | more
进行查看键入
./pwnx
查看运行结果
方法二 通过构造输入参数,造成BOF攻击,改变程序执行流
第一步依旧是输入反汇编指令
objdump -d pwn1 | more
进行分析,内容同上第二步,确认输入字符串中哪几个字符会覆盖到返回地址
- 输入指令
gdb pwn1
调试程序, - 如果输入字符串2014532822222222333333334444444412345678,那 1234 那四个数最终会覆盖到堆栈上的返回地址,进而CPU会尝试运行这个位置的代码。那只要把这四个字符替换为 getShell 的内存地址,输给pwn1,pwn1就会运行getShell。
- 输入指令
第三步,确认用什么值来覆盖返回地址
- getShell的内存地址,在未启用ALSR的主机上是固定不变的,通过反汇编时可以看到,即
0x804847d
。接下来要确认下字节序,简单说是输入11111111222222223333333344444444\x08\x04\x84\x7d
,还是输入11111111222222223333333344444444\x7d\x84\x04\x08
。 - 对比之前
eip 0x34333231 0x34333231
,正确应用输入11111111222222223333333344444444\x7d\x84\x04\x08
。
- getShell的内存地址,在未启用ALSR的主机上是固定不变的,通过反汇编时可以看到,即
第四步,构造输入字符串
- 由为我们没法通过键盘输入
\x7d\x84\x04\x08
这样的16进制值,所以先生成包括这样字符串的一个文件。\x0a
表示回车,如果没有的话,在程序运行时就需要手工按一下回车键。 - 利用Perl构建input文件进行输入,键入指令
perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input
- 使用16进制查看指令xxd查看input文件的内容是否如预期
- 然后将input的输入,通过管道符“|”,作为pwn1的输入。
- 由为我们没法通过键盘输入
实践总结
- 通过本次实践,算是基本掌握了逆向与BOF的一些基础的操作以及思路,在指导书中老师的步骤给的非常详细,仔细阅读并按步骤执行下来不仅可以完成预期的实践结果还可以在这个过程中学到不少东西,之前虽然对BOF攻击有所了解,但并没有真正的上手实践并成功过,能通过这一次的两种不同方式达到了获取Shell的结果,还是很开心的。美中不足的是没有完成ShellCode的练习,这一部分的内容准备在接下来的半周时间内研究学习实践一下_。
20145328 《网络对抗技术》逆向及Bof基础实践的更多相关文章
- 20145304 网络对抗技术 逆向与Bof基础
20145304 网络对抗技术 逆向与Bof基础 实践目标 学习以下两种方法,运行正常情况下不会被运行的代码: 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数. 利用foo函数的 ...
- 20145317 网络对抗技术 逆向与Bof基础
20145317 网络对抗技术 逆向与Bof基础 实践要求 1. 掌握NOP,JNE,JE,JMP,CMP汇编指令的机器码 2. 掌握反汇编与十六进制编程器 3. 能正确修改机器指令改变程序执行流程 ...
- 20145312《网络对抗》 逆向及Bof基础实践
20145312 <网络对抗> 逆向及Bof基础实践 1 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:mai ...
- 20145308 《网络对抗》 逆向及BOF基础实践 学习总结
20145308 <网络对抗> 逆向及BOF基础实践 学习总结 实践目的 通过两种方法,实现程序能够运行原本并不会被运行的代码 实践原理 利用foo函数的Bof漏洞,构造一个攻击输入字符串 ...
- 20145206邹京儒《网络对抗》逆向及Bof基础实践
20145206邹京儒<网络对抗>逆向及Bof基础实践 1 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:ma ...
- 20145216《网络对抗》逆向及BOF基础实践
20145216<网络对抗>逆向及BOF基础实践 1 逆向及Bof基础实践说明 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件.该程序正常执行流程是:main调用foo函 ...
- 20145327 《网络对抗》逆向及BOF基础实践
20145327 <网络对抗>逆向及BOF基础实践 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任 ...
- 20145204《网络对抗》逆向及bof基础实践
20145204<网络对抗>逆向及bof基础实践 实践目的说明 实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何 ...
- 20145208蔡野 《网络对抗》逆向及BOF基础实践
20145208蔡野 <网络对抗>逆向及BOF基础实践 逆向及Bof基础实践 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函 ...
- 《网络对抗》——逆向及Bof基础实践
<网络对抗>--逆向及Bof基础实践 原理 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数. 手工修改可执行文件,改变程序执行流程,直接跳转到g ...
随机推荐
- 《转》python学习(7) -列表
转自 http://www.cnblogs.com/BeginMan/p/3153842.html 一.序列类型操作符 1.切片[]和[:] 2.成员关系操作符(in ,not in ) 1: s1 ...
- webpack----entry
入口文件下对象的键值,不多说,上图: 其实app就等同于name,于是乎 dist下的index.html中引入的js,就是: <script type="text/javascrip ...
- 【黑金ZYNQ7000系列原创视频教程】05.FPGA和ARM的初次结合——LED实验
黑金论坛地址: http://www.heijin.org/forum.php?mod=viewthread&tid=36639&extra=page%3D1 爱奇艺地址: http: ...
- redis数据持久化(快照/日志):
1.RDB快照的配置选项: save // 900内,有1条写入,则产生快照 save // 如果300秒内有1000次写入,则产生快照 save // 如果60秒内有10000次写入,则产生快照 ( ...
- nginx配置文件内容详情及基本属性配置
Nginx的配置文件nginx.conf配置详解如下: user nginx nginx ; Nginx用户及组:用户 组.window下不指定 worker_processes 8; 工作进程:数目 ...
- loadrunner多场景的串行执行以及定时执行
方法一: 既然是脚本串行执行,那在场景设计中必然是要用多个脚本,要注意的是需要将Scenario Schedule中的Schedule by设置为Group的模式.然后按实际需要依次设置每个脚本的Sc ...
- PHP新版本变化
世界变化真快,突然听闻 PHP 都到 7.3 版本了,7.2 还没仔细了解过呢.看到我司面试时会问到php新版本有什么特性,美名其曰考察其学习新技术的能力,我有点汗颜,自己都没有主动去了解过,实在不应 ...
- centos7修改网卡名、密码重置
修改网卡名称 编辑 /etc/sysconfig/grub 倒数第二行quiet 后加入 net.ifnames=0 biosdevname=0 执行 grub2-mkconfig -o /bo ...
- pandas 取消读取csv时默认第一行为列名
读取时默认第一行为列名 此时DataFrame的列名为第一行数据: 因为第一行为有效数据,故不可作为列名,要么重新起列名,要么使用默认序列列名: 取消默认第一行为列名 给 pd.read_csv() ...
- Elasticsearch入门教程
ElasticSearch是一个高度可扩展的开源搜索引擎并使用REST API,所以您值得拥有. 在本教程中,将介绍开始使用ElasticSearch的一些主要概念. 下载并运行ElasticSear ...