前言:
很不爭氣的,在做第一天MBE課后練習lab1A時又卡住了,不想純擼匯編,把程序扔到IDA中F5,發現不能反編譯。經過搜索資料以及向學長請教,終於解決了這個問題,前來記錄一下。由於知識有限,文中內容難免有錯,請過往的大神們指教。
正文:
問題如下:
這種問題出現的原因如下:
一般是程序代碼有一些干擾代碼,讓IDA的反匯編分析出現錯誤。比如用push + n條指令 + retn來實際跳轉,而IDA會以為retn是函數要結束,結果它分析后發現調用棧不平衡,因此就提示sp analysis failed.
我還遇到過一種情況,是因為編譯器優化,結果IDA無法正確識別一個函數體的結尾部分,換句話說,它找不到C中的“大括號”應該位於哪里。例如以下代碼:
int one_function( int a,int b); int another_function( int a, int b) { if ( a == 0 || b == 0 ) return -1; return one_function(a,b); }
其中return one_function(a,b)這條語句,在某些新的編譯器,可能會編譯成這樣的指令序列:
mov esp, ebp pop ebp jmp one_funcion
而IDA是通過retn指令來識別函數的結束的,因為它不知道這里的意思,會把它當成一個函數內部 的跳轉,最后就會出現sp analysis failed了。
解決辦法:
對於這種情況,可以選擇采用手動調整堆棧的方法將其調整平衡,或者直接使用alt+k修改sp指針,將其修改為應有的值即可
如:
之后即可反編譯:
或者使用alk+k修改sp指針,如下圖所示,在0x8048C6C處修改sp指針即可。
有關此修改的意義,我和同學認為是在執行完此條指令后,sp會變化多少,因此當前是-0x40,將其+0x40即可變為0,此時positive sp value的問題就解決了。