2015-02-07 83 views
0

這個任務是解釋一些彙編代碼,找到一個沒有調用「爆炸炸彈」即可運行的短語。我使用gdb來反彙編當前階段。我被卡住了,關於我是否正朝着正確的方向前進的建議將非常感激。試圖反彙編

0x0000000000400fb5 <+0>: sub $0x18,%rsp   
0x0000000000400fb9 <+4>: lea 0x8(%rsp),%r8 
0x0000000000400fbe <+9>: lea 0xf(%rsp),%rcx 
0x0000000000400fc3 <+14>: lea 0x4(%rsp),%rdx 

我相信發生的是我們正在查看%rsp中的短語(基指針指向什麼)。我認爲這是保存在內存中的四件事,在(%rsp),0x4(%rsp),0x8(%rsp)和0xf(%rsp),我認爲它使三個整數和其他東西,但我不肯定是什麼。

0x0000000000400fc8 <+19>: mov $0x4028f6,%esi   

地址$ 0x4028f6處的值爲「%d%c%d」。我知道它正在註冊%esi,但我不確定這是如何使用的。

0x0000000000400fcd <+24>: mov $0x0,%eax    
0x0000000000400fd2 <+29>: callq 0x400c80 <[email protected]> 

不知道這裏發生了什麼事。我看着0x400c80,發現以下情況:

0x0000000000400c80 <+0>: jmpq *0x20340a(%rip)   
0x0000000000400c86 <+6>: pushq $0x12 
0x0000000000400c8b <+11>: jmpq 0x400b50 

我沒有看到被用作寄存器%撕裂,所以我不太清楚怎麼做,或在哪裏看。我認爲它將0x12放在%eax中,但是我不確定它跳到哪裏,因爲0x400b50不是有效的地址。不管怎樣,回到原來的功能:

0x0000000000400fd7 <+34>: cmp $0x2,%eax    
0x0000000000400fda <+37>: jg  0x400fe1 <phase_3+44> 
0x0000000000400fdc <+39>: callq 0x401719 <explode_bomb> 

我認爲我們只是把爲0x18在%eax中,所以它肯定會比0X2更大,程序將跳過「引爆炸彈」。我只想知道我在那裏搞亂了什麼。

回答

0

不幸的是,你似乎缺少關鍵知識。你應該重新訪問你可能擁有的任何材料,否則你將不會有太多的運氣,而其餘的任務實際上會涉及一些不那麼簡單的代碼。

這就是說,你所引述到目前爲止,只有塊將執行以下操作:

int x, y; 
char c; 
if (sscanf(foo, "%d %c %d", &x, &c, &y) <= 2) explode_bomb(); 

第一塊分配3個局部變量,並加載每個地址到相應的寄存器進行相應的sscanf參數。需要注意的是X86-64調用約定使用的寄存器rdirsircxrdxr8r9的前六個參數(假設他們是合適的),數值在rax返回。

你不需要看0x400c80,你只能找到最終跳到sscanf本身的PLT條目。我們已經知道它是符號名稱中的sscanf

0

這將是更多的樂趣,如果你自己看着辦吧,所以我就放棄提示

  • 從棧指針中減去被分配用於本地範圍變量空間的一個相當標準的方式進入時一個函數

  • 谷歌的英特爾操作碼,例如「lea」就像「加載有效地址」。它不加載數據

  • 谷歌sscanf,這是一個標準的C庫函數,並且有一個C99 C語言標準。它從字符串中讀取數據,並獲取一個數據字符串,一個帶%轉義字符的格式字符串,以及指向放置掃描和轉換數據的變量的指針。不需要追蹤sscanf的內部結構,但可以查找其返回值

  • C函數通常以%eax返回結果。 %eax中被調用之前清零,並調用後進行測試,避免了炸彈(或沒有)有條件成果的基礎上

這應該給你足夠的數字出來。玩的開心!