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<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生成shellcode

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

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

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

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

弹出calc.exe

0x02 Heap Spray绕过ASLR

留坑

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 还是和linux下溢出利用对比。 开启了DEP后,栈的内存空间变成不可执行,无法再把shellcode布置其中然后...
    BJChangAn阅读 1,716评论 0 0
  • Return-Oriented-Programming(ROP FTW) Author: Saif El-Sher...
    RealSys阅读 3,433评论 0 2
  • 缓冲区溢出(Buffer Overflow)是计算机安全领域内既经典而又古老的话题。随着计算机系统安全性的加强,传...
    Chivalrous阅读 1,351评论 0 5
  • 今夜的月亮格外的圆,格外的亮。我躺在床上,闭起了眼睛。似乎看到了他的模样,我努力的去感受他的存在。突然,我...
    happymay阅读 140评论 0 0
  • 简介 正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符")组成的文字模式。模式描述在搜索文...
    我为峰2014阅读 525评论 0 2