1. 程式人生 > >Linux下關閉ALSR(地址空間隨機化)的方法

Linux下關閉ALSR(地址空間隨機化)的方法

0x00 背景知識

ASLR(Address Space Layout Randomization)在2005年被引入到Linux的核心 kernel 2.6.12 中,當然早在2004年就以patch的形式被引入。隨著記憶體地址的隨機化,使得響應的應用變得隨機。這意味著同一應用多次執行所使用記憶體空間完全不同,也意味著簡單的緩衝區溢位攻擊無法達到目的。

GDB從版本7開始,第一次在Ubuntu 9.10(Karmic)上,被除錯的程式可以被關閉ASLR(通過標記位ADDR_NO_RANDOMIZE )。

此處有坑,筆者有一個Ubuntu 9.10的虛擬機器,用了下面將要介紹的全部姿勢,死活關閉不了ASLR,後來換成Ubuntu 10.04就沒問題了,說明Ubuntu 9.10的版本控制ASLR的方法還不成熟,需要重原始碼層面確認是否可以關閉開啟,真是坑到家了。

0x01 檢視ASLR設定

檢視當前作業系統的ASLR配置情況,兩種命令任你選擇

$ cat /proc/sys/kernel/randomize_va_space
2
$ sysctl -a --pattern randomize
kernel.randomize_va_space = 2

0x02 配置選項

  • 0 = 關閉
  • 1 = 半隨機。共享庫、棧、mmap() 以及 VDSO 將被隨機化。(留坑,PIE會影響heap的隨機化。。)
  • 2 = 全隨機。除了1中所述,還有heap。

後面會詳細介紹ASLR的組成,不關心的同學可以簡單理解為ASLR不是一個籠統的概念,而是要按模組單獨實現的。當然,在攻防對抗的角度上,應為不是所有元件都會隨機,所以我們就可以按圖索驥,寫出通用的shellcode呼叫系統庫。

0x03 檢視地址空間隨機效果

使用ldd命令就可以觀察到程式所依賴動態載入模組的地址空間,如下下圖所示,被括號包裹。在shell中,執行兩次相同的ldd命令,即可對比出前後地址的不同之處,當然,ASLR開啟時才會變化:

ASLR開啟時,動態庫的載入地址不同

這裡寫圖片描述

ASLR關閉時,動態庫的載入地址相同
這裡寫圖片描述

0x04 關閉ASLR

方法一: 手動修改randomize_va_space檔案

誠如上面介紹的randomize_va_space檔案的列舉值含義,設定的值不同,linux核心載入程式的地址空間的策略就會不同。比較簡單明瞭。這裡0代表關閉ASLR。

# echo 0 > /proc/sys/kernel/randomize_va_space

注意,這裡是先進root許可權,後執行。不要問為什麼sudo echo 0 > /proc/sys/kernel/randomize_va_space為什麼會報錯

方法二: 使用sysctl控制ASLR

$ sysctl -w kernel.randomize_va_space=2

這是一種臨時改變隨機策略的方法,重啟之後將恢復預設。如果需要永久儲存配置,需要在配置檔案 /etc/sysctl.conf 中增加這個選項。

方法三: 使用setarch控制單個程式的隨機化

如果你想歷史關閉單個程式的ASLR,使用setarch是很好的選擇。setarch命令如其名,改變程式的執行架構環境,並可以自定義環境flag。

setarch `uname -m` -R ./your_program

-R引數代表關閉地址空間隨機化(開啟ADDR_NO_RANDOMIZE)

方法四: 在GDB場景下,使用set disable-randomization off

在除錯特定程式時,可以通過set disable-randomization命令開啟或者關閉地址空間隨機化。預設是關閉隨機化的,也就是on狀態。

當然,這裡開啟,關閉和檢視的方法看起來就比較正規了。

關閉ASLR:
set disable-randomization on
開啟ASLR:
set disable-randomization off
檢視ASLR狀態:
show disable-randomization

0x05 ASLR與PIE的區別

ASLR有一個模糊的值(1),既不是全開啟也不是全關閉,而是部分關閉,那這部分到底是什麼,很容易產生歧義。

ASLR 不負責程式碼段以及資料段的隨機化工作,這項工作由 PIE 負責。但是隻有在開啟 ASLR 之後,PIE 才會生效。

0x06 一些沒有用的感想

寫這篇文章的原點是在除錯一個簡單的ROP利用沒有成功彈shell,但是出了一些莫名其妙的sh報錯。冥冥中感覺裡成功不遠了。隨著翻閱資料的積累,和相關writeup的release date接近2018年,越來越堅定了這份信心。終於找到了ASLR的影響導致ROP不成功的原因。

最近工作也很累,不是量大,而是心累。希望LP越來越漂亮,越來越美麗~

這裡寫圖片描述

0x07 參考文獻

這個不能忘,都是寶貴的經驗。

https://linux-audit.com/linux-aslr-and-kernelrandomize_va_space-setting/
https://www.theurbanpenguin.com/aslr-address-space-layout-randomization/
https://stackoverflow.com/questions/5194666/disable-randomization-of-memory-addresses
http://visualgdb.com/gdbreference/commands/set_disable-randomization
https://wiki.ubuntu.com/Security/Features
https://outflux.net/blog/archives/2010/07/03/gdb-turns-off-aslr/comment-page-1/