IDA反編譯失敗:positive sp value has been found


 

前言:

  很不爭氣的,在做第一天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的問題就解決了。

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM