20145319 逆向与Bof实验

1 实验内容

  • 本次实验以可执行文件pwn1为例,将对pwn1进行反汇编的基础上进行功能上的解读,并进行缓冲区溢出攻击
  • 可执行文件pwn1的正常流程是主函数调用foo函数完成字符串的录入和对录入字符串的重复输出,我们首先通过修改文件pwn1使其跳过foo函数转而执行getshell函数
  • 利用其对于缓冲区溢出漏洞进行攻击,通过调整输入字符串来覆盖原有返回地址,使程序执行我们想要其执行的函数getshell

2 实验步骤

  • 首先对于目标文件进行反汇编处理,输入命令objdump -d mypwn | more可以看到结果如下
  • 忽略掉其中与功能无关的部分,将整个反汇编代码浏览一遍,我们可以发现这个代码主要分成三部分,主函数,以及两个子函数foo子函数getShell
  • 首先从主函数的汇编代码来看,这个函数的功能十分简单,其中call 8048491就是调用函数foo,之后程序结束
  • 之后我们来看看函数foo的汇编代码部分,该函数实现了字符串的录入功能,其中汇编代码sub $0x38,%esp就是为字符串所预留出的寄存器空间,但是在不对缓冲区进行保护的情况下,我们就可以通过录入过长的字符串,而覆盖掉本在堆栈中的返回地址,从而达到我们想要实现的目的,实现缓冲区溢出攻击
  • 之后开始修改可执行文件中的机器码,让其可以按照我们想要的结果来运行,首先我们可以将主函数中call指令中的地址修改为getShell代码段地址,来看看getShell函数功能,用vim编辑器十六进制打开,并找到我们想修改的部分(详见所附操作指令)
  • 之后我们开始尝试进行缓冲区溢出攻击,来使程序达成同样的效果
  • 输入一串长字符串,直到程序反馈寄存器错误
  • 由反馈的结果来看eip中的地址已经变成了0x39393939即被四个9所覆盖,我们就需要调节我们所录入的字符串,并且观察到底是字符串中的哪几位覆盖住了返回地址即可
  • 由上一步我们可以基本可以确定覆盖住返回地址的四位字符正是字符串中的3456四位
  • 之后我们需要将字符串中的3456四位修改成getshell的内存地址0804847d,由上几步我们大致可以确定在计算机内部的字节顺序,注意修改字节顺序后我们只需将其新的字符串键入即可
  • 因为键盘上无法直接键入\x7d等十六进制数,因此我们先将其重定向至文件input中,之后通过管道将input文件中的内容作为输入来运行程序

