0x00 覆蓋部分地址繞過ASLR
這一類繞過方法不僅是覆蓋部分返回地址瞭吃,還包括結(jié)合uaf等等進行利用,2016hctf的“就是干”就是一個很好的綜合利用涣旨。這里是在windows下的覆蓋部分返回地址繞過ASLR歪架。
書中實驗的環(huán)境是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即一個內(nèi)存頁大小的單位進行的浆洗,16進制地址的低三位是不變的催束;在實驗中發(fā)現(xiàn)低四位都是固定的。
193字節(jié)的shellcode伏社,用nop(\x90)填充抠刺,總共260字節(jié)之后就可以覆蓋到返回地址。
此時返回地址為0x361000摘昌,只需要在附近找到一條地址為0x36XXXX的指令來跳轉(zhuǎn)到shellcode去執(zhí)行(因為地址隨機化的原因最直接的方法是相對跳轉(zhuǎn))
memcpy的返回值是其拷貝數(shù)據(jù)的目標起始地址速妖,而這個值存放在eax中,而一直到retn的過程中這個值沒有被破壞聪黎,即只需要一條jmp eax / call eax即可跳轉(zhuǎn)到shellcode去執(zhí)行罕容。
綜上,只需要繼續(xù)覆蓋,將返回地址的低兩個字節(jié)覆蓋為\x14\x1c杀赢,函數(shù)返回時就會執(zhí)行call eax烘跺,從而跳轉(zhuǎn)到shellcode去執(zhí)行。
0x02 Heap Spray繞過ASLR
留坑