您好,登錄后才能下訂單哦!
Linux CTF逆向入門是什么,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
1.ELF格式
我們先來看看 ELF 文件頭,如果想詳細了解,可以查看ELF的man page文檔。
關于ELF更詳細的說明:e_shoff:節頭表的文件偏移量(字節)。如果文件沒有節頭表,則此成員值為零。sh_offset:表示了該section(節)離開文件頭部位置的距離
ELF文件的第一部分是可執行文件頭部(Executable Header),其中包含有關ELF文件類型的信息。ELF文件在各種平臺下都通用,ELF文件有32位版本和64位版本,其文件頭內容是一樣的,只不過有些成員的大小不一樣。它的文件圖也有兩種版本:分別叫“Elf32_Ehdr”和“Elf64_Ehdr”。這里以32位版本為例:
使用readelf
對ELF文件格式進行分析
我們可以使用以下計算方法來計算整個二進制文件的大小:
size = e_shoff + (e_shnum * e_shentsize)
size = Start of section headers + (Number of section headers * Size of section headers)
size = 137000 + (29*64) = 138856
計算結果驗證:
程序頭部是描述文件中的各種segments(段),用來告訴系統如何創建進程映像的。
節表頭部(Section Headers)包含了描述文件節區的信息,比如大小、偏移等,但這些對二進制文件的執行流程來說并不重要。
sections 或者 segments:segments是從運行的角度來描述elf文件,sections是從鏈接的角度來描述elf文件,也就是說,在鏈接階段,我們可以忽略program header table來處理此文件,在運行階段可以忽略section header table來處理此程序(所以很多加固手段刪除了section header table)。從圖中我們也可以看出, segments與sections是包含的關系,一個segment包含若干個section。
5.1 .bss Section
保存未初始化的數據,比如那些未初始化的全局變量。
5.2 .data Section
保存已初始化的數據。
5.3 .rodata Section
保存程序中的只讀數據。
5.4 .text Section
本節包含程序的實際代碼,邏輯流程。使用readelf
查看ELF文件表結構
既然已經對ELF文件有所了解了,那找一個CTF題目來試試吧。
二進制文件下載地址:https://ufile.io/blvpm
國內下載:www.lanzous.com/i34qg6f
1、運行這個程序,并傳遞一些隨機字符給它,得到的結果如下:
2、接著使用strings
查看一下程序的字符串,看是否能找到有用的信息
我們可以看到 “%c” 是打印flag的字符串,數量是15個。
3、我們可以查看“.rodata ”部分的偏移量,可以更好的查看這些字符
4、檢查符號表(Symbols)nm命令查看庫文件的符號
說明:-D或–dynamic:顯示動態符號。該任選項僅對于動態目標(例如特定類型的共享庫)有意義我們可以發現 printf, puts, sprintf, strlen functions.
這些函數未定義。5、跟蹤系統調用(System Calls)我們可以使用strace
之類的工具去跟蹤程序的系統調用
為了更好地理解,我們可以使用ltrace
解碼C++來跟蹤函數名所做的庫調用。我們可以看到正在進行字符串長度檢查。
為了更好地理解,我們可以使用ltrace
解碼C++來跟蹤函數名所做的庫調用。我們可以看到正在進行字符串長度檢查。
在這個二進制文件中,符號沒有被剝離,因此我們可以看到函數名稱,這使得它更容易理解。如果你可以閱讀匯編代碼,你可以很清楚的知道發生了什么。如果不能閱讀匯編代碼,讓我們做一些實時調試,并嘗試更好地理解。7、實時調試這里我們使用GDB-Peda
進行實時調試我們首先檢查二進制文件中的函數。我們可以看到main,comp_key
等函數
調試方法:首先使用 break main
跳到主函數,使用n
來step和ni
來執行每條指令
讓我們來看看程序的邏輯,程序首先嘗試比較參數的數量。它存儲在ecx寄存器中并移動到esi,它用于將值與0x2進行比較
其偽代碼看起來是這樣的:
其代碼是這樣的:
如果你檢查這個代碼,可以看到有一個循環正在迭代我們輸入字符串的每個字符。
它到底循環了多少個字符?通常來說,我們的密碼長度為7個字符。
代碼看起來是這樣的:
可以看出,如果7個字符總和等于801,即可得到flag。您可以使用任何字符,只要總和是801即可。檢查完成后,調用comp_key
函數并打印出flag。比如這樣:114 * 6 + 177 = 801
我們找到數字對應的ASCII字符114是 ‘r’ 117 是 ‘u’。
然后我們將字符作為輸入,執行程序即可得到FLAG
關于Linux CTF逆向入門是什么問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。