登入使用能幫助您收藏更多喜歡的好書,
希望大家都能多多登入,管理員在此感激不盡啦!
《從零開始的CTFer生活》Chapter.三 Do you know IDA?
  在連續試了幾次之後,筱懿明大概明白了這個程序的用意——

  “這看樣子是一個驗證程序,只有當我輸入正確的以後它才不會輸出‘your is wrong’字樣?但是我根本不知道是啥啊,知道的話直接提交到平台上拿分了!”

  筱懿明在比賽平台上注冊了一個叫「Apocalypse」的帳號,意為「天啟」,聽起來似乎是一個十分帥氣的名字——可惜目前Apocalypse大佬的得分暫時為0,屈居排行榜最後一名,和榜單第一頁的選手相比至少有上千分的差距。

  不過只要解開這道題,筱懿明將會獲得這場比賽中的第一個50分——雖然對於整個榜單而言50分好像還是無足輕重,但是對於筱懿明而言,這將是他邁入信息安全世界的第一步——從CTF中的reverse類題目起手。

  “怎麽弄...按照之前比賽平台的說明,的形式應當是「geekerctf{}」...那麽前面的這幾個字符就應該是「geekerctf{」...最後一個字符應該是「}」...”筱懿明撓了撓頭,對於逆向工程一無所知的他而言,要分析一個二進製程序根本無從下手,“中間的字符串怎麽弄,爆破?一個一個字母地輸肯定不行...寫個python腳本自動爆破?如果本身太長的話這nmd爆破到畢業都不一定爆得出來...”

  “思來想去,於是我們就讓思來去了。”筱懿明的腦子裡不知為何冒出了他高中班主任講過的一句冷笑話——當然,除了拖時間和湊字數以外毫無任何作用,但這仍然給了筱懿明一個啟發——當然,其實也並不是這句話給了他啟發,在他想到自己以前打NOIP時所學的算法知識在CTF中似乎排不上用場之後,他就開始轉變思路——重新看向比賽平台網頁上的題目,這一次,他發現了這樣一個按鈕——

  「View hint」

  “hint”意為“提示”,即便是如此簡單的一道入門級別的CTF逆向題目,主辦方也十分貼心地為初來乍到的參賽選手們提供了提示信息。

  筱懿明迫不及待地點開了提示,發現只有這樣一句話——

  「Do you know IDA?」

  在計算機界有著這樣的一份一直被奉為經典的文檔——《提問的智慧》,用以指導入門者如何通過恰當的方式分析並解決自己的問題,以減少世界上很多沒有必要存在的提問,提高大家的效率。當然,作為十分經典的一本提問指南,它同樣也有著中文翻譯版本(您甚至可以在GitHub上找到它)。

  混過一段時間OI圈的筱懿明自然甚至自己動手解決問題的重要性——當然,並不是因為熟讀《提問的智慧》三千次的原因,只是因為很多時候在群裡問問題的時候大佬們甚至都懶得回一個句號,於是自然而然地便養成了“遇事不決就百度”的習慣——雖然說哪怕是在看到hint之後他仍然還是很想問問相關專業的學長:「CTF究竟是個什麽東西?」——當然,剛開學沒多久再加上日常自閉,他也不認識幾個學長。不過既然眼下比賽方給他指出一條明路,筱懿明自然樂於上百度尋找答案,這倒是與一位名為“空格”的學長的名言有著幾分相似之處——“你問我我也要百度的啊”——或許百度才是解決問題的最好方式——不過若是問起計算機相關的從業人士心目中最好的搜索引擎,

