buffer_overflow 第3章 筆記2 為啥我們第一個shellcode不能在真實世界生存
我們第一個shellcode 成功執行但會產生一些問題:
問題有4個
1. 預設是用window 的cmd執行,才能看到我們的Hello, World。
2.shellcode 中包含了\x00字元 (NULL字元)
3我們使用了絕對位址 77C4186A (mscvrt.printf) 和 77C39E7E(msvcrt.exit)
4.預先假設 printf , exit 一定可以被呼叫到,也就是假設說 msvcrt.dll 一定會被載入到記憶體中
第一個問題: 可以使用Messagebox解決的shellcode 之後會實作
第二個問題:可以使用編碼器來解決
第三個問題: 只要是早期的作業系統,DLL的位址通常不會改變,但vista之後的版本系統會啟動ASLR 亂數的使DLL 的基址給改變。
第四個問題: 只要是Dev C++編譯出的程序,msvcrt.dll通常會被載入,但如果今天換成 其他編譯器就不保證一定會載入。
我們先看一下
//hello.exe
#include <cstdio>
#include <cstdlib>
int main()
{
printf("Hello, world!\n");
exit(0);
}
DEV C++ 所編譯出來的hello.exe 載入的dll
根據 Immunity Debugger顯示: 按下ALT+E
載入的DLL 有三個
1.msvcrt.dll
2.kernel32.dll
3.ntdll.dll
visual c++ 2010 express 所編譯出來的hello.exe 載入的dll
載入的DLL 有三個
1.MSVCR100D.dll
2.kernel32.dll
3.ntdll.dll
所以看的出來 同樣程式dev c++ 載入了msvcrt.dll 但 VC++載入了的卻是MSVCR100D.dll,也就是說,我們的shellcode只會在Dev c++下編譯出的程式執行成功。
Dev c++ 使用的printf 和 exit 函數在 msvcrt.dll 裏面
VC++ 使用的printf 和 exit 函數在 MSVCR100D.dll 裏面
小知識:
如果想把A程式,利用bufferoverflow 漏洞,再把shellcode 給塞進去執行就可以達到攻擊效果,但如我今天我的shellcode 的某個功能需要使用到XXX.dll 但A程式本身並沒有載入XXX.dll,shellcode就無法奏效。
為了避免這種狀況,所以我們的shellcode 不能期望A程式有預先載入XXX.dll,所以我們的shellcode必須自行加載XXX.dll。
下一篇:將會教大家寫一個會動態抓取dll的shellcode

留言
張貼留言