main函數可以反應程序的主要執行流程,在看源代碼的時候通常也會通過main函數了解程序的主要功能,那么在看二進制文件的時候怎么找到程序的“main”函數呢?
一般情況下,系統在編譯源代碼時,會在main函數之前加一些其它的信息,用於給main的執行准備一下環境之類的。二進制文件的入口一般就是_start,然后先執行一些指令,接着就會跳轉到main運行,所以可以從_start中找到main函數的位置。
(1)IDA中打開目標二進制文件,一般會自動定位到_start,如果沒有的話,也可以在側邊的Functions window中查找_start,然后雙擊定位。
(2)_start的全部如下圖所示,我們可以看到在最后一行通過B指令調用了__uClibc_main函數。
(3)一開始以為這個函數就是main了吧,畢竟函數名里邊都有main了,然后雙擊點進去看這個函數的具體實現。這肯定不是main函數啊,看樣子應該是某個庫函數。
(4)網上找了一下這個函數的定義,但是沒找到。根據一篇文章的啟發,推測它的某個參數就是main函數的地址,然后就把目光鎖定了最有可能的R0寄存器中的那個值sub_FCB0。點進去看一下,首先就是一大長串的變量,第六感感覺像是main的樣子。文章指路:http://blog.sina.com.cn/s/blog_83f3c04c0102xfcb.html(其中還詳細介紹了_start的每條指令的含義,可以對照看一下)
(5)還可以F5反匯編一下,返回值int,參數一個是int,一個是char*,完全符合int main(int argc, char* argv)的格式,再往下看一看函數體,基本沒跑了。宣布:當事函數sub_FCB0就是main!