可能答案都會是“谷歌”。  沒過多久,他便在百度上找到了答案——

  IDA,即「Interactive Disassembler 」,意為交互式反匯編器專業版,是目前業界內最為常用的、也是最為優秀的一款靜態的軟件分析工具,可以十分方便地將一個二進製文件反匯編成可供計算機類從業人員所能夠讀懂的匯編語言代碼,甚至能夠反編譯為C語言代碼,令整個程序的運行邏輯一覽無余,可謂是逆向工程當中用以分析二進製文件的絕無僅有的「神器」。

  當然,正所謂“魔高一尺道高一丈”,為了保護自己的軟件不被破解,各種反逆向工程手段也層出不窮——花指令(用無效代碼迷惑反匯編器)、反調試(佔用ptrace位讓gdb無從下手)、代碼自修改技術(Self Modify Code,運行時才決定真正的代碼)、加殼(upx、vmp...)等等——當然,對於我們的主角筱懿明而言,這些東西暫時還太過於遙遠,此時的他才剛剛開始做第一道入門的CTF逆向題目。

  快速在吾愛破解論壇上下載好最新版本的IDA之後,筱懿明便按照從網上搜索到的教程,將二進製文件拖入到IDA中,一個奇特的界面出現在他的眼前——

  最左邊的窗口是「 name」,其中有一個擁有很多項目的列表,按譯名似乎是“函數名”——這似乎代表著在該程序當中用到的函數?但是有的函數名是粉色背景的,這令筱懿明有些摸不著頭腦;中間的也是最大的窗口則標注著「IDA view-A」,是一個圖形化的框圖——不同於高中數學課本上的程序流程圖,這裡的流程框圖中的內容可是「實打實的匯編代碼」。

  可惜的是,對於只會一點點C語言的筱懿明而言,想要立即學會讀懂匯編代碼簡直難如登天,但至少現在他能夠通過IDA這個軟件,真正明白這個程序的運行邏輯。但是相比起直接硬看匯編代碼,他更希望能夠看到簡單易懂的高級語言代碼——畢竟硬看匯編代碼分析程序邏輯是專業的逆向工程人員該做的事情,而他暫時還只是一個連信息安全的門檻都還沒有摸到的大一新生。

  幸運的是,IDA是有著反編譯的功能的,這也令筱懿明暫時不需要臨時多學一門匯編語言——雖然說二進製安全並不是一個能夠拋開匯編語言的領域。

  “將光標標在一個函數上...一個程序的入口點應該是main函數吧...”筱懿明仔細檢索著函數窗口中的每一個字段,“原來一個程序裡面封裝了這麽多函數啊...”

  當然,若是他選擇使用Linux下的ELF文件進行分析,對於這道題而言,筱懿明毫無疑問能夠一眼看到main函數在哪——歸功於Linux的延遲綁定機制與動態鏈接庫。

  “有了,main函數。”

  筱懿明將光標放在main函數上,雙擊鼠標左鍵表示選中,隨後他便按照網上的教程,輕輕地敲擊了鍵盤上的F5鍵——

  程序主函數的反編譯代碼悄然浮現在一個名為「-A」的窗口中:

  int __cdecl main(int argc, const char **argv, const char **envp)

  {

  char Str1[112];//[rsp+20h][rbp-60h] BYREF

  char Str2[48];//[rsp+90h][rbp+10h] BYREF

  char v6[48];//[rsp+C0h][rbp+40h] BYREF

  int v7;//[rsp+F0h][rbp+70h]

  _main();

  strcpy(Str2, “geekerctf{We1c0me_t0_7he_w0r1d_0f_rev3r5e!}“);

  memset(v6, 0, sizeof(v6));

  v7 = 0;

  puts(“ to GeekerCTF2021~Please input your there:“);

  scanf(“%s“, Str1);

  if (!strcmp(Str1, Str2))

  puts(“You get the right !“);

  else

  puts(aSorry);

  return 0;

  }

  “不愧是...IDA...”

  毫無疑問,雖然說看起來還是有些許混亂,但是整個程序的邏輯已經在筱懿明的面前一覽無余——讀入一個字符串與預先儲存好的字符串相比較。

  被用來進行比較的字符串,毫無疑問,就是本題的,如今在筱懿明面前一覽無余。

  “這個字符串應該就是了吧,把這個提交上去看看...”

  筱懿明選中字符串“geekerctf{We1c0me_t0_7he_w0r1d_0f_rev3r5e!}”,ctrl+c快捷鍵進行複製後,將之提交到了比賽平台上——

  「Correct.」
鍵盤左右鍵 ← → 可以切換章節
章節問題回報:
翻譯有問題
章節內容不符
章節內容空白
章節內容殘缺
上下章節連動錯誤
小說很久沒更新了
章節顯示『本章節內容更新中』
其他訊息