SafeSEH利用(DEP/ASLR disabled)

最近在看《0day安全:软件漏洞分析》那本书,初步接触一些windows下的溢出利用,和linux上还是有较大不同的。

本篇对应书上第6、11章节关于利用SEH异常处理来绕过GS的内容。

GS相当于Windows下的canary,这时通过溢出覆盖返回地址,来控制程序执行流程的方法就不再可行。在linux下绕过canary的方法也有一些,在windows下总的思路是一致的:

一、泄露canary的值(参考 %s打印栈上数据时的canary泄露

二、canary检查的机制是生成随机canary后放到返回地址之前,并将其备份(例如linux下存到gs:0x14),在函数返回时,再把两处的canary通过异或来判断是否发生改动,如果能够同时修改这两个地方的canary值,就可以通过canary的检测。(难以利用)

三、利用其它溢出方式(虚函数,堆)。

以上三种比较通用,除此之外,linux下还有一种利用___stack_chk_fail()函数实现一次任意地址读的姿势(Stack Smashing Protector任意地址读

而windows下还可以利用覆盖SEH异常处理指针,只要触发异常先于canary检查,就可以先去执行SEH异常处理函数从而实现利用。

SEH chain结构:

由pointer to next SEH构成单向链表,而handle指向异常处理函数。

具体的异常处理机制就不做过多说明。

Windows XP sp2之后引入了SafeSEH,接下来的内容主要针对SafeSEH,且暂时不考虑DEP。

SafeSEH针对指向异常处理函数的指针做了若干检查,使得我们直接覆盖其为shellcode地址变得不可行。先看看能够通过检查的情况:

1.异常处理函数位于加载模块内存范围之外,DEP关闭

2.异常处理函数位于加载模块内存范围之内,相应模块未启用SafeSEH,同时相关模块不是纯IL指令。

3.异常处理函数位于加载模块内存范围之内,相应模块启用SafeSEH,异常处理函数地址包含在安全S.E.H表中。

0x00 利用未启用SafeSEH模块绕过SafeSEH

实验环境:

     Windows XP SP3    (DEP disabled)

     Visual Studio 2008

     VC++ 6.0


首先用vc6.0构建一个未启用SafeSEH的dll:

#include "stdafx.h"

#include "stdio.h"

BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved )

{

    return TRUE;

}

void jump()

{

    puts("hereisit");         //主要用于定位ROP

    __asm{

            pop eax

            pop eax

            retn                     //一个pop pop ret 的rop,用法后面会提到

                 }

}

为了防止ROP的地址包含‘'\x00'被截断,需要手动设置dll的加载基址:

在 工程-->设置-->连接 的工程选项中添加  /base:"0x11120000"/

接着用vs2008构建一个启用SafeSEH的exe,其中调用之前的dll。(vs2008默认开启GS、SafeSEH)

char shellcode[]="”;

DWORD MyException(void)

{

         printf("This is an exception");

         getchar();

         return 1;

}

void test(char * input)

{

          char str[200];

          strcpy(str,input);       //溢出点

          int zero=0;

          __try{

                  zero=1/zero;             //构造一个除零来触发异常处理

           }

          __except(MyException()) { }

}

int _tmain(int argc,_TCHAR* argv[])

{

           HINSTANCE hinst = LoadLibrary(_T("SEH_NOSafeSEH_JUMP.dll"));

           char str[200];

           test(shellcode);

           return 0;

}

SEH_NOSafeSEH_JUMP.dll

test.exe

先用Immunity Debugger的mona插件计算需要多少个字节才能覆盖到SEH的内容:

把生成的字符串放到shellcode数组中,od或者immunity debugger调试,此时SEH的pointer to next SEH被覆盖为41326841,由于是小端格式,倒过来用mona计算偏移:

我们只需在shellcode中填充’\x90'*216,接着就将覆盖SEH结构体。

栈中内容大致是这样的

调用异常处理函数的过程:

把0x12FE94处的四字节放入eax,然后call eax,这时栈的情况:

回看之前我们的rop:POP POP RETN,两次弹栈后将执行0x12FE90处的指令。

书中给出的shellcode布局是:

做图的时候有点问题。。。这块应该是buffer的栈上数据

执行了我们伪造的异常处理函数,实际上是pop pop retn后,eip指向0x12fe90,\x90是nop指令,pop pop retn的地址相当于一个操作eax的指令无关紧要,那么可以一直滑向shellcode执行。

但是实际调试时,这样布局0x12ef98~0x12fe9c的位置会被破坏,不再是NOP指令无法滑向shellcode。

由于没有开启DEP,我在0x12FE90的位置放置了\xeb\x0b\x90\x90,对应汇编指令jmp 0x10,直接跳到0x12fea0即shellcode的第一条指令执行。

成功执行弹窗shellcode

0x01 利用加载模块之外的地址绕过SafeSEH

当程序加载到内存中后,在它所占的整个内存空间中,除了我们平时常见的PE文件模块(EXE和DLL)之外,还有其他一些映射文件,例如,类型为MAP的映射文件,SafeSEH是无视它们的,所以我们可以在这些文件中寻找跳转指令。

这种情况下可用的跳板地址,除了pop pop retn序列外,还有:

call / jmp dword ptr [esp+0x8/0x14/0x1c/0x2c/0x44/0x50]

call / jmp dword ptr [ebp+0xc/0x24/0x30]

call / jmp dword ptr [ebp-0x4/0xc/0x18]

关于为什么这些跳板可以,有兴趣的童鞋可以自己调试跟一下。

书作者开发了一个插件叫做OllyFindAddr,与ollydbg自己的指令搜索不同,该插件不只在加载模块中搜索指令,而是在整个程序的内存空间搜索。


exploit!

后记

某次课堂练习复现一个简单的SafeSEH利用,系统是windows xp sp3 pro,od给的exp里不知道为什么要往seh handler填一个jmp ebx的地址,重新找了pop pop ret填入发现无法正常调用异常处理函数,最后发现根本找不到未开启safeSEH的模块。

然而发现exp中的jmp ebx是可以执行的,其位置位于地址空间的最后,一块未识别的模块。在其中搜索pop pop ret找不到,最后终于找到形如:

pop 

mov ebx,

pop

mov ebx,

ret

的指令序列,完成利用。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • 一、温故而知新 1. 内存不够怎么办 内存简单分配策略的问题地址空间不隔离内存使用效率低程序运行的地址不确定 关于...
    SeanCST阅读 7,669评论 0 27
  • 还是和linux下溢出利用对比。 开启了DEP后,栈的内存空间变成不可执行,无法再把shellcode布置其中然后...
    BJChangAn阅读 1,466评论 0 0
  • 这篇文是在网络上无意中看到的,其中有些理论希望对大家的语言学习能有些参考价值。尤其对于新接触一门语言的同学,不妨试...
    十两阅读 20,602评论 123 1,301
  • 四月尾声,春意盎然,惠风和畅,蓝天白云悠然南山!我自命学校有后海,盗王俊虎老师的图。 这几天迷恋台湾大学中文系教授...
    甜菜的甜甜圈阅读 371评论 0 0
  • 要说孤单,估计每个人说三天三夜也说不完,只不过很多时候,我们只是选择了不说。 真的希望,陪你度过漫长岁月。 陪你把...
    林夕依然阅读 580评论 0 0