2018-2019-2 20164312 Exp1 PC平台逆向破解

1.逆向及Bof基础实践说明

1.1 实践目标

实验对象:一个名为pwn1的linux可执行文件。

实验流程:main调用foo函数,foo函数会简单回显任何用户输入的字符串。该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。

实验目标:想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。

三个实践内容如下:

  • 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
  • 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
  • 注入一个自己制作的shellcode并运行这段shellcode。
  • 这几种思路,基本代表现实情况中的攻击目标:
    • 运行原本不可访问的代码片段
    • 强行修改程序执行流
    • 以及注入运行任意代码

1.2 基础知识

  • 熟悉Linux基本操作
    • 能看懂常用指令,如管道(|),输入、输出重定向(>)等。
  • 理解Bof的原理。
    • 能看得懂汇编、机器指令、EIP、指令地址。
  • 会使用gdb,vi。
  • 指令参数:

    • 一些具体的问题可以边做边查,但最重要的思路、想法不能乱。
    • 要时刻知道,我是在做什么?现在在查什么数据?改什么数据?要改成什么样?每步操作都要单独实践验证,再一步步累加为最终结果。
  • 理解思路:

    • 看指导理解思路,然后抛开指导自己做。
    • 碰到问题才能学到知识。
    • 具体的指令可以回到指导中查。

2.直接修改程序机器指令,改变程序执行流程

  • 知识要求:

    • Call指令,EIP寄存器,指令跳转的偏移计算,补码,反汇编指令objdump,十六进制编辑工具

    • 学习目标:理解可执行文件与机器指令

    • 进阶:掌握ELF文件格式,掌握动态技术

2.1下载目标文件pwn1,反汇编。

将pwn1可执行文件复制到共享文件夹中,然后复制到kali的主目录中,重命名为4312,然后使用反汇编语言 objdump -d 4312 | more 对其进行反汇编,得到结果: 

  • "call 8048491 "是汇编指令
    • 是说这条指令将调用位于地址8048491处的foo函数;
    • 其对应机器指令为“e8 d7ffffff”,e8即跳转之意。
      • 本来正常流程,此时此刻EIP的值应该是下条指令的地址,即80484ba,但如一解释e8这条指令呢,CPU就会转而执行 “EIP + d7ffffff”这个位置的指令。“d7ffffff”是补码,表示-41,41=0x29,80484ba +d7ffffff= 80484ba-0x29正好是8048491这个值
  • main函数调用foo,对应机器指令为“ e8 d7ffffff”,

    • 那我们想让它调用getShell,只要修改“d7ffffff”为,"getShell-80484ba"对应的补码就行。
    • 用Windows计算器,直接 47d-4ba就能得到补码,是c3ffffff。
  • 下面我们就修改可执行文件,将其中的call指令的目标地址由d7ffffff变为c3ffffff。

2.2使用vi打开文件,找到应修改位置完成修改

输入 :%!xxd 将文件转为16进制编码显示:

找到e8d7然后将其修改为e8c3

完成修改,输入:wq存盘退出。

2.3参看文件修改情况并运行。

运行可执行文件test4312,发现程序能够调用shell,完成任务1。

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

知识要求:堆栈结构,返回地址

学习目标:理解攻击缓冲区的结果,掌握返回地址的获取

进阶:掌握ELF文件格式,掌握动态技术

3.1 反汇编,了解程序的基本功能

注意这个函数getShell,我们的目标是触发这个函数该可执行文件正常运行是调用如下函数foo,这个函数有Buffer overflow漏洞这里读入字符串,但系统只预留了4字节的缓冲区,

超出部分会造成溢出,我们的目标是覆盖返回地址 

3.2 确认输入字符串哪几个字符会覆盖到返回地址

输入info r 查看寄存器信息,通过查询ascll表,发现eip中存放数据为4567(3多输了一个),就可以立即判定哪四位会覆盖到返回地址。

3.3 确认用什么值来覆盖返回地址

getShell的内存地址,通过反汇编时可以看到,即0804847d。

接下来要确认下字节序,简单说是输入11111111222222223333333344444444\x08\x04\x84\x7d,还是输入11111111222222223333333344444444\x7d\x84\x04\x08。

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

4. 注入Shellcode并执行

 4.1准备一段Shellcode

  • shellcode就是一段机器指令(code)
    • 通常这段机器指令的目的是为获取一个交互式的shell(像linux的shell或类似windows下的cmd.exe),
    • 所以这段机器指令被称为shellcode。
    • 在实际的应用中,凡是用来注入的机器指令段都通称为shellcode,像添加一个用户、运行一条指令。

参考同学的文章Shellcode入门生成的shellcode。如下:

4.2 准备工作

修改些设置。这部分的解释请看第5小节Bof攻击防御技术.

 

安装execstack:

按实验进行配置:

4.3 构造要注入的payload。

  • Linux下有两种基本构造攻击buf的方法:
    • retaddr+nop+shellcode
    • nop+shellcode+retaddr。
  • 因为retaddr在缓冲区的位置是固定的,shellcode要不在它前面,要不在它后面。
  • 简单说缓冲区小就把shellcode放后边,缓冲区大就把shellcode放前边

按照retaddr+nop+shellcode模式进行注入:

 

在打开另外一个终端,用gdb来调试mxt4312这个文件:(需要先找到mxt4312执行的进程号)

通过info r esp 查看寄存器,找到01020304,即返回地址,shellcode就在该地址之后,因此,将\x4\x3\x2\x1改为\x90\xd3\xff\xff即可:

实验收获与感想:

这次的实验我不是在上课之前做的,在老师讲解之前我对这次实验可以说是毫无头绪,不知道该如何下手,上完课之后,我对该怎么实现有了大概的了解但是自己也没动手做,其实大部分的细节,我都不是很熟悉,比如说命令,实验顺序都不是很懂,对于为什么这么做也是一知半解,然后我就去博客看了很多别的同学的作业,进行一个比对,然后自己在虚拟机上先按照已经做好了的同学的步骤来做,当然这样很简单,但我也不是简单的抄代码,每输入一行代码,我都会对这一步骤进行思考,为什么这么做,在做完一遍之后,我终于对整个实验有了整体上的把握,并完成了本次实验的报告,除此之外,我还打算再多看几遍自己写的博客,做到对实验的每个步骤都聊熟于心,当然,这次实验我肯定是有所收获的,在基于基本的linux的基础上,我又对网络漏洞等有了新的了解,总的来说,自己动手做实验比看老师做实验更加重要,能让自己学到更多,而不是只懂理论,不会动手做的一知半解。

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

我觉得漏洞就是是计算机安全方面的缺陷,一个可执行文件中代码的不规范性或者说是不确定性,这些代码可能存在某些缺陷,在执行文件时可能会出现漏洞,针对程序设计缺陷,向程序输入缓冲区写入使之溢出的内容,从而破坏程序运行、趁着中断之际获取程序。用心不良的人会仔细研究你的代码,可能并且很可能会找到代中的漏洞,借助这些漏洞,黑客可以执行自己的代码,在你的电脑中植入后门或者病毒从而达到自己的目的。

猜你喜欢

转载自www.cnblogs.com/mxiaot/p/10522265.html