2012-03-10 82 views
2

這是作業。提示只,沒有確切的答案請。無源代碼調試程序(Unix/GDB)

我有一個編譯的程序(無源代碼),它接受命令行參數。有一個給定數量的命令行參數的正確序列,將使程序打印出「成功」。鑑於錯誤的論據,它會打印出「失敗」。

有一件令我困惑的事情是,指令提到兩個系統工具(不會命名它們),這將有助於找出正確的參數。我熟悉的唯一工具(除非我忽略了一些東西)是GDB,所以我相信我錯過了這個挑戰的關鍵部分。

挑戰是找出正確的論點。到目前爲止,我已經在GDB中運行該程序,並在main處設置了一個斷點,但我真的不知道該從哪裏去。任何專業提示?

+0

什麼操作系統(精確)? – jlliagre 2012-03-11 09:17:04

回答

2

您確定要調試嗎?拆解它會更容易。當你拆開它尋找cmp

1
  1. 存在着不僅工具進行反編譯X86二進制文件彙編代碼列表,但也有一些它試圖展現更高層或可讀上市。嘗試使用Google,看看你找到了什麼。我會具體的,但是,如果你的工作是學習一些逆向工程技能,那將會適得其反。

  2. 有可能代碼是這樣的:如果Arg(1)='FOO',然後打印「成功」。所以你可能根本不需要反彙編。相反,您可能只需找到一個工具,該工具將可執行文件中的所有字符串轉儲爲ASCII字符序列。如果您要輸入的序列不在從鍵盤輕鬆輸入的一組字符中,則存在許多將執行此操作的實用程序。如果程序的構造非常小心,作者將不會留下「FOO」,如果那是明顯的「密碼」,但會試圖掩蓋它。

1

就我個人而言,我會從該程序的ltrace開始,使用任意任意一組參數。然後,我會使用strings命令,並從中猜出隱藏的參數文字可能是什麼。 (暫時假設教授沒有對字符串進行加密或混淆,並且它們以文字形式出現在二進制文件中)。然後再試一次或兩次(或必要的號碼,如果是號碼)。

如果幸運的話,程序將被編譯並提供給您,而不會運行strip。在這種情況下,您可能需要符號表來提供幫助。然後你可以嘗試單步執行程序(閱讀gdb手冊)。它可能很乏味,但有一些方法可以設置一個斷點並告訴調試器通過一些函數調用(比如標準庫中的任何函數)運行,並在返回時停止。重複執行此操作(確定將它調入標準或外部庫的位置,在返回後爲下一條指令設置斷點,讓gdb通過調用運行該流程,然後檢查代碼正在執行的操作)

耦合與ltrace應該很容易看到strcmp()(或類似的)調用的順序。當你看到你的輸入被比較的字符串時,你可以跳出整個過程並重新調用gdb和程序用這一個參數追蹤下一個等等,或者你可以學習一些更高級的技巧,並且實際上修改你的參數向量並從頭開始重新啓動main()

它實際上聽起來很有趣,我可能會讓我的妻子爲我嘗試一個簡單的二進制文件。它也可能創建一個小程序來生成這種二進制文件。我正在考慮提供參數「密碼」的源代碼中的#INCLUDE,以及從/ usr/dict/words中選擇三到五個單詞的make文件,從模板生成#INCLUDE文件,然後編譯使用該序列的二進制文件。