1.实践目标

本次实践的对象是一个名为pwn1的linux可执行文件。

该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。

该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。

2.实验内容

2.1 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。

  • 使用objdump -d pwn1 | more命令对实验给定的可执行文件进行反汇编操作,找到主函数位置并定位其调用foo函数的机器指令及相对地址如图:



    同时我们还可以在反汇编状态下看到getShell代码段的起始地址,接下来我们要做的就是把原可执行文件中的foo函数调用地址改为getShell函数的调用地址,那么怎么做呢?

  • 先用cp pwn1 pwn2拷贝命令把原文件辅助一份,以防出现不可逆修改还得导一份文件进来。vim编辑器打开pwn2来看看,它是个什么东东

  • 打开发现这文件中并没有人类可以看懂的语言,那么我们在编辑器命令行中敲入:%!xxd命令,以16进制代码的形式进行查看,然后利用查找工具/ + 查找信息找到我们刚才反汇编时主函数调用foo的位置,然后把它改成可以对应getShell函数的地址--->根据计算得出我们需要将d7ffffff改为c3ffffff

  • 改完了别忘了把16进制形式转换为原文本,使用:%!xxd -r然后:wq保存并退出编辑器

    先不运行程序,我们先来反汇编看看改的结果



    可以明确的看到原本的调用foo函数已经被我们修改为了调用getShell函数,现在我们运行一下看看会发生什么。

  • 就像是运行程序在其中打开了一个新的命令行一样,我们可以在这个命令行里做任何可进行的操作,比如秘密修改和查看其中的文件_!!当然这么简单的方法肯定是行不通的。

2.2 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。

  • 首先我们使用gdb调试运行程序,然后在调试状态下输入r使得程序运行,然后我们输入一串相对有规律的字符串如图:

  • 图中我输入的是八个1,八个2,八个3,七个4和数字1到8然后在调试状态下输入info r显示各个寄存器状态,这时我们可以看到由于输入字符串大于缓冲区,导致eip也就是返回地址指针位置的值已经改变了,而当前的0x35343332正好是数字5 4 3 2的ASCII码,对照我们我们输入的字符串,正好是第33到37个数字的位置正好可以覆盖程序中的返回地址,也就是说我们把这几位替换为getShell函数的对应地址就可以完成前面的操作了。
  • 根据前面使用反汇编看到的结果,我们知道getShell的地址为0x0804847d,然后我们只需要把这一串十六进制码前面填充32个任意字符再输入到foo函数里就可以了,但是这时我们会发现,程序执行时是没办法输入十六进制数的,所以我们需要构造一个文件放 入这些东西,然后把文件中的内容输入到程序里,这时我们用到了一个脚本语言perl,输入以下命令
perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input

将代码和填充数据保存到一个名为input的文件中,利用cat命令和|管道执 行程序就可以得到和第一种方法一样的结果。

2.3 注入一个自己制作的shellcode并运行这段shellcode

2.3.1 Shellcode简介

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

在老师的实验指导中给出了一段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\

2.3.2 准备工作

进行如图所示设置,营造攻击环境:

2.3.2 构造攻击buf

根据前面实验的结果我们知道覆盖源程序缓冲区需要的字符个数为32个,而第33到37个字节正好可以覆盖到返回地址的位置上。这样我们就可以构造一个攻击buf输入到源程序中,使得源程序返回地址变为我们注入Shellcode代码位置,我们就可以达到攻击目的,那应该怎么做呢?

综上我们可以构造如下格式的buf:

anything + retaddr + nops + shellcode

注:anything为32字节的任意字符,用于填充源程序中的smilbuf

retaddr为跳转到shellcode代码的地址

nops为任意个空字符,可以作为滑行区,当retaddr中的代码使程序跳转到任意个空字符上时,都可以一直滑行到我们注入的Shellcode的位置,并执行

Shellcode为我们注入的攻击代码,该实验中是打开被攻击计算机的命令行

那么如何确定返回地址位置的值到底应该是多少呢?我们可以进行以下操作来确定:

  1. 先根据上述结构构造buf,我们构造的buf为:
