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<stdlib.h>
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进制地址的低三位是不变的;在实验中发现低四位都是固定的。
msf生成shellcode193字节的shellcode,用nop(\x90)填充,总共260字节之后就可以覆盖到返回地址。
此时返回地址为0x361000,只需要在附近找到一条地址为0x36XXXX的指令来跳转到shellcode去执行(因为地址随机化的原因最直接的方法是相对跳转)
memcpy的返回值是其拷贝数据的目标起始地址,而这个值存放在eax中,而一直到retn的过程中这个值没有被破坏,即只需要一条jmp eax / call eax即可跳转到shellcode去执行。
综上,只需要继续覆盖,将返回地址的低两个字节覆盖为\x14\x1c,函数返回时就会执行call eax,从而跳转到shellcode去执行。
弹出calc.exe0x02 Heap Spray绕过ASLR
留坑
网友评论