zoukankan      html  css  js  c++  java
  • 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攻击的方法,学习了网络对抗的基本知识。感觉这门课还挺有趣的(微笑)
  • 相关阅读:
    1063. Set Similarity
    A1047. Student List for Course
    A1039. Course List for Student
    最大公约数、素数、分数运算、超长整数计算总结
    A1024. Palindromic Number
    A1023. Have Fun with Numbers
    A1059. Prime Factors
    A1096. Consecutive Factors
    A1078. Hashing
    A1015. Reversible Primes
  • 原文地址:https://www.cnblogs.com/lxy1997/p/8595500.html
Copyright © 2011-2022 走看看