A(32个)+ 1234 + nop(4个) + Shellcode
  1. 使用perl脚本生成攻击buf的文件,文件名为input_Shellcode

  1. 开启两个命令行,在一个命令行中输入
(cat input_Shellcode;cat) | ./pwn1

也就是以文件input_Shellcode的内容作为pwn1程序运行的输入,然后在另一个命令行中输入

ps -ef | grep pwn1

查询出pwn1程序运行时所使用的进程号

然后开启gdb调试,并使用attach定位程序

  1. 设置断点,查看注入buf的内存地址
  • 先反汇编foo函数,在函数执行结束处设置断点,然后cContinuing让程序继续执行到断点处,然后我们输入info r查看寄存器状态, 可以看到esp中保存的指针值,然后用x/16x + 指针值来查看其中的数据,如图:

  • 可以发现这个位置保存的正好是我们构造buf中的1234的ASCII码,再往后看就能看到我们的Shellcode代码,这样的话我们只需要把1234这个位置的代码改成后面任意一个nop的地址就可以完成攻击了。

  • 由上图可以看到eip寄存器中保存数据的地址,该地址中保存的是第一个字节的值,所以想要跳转到任意一个nop需要在这个地址的基础上再加4。

  • 修改之后再运行就可以看到我们的想要的效果了。







3.需要掌握的内容

3.1.掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码

  • NOP指令:“空指令”。执行到NOP指令时,CPU什么也不做,仅仅当做一个指令执行过去并继续执行NOP后面的一条指令。
  • JNE指令:条件转移指令,如果不相等则跳转。
  • JE指令:条件转移指令,如果相等则跳转。
  • JMP指令:无条件跳转指令。无条件跳转指令可转到内存中任何程序段。转移地址可在指令中给出,也可以在寄存器中给出,或在存储器中指出。
  • CMP指令:比较指令,功能相当于减法指令,只是对操作数之间运算比较,不保存结果。cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。

3.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信息,还显示他们对应的十六进制文件代码

十六进制编辑器主要使用Linux的文本编辑器vim,可以在文档中输入:%!xxd:%!xxd -r来进行十六进制的转换和恢复。

4. 实验总结

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

4.1.1 什么是漏洞:

  1. 漏洞即某个程序(包括操作系统)在设计时未考虑周全,当程序遇到一个看似合理,但实际无法处理的问题时,引发的不可预见的错误。系统漏洞又称安全缺陷,对用户造成的不良后果如下所述:

  2. 如漏洞被恶意用户利用,会造成信息泄漏,如黑客攻击网站即利用网络服务器操作系统的漏洞。

  3. 对用户操作造成不便,如不明原因的死机和丢失文件等。

4.1.2 为什么会存在漏洞:

漏洞的产生大致有三个原因,具体如下所述:

  1. 编程人员的人为因素,在程序编写过程,为实现不可告人的目的,在程序代码的隐蔽处保留后门。

  2. 受编程人员的能力、经验和当时安全技术所限,在程序中难免会有不足之处,轻则影响程序效率,重则导致非授权用户的权限提升。

  3. 由于硬件原因,使编程人员无法弥补硬件的漏洞,从而使硬件的问题通过软件表现。

4.1.3 总结

当然,Windows漏洞层出不穷也有其客观原因,即任何事物都非十全十美,作为应用于桌面的操作系统——Windows也是如此,且由于其在桌面操作系统的垄断地位,使其存在的问题会很快暴露。此外和Linux等开放源码的操作系统相比,Windows属于暗箱操作,普通用户无法获取源代码,因此安全问题均由微软自身解决。

4.2. 实验收获与感想

通过本次实验让我在一个新的层次上理解了网络攻击的流程,在具体的实验操作中实现了简单的缓冲区溢出攻击,在感叹它的神奇之处的同时也增长了网络安全方面的知识,感觉收获颇丰。

