實踐目標html
基礎知識linux
實驗原理、內容及步驟shell
問題與解決編程
實驗收穫vim
返回目錄安全
objdump -d
獲得彙編代碼,而後對應起來看彙編指令和機器碼。(如下指令的機器碼均在括號中標出)objdump -d
: 將代碼段反彙編。objdump -S
: 將代碼段反彙編的同時,將反彙編代碼與源代碼交替顯示,編譯時須要使用-g參數調試信息。objdump -l
: 反彙編代碼中插入文件名和行號。objdump -j section
: 僅反彙編指定的section。objdump -t
:輸出目標文件的符號表。objdump -h
:輸出目標文件的全部段歸納。objdump -x
:以某種分類信息的形式把目標文件的數據組成輸出,可查到該文件的的全部動態庫。:%!xxd
:進入十六進制模式。:%!xxd -r
:退出十六進制模式。返回目錄bash
程序中的main函數會經過call
指令調用foo這個函數,實驗的這一環節就是要改其地址、換其函數、實現「想要」的功能(詳見下述步驟)。網絡
call
指令這一行:call
指令對應的e8
,咱們要作的就是把四字節的偏移量ff ff ff d7
(小端序,補碼)換成getShell
函數對應的。call
指令在執行時,會EIP當前的值,也就是下一條指令的地址——0x080484ba
壓棧,而後修改寄存器EIP,將EIP指向foo函數的起始地址(由於EIP+偏移量= 0x080484ba + 0xffffffd7 = 0x08048491目的地址
)。call
指令的偏移量,由計算0x0804847d - 0x080484ba = 0xffffffc3
,簡而言之,要把d7
換成c3
了。在vim下修改:以下圖指令進入十六進制模式,而後定位,換後回到二進制模式。call
函數使程序跳轉到了getShell
函數。1111111122222222333333334444444455555555
,發生段錯誤產生溢出。(注意EIP的值,是ASCII 5)1111111122222222333333334444444412345678
,那1234這四個數最終會覆蓋到堆棧上的返回地址,進而CPU會嘗試運行這個位置的代碼。那隻要把這四個字符替換爲getShell的內存地址,輸給pwn2,pwn2就會運行getShell。\x7d\x84\x04\x08
。xxd
查看input文件的內容是否如預期,而後將input的輸入經過管道符「|」做爲pwn2的輸入,再現shell功能:apt-get install execstack
。root@KaliYL:~# execstack -s pwn1 //設置堆棧可執行 root@KaliYL:~# execstack -q pwn1 //查詢文件的堆棧是否可執行 X pwn1 root@KaliYL:~# more /proc/sys/kernel/randomize_va_space 2 root@KaliYL:~# echo "0" > /proc/sys/kernel/randomize_va_space //關閉地址隨機化 root@KaliYL:~# more /proc/sys/kernel/randomize_va_space 0
<32字節任意數據> + <4字節 RET覆蓋地址> + <NOP墊> + <shellcode>
,最後一個字符千萬不能是\x0a
。0xffffd34c
,shellcode在其基礎上加4字節,因而修改\x4\x3\x2\x1
爲\x50\xd3\xff\xff
。攻擊成功:返回目錄dom
bash: ./pwn1: 沒有那個文件或目錄
返回目錄函數
我以爲這個實驗在操做上是很容易的,我也算是切身領會了BOF攻擊神奇的樂趣,但在理解方面我還須要下一些功夫,有些知識本身看的時候並不能弄清楚,上課聽老師講完才知道,自學成效堪憂...還有一點收穫是:謹防入坑。