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