VC反匯編筆記一
對幾個最基礎的c++和對應的反匯編羅列了下,有的有簡要注釋,沒注釋的是一些常規形態。掛在網上,隨時方便參考回顧。看的時候可以參考上一篇《函數反匯編之函數創建和恢復現場》
http://www.shnenglu.com/flyindark/archive/2012/01/09/163895.html
1 堆棧上分配內存
本質是在ES上分配一個空間,并用一個標識符表示起始的地址(這里是string),然后初始化的時候將常量區的內容復制到這個分配的空間上。這個ES堆棧空間用BP、SP定位。

2 常量空間和堆棧空間

3 /GS開關
3.1 SOURCE
__security_cookie
http://msdn.microsoft.com/en-us/library/ms235362(v=vs.80).aspx
/GS (Buffer Security Check)
http://msdn.microsoft.com/en-us/library/8dbf701c(v=VS.80).aspx
Detects some buffer overruns that overwrite the return address, a common technique for exploiting code that does not enforce buffer size restrictions. This is achieved by injecting security checks into the compiled code.
/GS(緩沖區安全檢查)
http://msdn.microsoft.com/zh-cn/library/8dbf701c(v=vs.90).aspx
檢測某些覆蓋返回地址的緩沖區溢出,這是一種利用不強制緩沖區大小限制的代碼的常用技術。這是通過將安全檢查插入到已編譯代碼中完成的。
/Gs (Control Stack Checking Calls)
http://msdn.microsoft.com/en-US/library/9598wk25(v=vs.80).aspx
Controls stack probes.
/Gs(控制堆棧檢查調用)
http://msdn.microsoft.com/zh-cn/library/9598wk25(v=vs.90).aspx
控制堆棧探測。
check_stack
http://msdn.microsoft.com/zh-cn/library/ybwsy5f9(v=vs.90).aspx
Instructs the compiler to turn off stack probes if off (or –) is specified, or to turn on stack probes if on (or +) is specified.
注意大小寫,GS和Gs是不一樣的,中文文檔里有些小錯誤,關閉GS掉了“-”。
編譯器進行判斷的,像函數里定義了char數組,后面又用字符串操作函數進行了一定的操作,就說明
可能存在溢出。編譯器在編譯這個函數里的時候就加上security cookie的保護。
GS默認是開
/GS |
/GS- |
 |
 |
GS開后,編譯器插了三行代碼,目的是ebp-4放了一個4字節的保護數,防止向堆棧空間的string地址中寫入時越界(當然是想當然的看法,具體細節還不是很清楚)。
4 堆棧變量分配空間初始化的區別


曾見過爭論{0}與{}那個效率更高的;這個堆棧變量的初始化竟然要這么多指令,以后256以上的空間還是需要memset了,抑或聽說release時編譯器可能會優化了;
5 函數調用
5.1 現象快照



進入調用函數前
+ &string 0x001ff8dc char [6]*
+ &string2 0x001ff8d0 char * *
ebp 0x001ff8e8 unsigned long
esp 0x001ff7dc unsigned long
+ &x 0x001ff8c4 int *
+ &y 0x001ff8b8 int *
進入調用函數第一條指令
ebp 0x001ff8e8 unsigned long
esp 0x001ff7d0 unsigned long
+ &a 0x001ff7d4 int *
+ &b 0x001ff7d8 int *
5.2 總結
l 函數名是函數地址的標識符
l 參數地址是常量空間地址,例如這里的&string2、&x、&y、&a、&b。
l 參數是從右向左的順序傳遞的,先處理倒數第一個參數
l 參數傳值的時候折騰了下,先將常量傳到標識符(y),然后將y傳遞到EAX,然后將EAX壓棧。跟著是第一個參數x類似。
l 調用前的參數入棧后,參數所在的地址就是調用的函數的參數的標識符。這里就免得參數被多次賦值。
l 函數返回值放到EAX里了。
l 壓入了2個int參數,返回后ESP要加8。
6 返回結構體
分析返回結構體的情形
6.1 簡單結構體
