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


    学到的新知识总结

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

    实验过程

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

    • 首先将目标文件pwn1进行反汇编,能够看到相关的汇编代码。

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

    • 为了能让程序在执行时直接跳到shellcode,我们需要修改调用foo函数时的机器指令,只要修改“d7ffffff”为,"getShell-80484ba"对应的补码就行。如下图所示

    • 执行结果如下:

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

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

    • 首先我们需要对程序进行GDB调试,查看输入的字符串到第几个字节会发生溢出。(小端机器)

    • 然后构造一个输入,将Shellcode代码的地址覆盖到相应的位置。这时需要用到perl指令。如图

    • 执行结果如下:

    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中的值。(一开始按照老师的教程走了一遍,发现原来还有坑,心塞)

    • ESP的值+4就是Shellcode的地址,再将其写入一开始的攻击buf,执行程序就能攻击成功。

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

    • 实验感想

      • 我觉得这次实验对于我来说还是挺难的吧,第三个实验的细节还有待琢磨,虽然能按照步骤达成最终的目的,但是得把过程细化,理清思路才行。堆栈的结构还有地址的存储还有待加强理解。
  • 相关阅读:
    结构-行为-样式-有趣的函数
    结构-行为-样式-angularJs笔记
    Js-Html 前端系列--页面撑开头尾
    Java 实现下载
    Js-Html 前端系列--Ajax
    Js-Html 前端系列--checkbox
    Nutz中过滤特殊字符
    NUTZ中处理系统未捕获异常
    Thymeleaf 笔记
    Json 使用小结
  • 原文地址:https://www.cnblogs.com/Gst-Paul/p/10538950.html
Copyright © 2020-2023  润新知