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

学到的新知识总结

  • 管道:符号为| 前一个进程的输出直接作为后一个进程的输入
  • 输出重定向:符号为> 将内容定向输入到文件中
  • perl:一门解释性语言,不需要预编译,直接在命令行中使用。常与输出重定向">"将生成的字符串存储到文件input中。
  • xxd:16进制查看命令
  • objdump:反汇编

实验过程

1、修改机器指令,改变程序执行流程

  • 首先将目标文件pwn1进行反汇编,能够看到相关的汇编代码。
    2018-2019-2 网络对抗技术 20165320 Exp1 PC平台逆向破解

  • 其中main函数中有一条call指令,后面原本接的是foo函数的起始地址

  • 为了能让程序在执行时直接跳到shellcode,我们需要修改调用foo函数时的机器指令,只要修改“d7ffffff”为,"getShell-80484ba"对应的补码就行。如下图所示
    2018-2019-2 网络对抗技术 20165320 Exp1 PC平台逆向破解

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

  • 执行结果如下:
    2018-2019-2 网络对抗技术 20165320 Exp1 PC平台逆向破解

2、通过构造输入参数,造成BOF攻击

  • 这种攻击主要是通过缓冲区的数据溢出导致原函数的返回地址被Shellcode的起始地址所覆盖。

  • 首先我们需要对程序进行GDB调试,查看输入的字符串到第几个字节会发生溢出。(小端机器)
    2018-2019-2 网络对抗技术 20165320 Exp1 PC平台逆向破解

  • 然后构造一个输入,将Shellcode代码的地址覆盖到相应的位置。这时需要用到perl指令。如图
    2018-2019-2 网络对抗技术 20165320 Exp1 PC平台逆向破解

  • 执行结果如下:

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

3、注入Shellcode并执行

  • 准备工作如下:

    • 设置堆栈可执行 execstack -s 设置堆栈可执行

    • execstack -q 查询文件的堆栈是否可执行

    • 关闭地址随机化

      more /proc/sys/kernel/randomize_va_space 2

      echo "0" > /proc/sys/kernel/randomize_va_space

      more /proc/sys/kernel/randomize_va_space 0

  • 常用的构造攻击buf的方法

    • retaddr+nop+shellcode (缓冲区小)

    • nop+shellcode+retaddr (缓冲区大)

  • 实验首先类似上一个实验构造一个输入,然后用gdb进行调试,对foo函数进行反汇编,在ret指令处设置断点,等待程序继续运行时查看ESP中的值。(一开始按照老师的教程走了一遍,发现原来还有坑,心塞)
    2018-2019-2 网络对抗技术 20165320 Exp1 PC平台逆向破解

  • ESP的值+4就是Shellcode的地址,再将其写入一开始的攻击buf,执行程序就能攻击成功。
    2018-2019-2 网络对抗技术 20165320 Exp1 PC平台逆向破解

4、老师问题

  • 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指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。 

  • 实验感想

    • 我觉得这次实验对于我来说还是挺难的吧,第三个实验的细节还有待琢磨,虽然能按照步骤达成最终的目的,但是得把过程细化,理清思路才行。堆栈的结构还有地址的存储还有待加强理解。
上一篇:20+功能强大的jQuery/CSS3图片特效插件


下一篇:基于.net搭建热插拔式web框架(实现原理)