2018-2019-2 网络对抗技术 20162329 Exp1 PC平台逆向破解的更多相关文章

  1. 20165221 《网络对抗技术》EXP1 PC平台逆向破解

    20165221 <网络对抗技术>EXP1 PC平台逆向破解 一.实验内容 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函 ...

  2. 2018-2019-2 网络对抗技术 20165325 Exp1 PC平台逆向破解

    2018-2019-2 网络对抗技术 20165325 Exp1 PC平台逆向破解(BOF实验) 实验有三个模块: (一)直接修改程序机器指令,改变程序执行流程: (二)通过构造输入参数,造成BOF攻 ...

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

    - 2018-2019-2 20165206<网络对抗技术>Exp1 PC平台逆向破解 - 实验任务 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:mai ...

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

    2018-2019-2 20165317<网络对抗技术>Exp1 PC平台逆向破解 实验目的 掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码 NOP:无作用,英文&quo ...

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

    2018-2019-2 网络对抗技术 20165336 Exp1 PC平台逆向破解 1. 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件.该程序正常 ...

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

    2018-2019-2 网络对抗技术 20165305 Exp1 PC平台逆向破解 实验1-1直接修改程序机器指令,改变程序执行流程 先输入objdump -d 20165305pwn2查看反汇编代码 ...

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

    2018-2019-2 <网络对抗技术> Exp1 PC平台逆向破解 20165215 目录 知识点描述 实验步骤 (一)直接修改程序机器指令,改变程序执行流程 (二)通过构造输入参数,造 ...

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

    2018-2019-2 20165316 <网络对抗技术>Exp1 PC平台逆向破解 1 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件 ...

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

    <网络对抗技术>Exp1 PC平台逆向破解之"逆向及Bof基础实践说明" Week3 一. 实验预习 1.什么是漏洞?漏洞有什么危害? 漏洞就是在计算机硬件.软件.协议 ...

随机推荐

  1. Linux VPS通过安装CPULimit来限制CPU使用率

    说明:我们手上经常有很多廉价的VPS,有时候使用某些软件应用的时候,会出现CPU跑满的情况,而长时间跑满会被VPS商家停掉,所以这里我们需要想办法来限制进程CPU使用率,这里就说个教程. 简介 cpu ...

  2. 理解 YOLO

    YOLO: 1. YOLO的网络结构 YOLO v1 network (没看懂论文上的下图,看下面这个表一目了然了) 24层的卷积层,开始用前面20层来training, 图片是224x224的,然后 ...

  3. kaldi通用底层矩阵运算库——CUDA

    cudamatrix/cublas-wrappers.h 该头文件对cuBLAS的接口进行了简单的封装(函数名的简化和部分kaldi函数的封装). 比如 cublasSgemm_v2封装为cublas ...

  4. error: No rule to make target '/usr/lib/libOpenNI.so', needed by 'bin/euroc_rectify'。 停止。

    这类问题的出现说明程序在编译时,CMakeLists.txt 文件没有找到OpenNI.so, 即 Pangolin库未安装或破损. 重新安装pangolin库即可.(亲测)

  5. git本机服务器配置(二):TortoiseGit的安装

    1. 下载TortoiseGit https://tortoisegit.org/ 1.1 下载安装包 下载对应安装包,如果不知道自己该下载哪个,那就下载32位的. 1.2 下载语言包 下载和安装包相 ...

  6. [Kubernetes]浅谈容器网络

    Veth Pair 这部分内容主要介绍一个设备: Veth Pair . 作为一个容器,它可以声明直接使用宿主机的网络栈,即:不开启 Network Namespace .在这种情况下,这个容器启动后 ...

  7. go语言使用xpath

    1.导包 gopm get -g -v github.com/lestrrat-go/libxml2 2.使用示例 func ExampleHTML() { res, err := http.Get( ...

  8. 迭代和JDB

    迭代和JDB 使用C(n,m)=C(n-1,m-1)+C(n-1,m)公式进行递归编程实现求组合数C(m,n)的功能. 源代码 public class Combination { public st ...

  9. delphi

    其实现在哪里还有delphi,我之所以建立这个分类,只是为了纪念它,纪念我使用了一年delphi的经历. 那个年代c#刚出道,delphi还是c/s编程届数一数二的人物.但是没想到,这么快被c#打败了 ...

  10. 015_ICMP专项研究监控

    一.数据demo cat /proc/net/snmp Ip: Forwarding DefaultTTL InReceives InHdrErrors InAddrErrors ForwDatagr ...