• 20155318 Exp1 PC平台逆向破解(5)M


    20155318 Exp1 PC平台逆向破解(5)M

    实践目标

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

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

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

    实践内容

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

    实践思路

    • 运行原本不可访问的代码片段
    • 强行修改程序执行流
    • 以及注入运行任意代码。

    汇编知识

    机器指令

    指令 机器码 功能
    NOP 90 空指令,继续执行NOP后面的一条指令
    JNE 75 条件转移指令,不等则跳转
    JE 74 条件转移指令,相等则跳转
    JMP / 无条件转移指令,short(机器码:EB)段内直接近转移Jmp;near(机器码:E9)段内间接转移Jmp;word(机器码:FF)段间直接(远)转移Jmp;far(机器码:EA)
    CMP 39 比较指令,相当于减法指令,对操作数之间运算比较,不保存结果

    常用汇编指令

    • 反汇编:objdump -d XX
    • 进入十六进制编辑模式::%!xxd
    • 查询:/
    • 调试:gdb XXX
    • 切回原模式:%!xxd -r

    实践

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

    • objdump -d xxx对文件进行反汇编

    • getShell和foo地址相差(91-7d)=0x21,因此欲call 8048491 <foo>修改为call 804847d <getShell>,需要将d7修改为c3(d7-21)

    • 修改过程:vi打开编辑文件(此时为二进制格式);:%! xxd将文件转换为十六进制编辑模式;/找到修改位置,i进入编辑模式,:%! xxd -r转回二进制模式,:wq保存退出

    • 再次进行反汇编的结果如下:

    • 和之前程序运行结果的对比:

    二、利用Bof漏洞攻击

    • 该可执行文件正常运行是调用函数foo,这个函数有Buffer overflow漏洞,攻击目标是触发函数getshell

    • gdb调试,命令r运行,命令info r查看各寄存器的值,主要关注eip寄存器的值

    • 分别输入11……4455555555和11……4412345678看eip寄存器的值,对比可知占用返回地址的压栈数据为4321

    • 将这些数换成getshell的内存地址(x7dx84x04x08x0a),通过perl生成在ASCII界面所无法输入的16进制值,用(cat input; cat) | ./xxx来进入程序,运行结果如下:

    三、注入Shellcode并执行

    • 准备工作:若堆栈内存区设置为不可执行。这样即使是注入的shellcode到堆栈上,也执行不了。使用execstack -s XXX设置堆栈可执行,通过execstack -q XXX查看堆栈是否可执行。使用more /proc/sys/kernel/randomize_va_space命令查看是否开启地址随机化(让OS每次都用不同的地址加载应用),有以下三种情况

      • 0表示关闭进程地址空间随机化。
      • 1表示将mmap的基址,stack和vdso页面随机化。
      • 2表示在1的基础上增加栈(heap)的随机化。
    • 使用echo "0" > /proc/sys/kernel/randomize_va_space命令关闭进程地址空间随机化,并再次使用more /proc/sys/kernel/randomize_va_space验证。

    • Linux下有两种基本构造攻击buf的方法

      • retaddr+nop+shellcode
      • nop+shellcode+retaddr
    • 因为retaddr在缓冲区的位置是固定的,shellcode要不在它前面,要不在它后面,缓冲区小就把shellcode放后边,缓冲区大就把shellcode放前边,使用nops+shellcode+retaddr,nop一为是了填充,二是作为“着陆区/滑行区”,若猜的返回地址只要落在任何一个nop上,自然会滑到我们的shellcode

    • 构造一个shellcode,输入攻击命令(cat input_shellcode;cat) | ./XXX,并找到pwn3_20155318的进程号

    • 进行gdb调试,通过设置断点,来查看注入buf的内存地址

    • 结构为:anything+retaddr+nops+shellcode。看到01020304就是返回地址的位置。地址是 0xffffd3a0

    • 修改input_shellcode为xa0xd3xffxffx90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x80xd3xffxffx00,如图所示,再次攻击后成功!

    实验总结

    • 什么是漏洞?漏洞有什么危害?
    • 漏洞就是正常功能的硬件、软件或者策略中的缺陷。黑客利用漏洞来破坏计算机安全,达到其他对正常使用者不利的目的。
    • 实验收获与感想
    • 本次实验回顾了Linux指令、汇编、反汇编的知识、利用gdb调试,学习了BOF的原理和防御,通过修改机器指令改变程序执行流程、构造payload进行bof攻击的方法,学习了网络对抗的基本知识。感觉这门课还挺有趣的(微笑)
  • 相关阅读:
    Linux平台下mysql的ODBC配置方法
    linux制做RPM包
    linux个性化定制登录信息
    free -m 下的含义
    MegaCli 使用
    判断占用系统资源的进程
    linux批量修改文件名
    linux禁止IPv6
    怎么删除STL容器的元素
    STL——sort函数的实现原理
  • 原文地址:https://www.cnblogs.com/lxy1997/p/8595500.html
Copyright © 2020-2023  润新知