ASLR绕过

0x00 覆盖部分地址绕过ASLR

这一类绕过方法不仅是覆盖部分返回地址,还包括结合uaf等等进行利用,2016hctf的“就是干”就是一个很好的综合利用。这里是在windows下的覆盖部分返回地址绕过ASLR。

书中实验的环境是vista,不过没下到要求的vista sp0?最后拿win7(应该是sp0?)做的尝试,也没有什么别的坑。

Windows 7 x64

VS2008

Ollydbg

IDA Pro

以及:

NX        Disabled

Canary Disabled

ASLR   Enabled

代码:

#include "stdafx.h”

#include

char shellcode[]=

""

void *test()

{

char t[256];

__asm int 3     

memcpy(t,shellcode,262);

return t;

}

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

{

char temp[200];

test();

return 0;

}

因为ASLR的原因只能覆盖部分返回地址,所以shellcode必须放在前面。在linux中PIE的随机是在4KB即一个内存页大小的单位进行的,16进制地址的低三位是不变的;在实验中发现低四位都是固定的。


ASLR绕过_第1张图片
msf生成shellcode

193字节的shellcode,用nop(\x90)填充,总共260字节之后就可以覆盖到返回地址。

ASLR绕过_第2张图片

此时返回地址为0x361000,只需要在附近找到一条地址为0x36XXXX的指令来跳转到shellcode去执行(因为地址随机化的原因最直接的方法是相对跳转)

memcpy的返回值是其拷贝数据的目标起始地址,而这个值存放在eax中,而一直到retn的过程中这个值没有被破坏,即只需要一条jmp eax / call eax即可跳转到shellcode去执行。

综上,只需要继续覆盖,将返回地址的低两个字节覆盖为\x14\x1c,函数返回时就会执行call eax,从而跳转到shellcode去执行。

ASLR绕过_第3张图片
弹出calc.exe

0x02 Heap Spray绕过ASLR

留坑

你可能感兴趣的:(ASLR绕过)