2014-10-18 50 views
-3

希望你能幫助我瞭解如何找出六個數字。曾嘗試過幾組數字,我認爲是正確的,但猜測我不理解它的權利。瞭解炸彈實驗室

因此,對於第一個,我正在尋找的這六個數字,是不是數字是我爲了適應代碼而輸入的結果或數字?

我必須通過所有的代碼或只有幾行我可以找出這些數字嗎?開始認爲我在想這件事,那麼找到這些數字,然後嘗試我的方法就容易多了。

08048b74 <phase_2>: 
8048b74:  53      push %ebx 
8048b75:  83 ec 38    sub $0x38,%esp 
8048b78:  8d 44 24 18    lea 0x18(%esp),%eax 
8048b7c:  89 44 24 04    mov %eax,0x4(%esp) 
8048b80:  8b 44 24 40    mov 0x40(%esp),%eax 
8048b84:  89 04 24    mov %eax,(%esp) 
8048b87:  e8 28 07 00 00   call 80492b4 <read_six_numbers> 
8048b8c:  83 7c 24 18 00   cmpl $0x0,0x18(%esp) 
8048b91:  79 22     jns 8048bb5 <phase_2+0x41> 
8048b93:  e8 dd 06 00 00   call 8049275 <explode_bomb> 
8048b98:  eb 1b     jmp 8048bb5 <phase_2+0x41> 
8048b9a:  89 d8     mov %ebx,%eax 
8048b9c:  03 44 9c 14    add 0x14(%esp,%ebx,4),%eax 
8048ba0:  39 44 9c 18    cmp %eax,0x18(%esp,%ebx,4) 
8048ba4:  74 05     je  8048bab <phase_2+0x37> 
8048ba6:  e8 ca 06 00 00   call 8049275 <explode_bomb> 
8048bab:  83 c3 01    add $0x1,%ebx 
8048bae:  83 fb 06    cmp $0x6,%ebx 
8048bb1:  75 e7     jne 8048b9a <phase_2+0x26> 
8048bb3:  eb 07     jmp 8048bbc <phase_2+0x48> 
8048bb5:  bb 01 00 00 00   mov $0x1,%ebx 
8048bba:  eb de     jmp 8048b9a <phase_2+0x26> 
8048bbc:  83 c4 38    add $0x38,%esp 
8048bbf:  5b      pop %ebx 
8048bc0:  c3      ret 
+0

目前尚不清楚,不管你是問接通。 – chbaker0 2014-10-18 00:07:52

+0

六個數字是什麼? – Degustaf 2014-10-18 00:08:57

+0

我在一個ssh中使用gdb,我試圖找到正確的6個數字,所以我的炸彈不會被打擊,我應該從這個彙編代碼中找出這6個數字。 如果不清楚,我很抱歉,但我試圖自己理解它,並且一直堅持了兩天它的工作原理。 – user3399655 2014-10-18 00:12:23

回答

3

@ user3399655,你只需要閱讀函數反彙編,並理解它的作用。當你理解它時,你將需要輸入的六個數字是清楚的。

  1. 首先,你知道是什麼在拆卸每個指令呢? (PUSH,SUB,LEA,MOV,CALL,CMP ...)如果沒有,請在Intel's Developer Manuals中查找您不認識的人。你需要手冊2A-C。如果您不明白指令的定義,請在此處詢問具體的問題。

  2. 您是否理解調用堆棧的概念?你知道如何分配堆棧上的變量空間,以及如何在程序集中訪問它們?否則,您將無法理解此功能。

  3. 你知道C控制結構如if...elsefor(;;)是如何轉化爲組件的嗎?嘗試打印您發佈的反彙編,並繪製顯示每個有條件/無條件跳轉指令的地方的箭頭。作爲一個提示,它看起來像這個函數有2個if塊和一個單一的循環。你能看出哪些跳轉是哪個控制結構的一部分?

  4. 好的,另一個提示。一個if塊通常轉換爲條件跳轉,如果條件爲false,則跳轉超過塊的內容。如果條件爲真,則不會跳轉,並且直到塊的內容。 (這是否有意義?如果需要,可以考慮一分鐘。)如果結束循環的條件未滿足,則循環轉換爲跳轉的條件跳轉。

  5. 循環有一個索引變量。你能看到索引變量保存在哪個寄存器中嗎?你能說出它是升高還是降低?在循環終止之前它有多遠?

  6. 你可以告訴phase_2的堆棧框架中的6個數字將保留在哪裏嗎?每個字節使用多少個字節?如果需要,您可以嘗試閱讀read_six_numbers的代碼。或者只是在調試器中運行代碼,然後查看堆棧。

+0

+1不用勺子喂他 – Leeor 2014-10-19 19:45:43

+0

謝謝你給我時間來回答我的一些信息:) – user3399655 2014-10-19 20:24:09

+0

@ user3399655,迴應你所說的,循環變量不在EAX中。它是一個寄存器,它在循環開始時被初始化,在每次迭代時被添加到一次,並且用於CMP/JNE,當不滿足終止條件時跳轉到循環的開始。關於數字保存在堆棧中的位置,請嘗試在'gdb'中輸入「1 2 3 4 5 6」,'x/40w $ esp'(在'read_six_numbers'返回之後),然後查找這些數字。從'* $ esp'查看它們存儲的偏移量(以字節爲單位)。 – 2014-10-20 03:41:52

0

謝謝你給我時間回答我Alex D的一些信息:)這是很長的時間來評論你的答案。

  1. I'm理解其中大部分指令的一樣。我現在知道cmp是我必須注意的重要部分。

  2. 我想我知道一些關於調用堆棧。

  3. 我應該知道如果其他和在C被轉換成彙編。

  4. 我一直在用gdb監視它是如何通過循環(跳轉),現在跳到5跳,並停在第6跳,所以我認爲我越來越近了。

  5. 想象一下,如果我正在觀看gdb,它的EAX會越來越高。

  6. 不要以爲我能說出來。

再次謝謝你給的時間發表意見回來,認爲這將是更容易的燈光時,在我的腦海:)