3 shellcode注入

  • 我们可以通过写c语言程序或者直接写汇编程序两种方式来获得我们的shellcode,这里我们采用第二种方式
  • 首先编写shellcode的汇编代码
  • 之后通过反汇编得到其机器码组成,将其中的机器码摘出来就是我们需要使用的部分了
  • 首先做好准备工作,为了防止此类攻击,如今的计算机操作系统已经增加了许多保护措施,例如保护堆栈,使堆栈不可执行,又例如每一次生成代码的堆栈地址随机,来使得我们无法通过多次尝试来搜寻准确的返回地址,所以我们在准备阶段我们将这些保护功能都关闭(如果execstack显示command not found可以尝试apt-get install prelink
  • 构造注入字符串一般有两种策略,一是retaddr+nop+shellcode二是nop+shellcode+retaddr我们先把retaddr用数字5319来代替
  • 之后我们将文件执行挂在后台,打开另一个终端查看当前进程的进程号对其进行跟踪
  • 使用断点调试,观察注入的shellcode的地址所在
  • 观察可以看出shellcode的地址应该就是0xffffd330之后的一段区间,所以将返回地址修改成这段区间中的数值即可,修改后写入即可看到最后注入成功

4 其他

  • vim相关

    • %!xxd将文件显示变为十六进制模式
    • %!xxd -r将十六机制模式转回原格式
      • 在命令行模式下输入/即为查找,例如搜寻我们想要找到的e8 d7段,只需输入/e8 d7
    • 将文件转成十六进制模式下修改后要转回原格式才进行保存
  • 其他
    • Perl是一门解释型语言,不需要预编译,可以在命令行上直接使用

20145319 《网络对抗》逆向与Bof基础的更多相关文章

  1. 网络对抗实验一 逆向及Bof基础实践

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

  2. 20145203盖泽双 《网络对抗技术》实践1—— MAL_逆向与Bof基础

    20145203盖泽双 <网络对抗技术> MAL_逆向与Bof基础 实践目标 (1)我们要通过修改程序代码,使得程序运行其自身中本不该运行的代码片段. (2)在这里,我们有一个名为2014 ...

  3. 20155201 李卓雯 《网络对抗技术》实验一 逆向及Bof基础

    20155201 李卓雯 <网络对抗技术>实验一 逆向及Bof基础 一.实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,f ...

  4. 20145308 《网络对抗》 逆向及BOF基础实践 学习总结

    20145308 <网络对抗> 逆向及BOF基础实践 学习总结 实践目的 通过两种方法,实现程序能够运行原本并不会被运行的代码 实践原理 利用foo函数的Bof漏洞,构造一个攻击输入字符串 ...

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

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

  6. 20155305乔磊《网络对抗》逆向及Bof基础

    20155305乔磊<网络对抗>逆向及Bof基础 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何 ...

  7. 20155311高梓云《网络对抗》逆向及Bof基础

    20155311高梓云<网络对抗>逆向及Bof基础 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任 ...

  8. 20155334 曹翔 《网络对抗》逆向及Bof基础

    20155334 曹翔 <网络对抗>逆向及Bof基础 实践目标: 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回 ...

  9. 20145215卢肖明《网络对抗》逆向及Bof基础

    20145215卢肖明<网络对抗>逆向及Bof基础 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任 ...

  10. 20145206邹京儒《网络对抗》逆向及Bof基础实践

    20145206邹京儒<网络对抗>逆向及Bof基础实践 1 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:ma ...

随机推荐

  1. 演示PostgreSQL的详细安装及配置图解

    右击文件选择以管理员身份运行 2 开始执行程序的安装 3 设置安装目录 4 设置数据的保存目录 5 设置数据库管理员密码,请牢记此密码. 6 设置端口号,选择默认的端口号即可 7 根据自己选择设置地区 ...

  2. vux版本升级

    一开始用的笨办法, 先卸载npm uninstall vux --save; 然后在安装npm install vux --save;  卸载的还是蛮快的,安装是在下班的时候,让电脑待机2个小时,第二 ...

  3. PHP 的异常处理、错误的抛出及回调函数等面向对象的错误处理方法

    PHP 的异常处理.错误的抛出及回调函数等面向对象的错误处理方法: http://www.jb51.net/article/32498.htm http://www.cnblogs.com/hongf ...

  4. 1.执行环境判断 window 或 self

    window or self ? 在 underscore 的判断所处环境的代码中,似乎我们没有看到 window 对象的引用,其实,在浏览器环境下,self 保存的就是当前 window 对象的引用 ...

  5. IE各浏览器HACK

    border:2px solid #00f; /*IE.ff的属性*/ border:2px solid #090\9; /* IE6/7/8的属性 */ border:2px solid #F90\ ...

  6. 08.Curator缓存

        可以利用ZooKeeper在集群的各个节点之间缓存数据.每个节点都可以得到最新的缓存的数据.Curator提供了三种类型的缓存方式:Path Cache,Node Cache 和Tree Ca ...

  7. Jenkins之pipeline流水线配置

    使用gitlab监听事件一旦git push自动部署 使用构建后操作 配置完用户构建前一步会自动构建下一个项目 pipeline插件 新建视图 点击run运行

  8. Centos6.5安装JDK环境

    1,系统版本查看 2,下载jdk1.8 wget http://download.oracle.com/otn-pub/java/jdk/8u144-b01/090f390dda5b47b9b721c ...

  9. FZU 2105 Digits Count

     Problem 2105 Digits Count Accept: 444    Submit: 2139 Time Limit: 10000 mSec    Memory Limit : 2621 ...

  10. 分区默认segment大小变化(64k—>8M)

    _partition_large_extents和_index_partition_large_extents 参考: http://www.xifenfei.com/2013/08/%E5%88%8 ...