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,也就是說,我們的shellc...