java中asl_带你认识绕不开的ASLR
微軟從windows vista/windows server 2008(kernel version 6.0)開始采用ASLR技術(shù),主要目的是為了防止緩沖區(qū)溢出ASLR技術(shù)會(huì)使PE文件每次加載到內(nèi)存的起始地址隨機(jī)變化,并且進(jìn)程的棧和堆的起始地址也會(huì)隨機(jī)改變。
ASLR(Address space layout randomization)是一種針對(duì)緩沖區(qū)溢出的安全保護(hù)技術(shù),通過對(duì)堆、棧、共享庫映射等線性區(qū)布局的隨機(jī)化,通過增加攻擊者預(yù)測(cè)目的地址的難度,防止攻擊者直接定位攻擊代碼位置,達(dá)到阻止溢出攻擊的目的。據(jù)研究表明ASLR可以有效的降低緩沖區(qū)溢出攻擊的成功率,如今Linux、FreeBSD、MacOS、Windows等主流操作系統(tǒng)都已采用了該技術(shù)。
一、主要特點(diǎn)
1、映像隨機(jī)化
經(jīng)典的方法是用注冊(cè)表項(xiàng)HKLM\SYSTEM\CurrentControlSet\Session Manager\Memory Management的方法對(duì)映像隨機(jī)化禁用 ?設(shè)置為0 禁用 ,-1強(qiáng)制對(duì)可隨機(jī)化的映像進(jìn)行處理,其他值正常工作;
各模塊的低位2位不變;
只是對(duì)加載基址的前2個(gè)字節(jié)做了隨機(jī)處理;
2、堆棧隨機(jī)化
XP下不具備,VISTA具備,每次獲取堆地址不同;不需要精確跳轉(zhuǎn)的,溢出手段影響有限;
3、PEB TEB隨機(jī)化
XP SP2中已經(jīng)引入了,使用隨機(jī)性的基址。
提取代碼:
unsigned int teb;
unsigned int peb;
__asm
{
mov eax,fs:[0x18]
mov teb,eax
mov eax,dword ptr [eax+0x30
mov teb,eax]
}
printf("PEB:%#x\nTEB:%#x",peb,teb);
getchar();
4、VS2019中支持ASLR
該技術(shù)需要操作系統(tǒng)和編譯工具的雙重支持(主要是操作系統(tǒng)的支持,編譯工具主要作用是生成支持ASLR的PE格式);?若不想使用ASLR功能,可以在VS(2019)編譯的時(shí)候?qū)ⅰ芭渲脤傩?>鏈接器->高級(jí)->隨機(jī)基址”的值修改為否即可。
5、工具鑒別
這里我們用一個(gè)工具ASLRProcessScanner來查看下ASLR是否打開,
發(fā)現(xiàn)這個(gè)程序是打開了ASLR。
這個(gè)程序有如下的用法,
可以批量指出當(dāng)前運(yùn)行的進(jìn)程有哪些具備ASLR,也可以對(duì)指定進(jìn)程、程序進(jìn)行檢測(cè)。
二、比對(duì)PE信息
準(zhǔn)備兩個(gè)PE程序,一個(gè)有ASLR,一個(gè)沒有?ASLR,用PEView查看,
ASLR.exe比NoASLR.exe多了一個(gè).reloc節(jié)區(qū),這個(gè)節(jié)區(qū)存儲(chǔ)了程序中的硬編碼信息。
IMAGE_FILE_HEADER\Characteristics
發(fā)現(xiàn)ASLR.exe比NoASLR.exe少了一個(gè)“IMAGE_FILE_RELOCS_STRRIPED(0001)”標(biāo)志,該標(biāo)志的含義是:
Relocation information was strippedfrom the file. The file must be loaded at its preferred base address. If the base address is not available, the loader reports an error.
換個(gè)工具看下,
ASLR.exe位置的數(shù)值為 0,而NoASLR.exe位置的數(shù)值為 1;也就意味著這里我只要置為 1 就可關(guān)閉ASLR;
三、關(guān)閉ASLR,便于調(diào)試
ASLR技術(shù)會(huì)使PE文件每次加載到內(nèi)存的起始地址隨機(jī)變化,并且進(jìn)程的棧和堆的起始地址也會(huì)隨機(jī)改變。
該技術(shù)需要操作系統(tǒng)和編譯工具的雙重支持(主要是操作系統(tǒng)的支持,編譯工具主要作用是生成支持ASLR的PE格式)。
1、關(guān)閉操作系統(tǒng)的ASLR
操作系統(tǒng)方面關(guān)閉ASLR支持,不知道在哪里關(guān)閉怎么辦呢?沒關(guān)系,我們可以看看別人是怎么做的。
可以看到注冊(cè)表添加了一個(gè)DWORDRD鍵值項(xiàng)HKLM\System\CurrentControlSet\Control\SESSION MANAGER\MEMORY MANAGEMENT\MoveImages,其值為0。
2、關(guān)閉PE頭中ASLR
那么這個(gè)時(shí)候我們可以通過修改PE頭中可選頭的Characteristics來達(dá)成我們的目的。
將這個(gè)0x0103改成0x0102就可以關(guān)閉PE中的ASLR了。
3、這樣每次加載的時(shí)候都是在同一個(gè)地址,調(diào)試起來的時(shí)候是固定地址了。用OD逆向的時(shí)候,和IDA中的地址對(duì)上了。
至此,簡(jiǎn)單介紹完畢。
這是我的第100篇文章,非常有紀(jì)念意義!
同時(shí),這篇文章居然是在“魔都”完成的,沒想到的緣份;今天也是這個(gè)公眾號(hào)開辦整整9個(gè)月,一切都值得紀(jì)念。
總結(jié)
以上是生活随笔為你收集整理的java中asl_带你认识绕不开的ASLR的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 运算符优先级与结合性
- 下一篇: html定位的所有属性,HTML CSS