首先看下phase_5的反彙編**
0x0000000000401062 <+0>: push rbx
0x0000000000401063 <+1>: sub rsp,0x20
0x0000000000401067 <+5>: mov rbx,rdi
0x000000000040106a <+8>: mov rax,qword ptr fs:0x28
0x0000000000401073 <+17>: mov qword ptr [rsp+0x18],rax
0x0000000000401078 <+22>: xor eax,eax
0x000000000040107a <+24>: call 0x40131b 0x000000000040107f <+29>: cmp eax,0x6 # 比較字串長度,可見字串長度不等於6會觸發**
0x0000000000401082 <+32>: je 0x4010d2 0x0000000000401084 <+34>: call 0x40143a 0x0000000000401089 <+39>: jmp 0x4010d2 0x000000000040108b <+41>: movzx ecx,byte ptr [rbx+rax*1] # 將我們輸入的第rax個字元放到ecx中
0x000000000040108f <+45>: mov byte ptr [rsp],cl
0x0000000000401092 <+48>: mov rdx,qword ptr [rsp]
0x0000000000401096 <+52>: and edx,0xf # 與0b1111與操作,即取最低4位
0x0000000000401099 <+55>: movzx edx,byte ptr [rdx+0x4024b0]
# 最關鍵的一步,將rdx+0x4024b0位址中的字元放入edx,再放入rsp+rax*1+0x10中。
在之後的**中可以看到這個地方就是我們要拿來比較的兩個字串之一,
意思是我們要構造這個字串與另乙個字串相同,這樣就可以通過了。
0x00000000004010a0 <+62>: mov byte ptr [rsp+rax*1+0x10],dl
0x00000000004010a4 <+66>: add rax,0x1
0x00000000004010a8 <+70>: cmp rax,0x6
0x00000000004010ac <+74>: jne 0x40108b # 迴圈6次,每次eax+1
0x00000000004010ae <+76>: mov byte ptr [rsp+0x16],0x0
0x00000000004010b3 <+81>: mov esi,0x40245e # 0x40245e位址中儲存的是我們要比較的另乙個字串之一。使用 x/s檢視可知其為'flyers'
0x00000000004010b8 <+86>: lea rdi,[rsp+0x10]
0x00000000004010bd <+91>: call 0x401338 0x00000000004010c2 <+96>: test eax,eax
0x00000000004010c4 <+98>: je 0x4010d9 0x00000000004010c6 <+100>: call 0x40143a 0x00000000004010cb <+105>: nop dword ptr [rax+rax*1+0x0]
0x00000000004010d0 <+110>: jmp 0x4010d9 0x00000000004010d2 <+112>: mov eax,0x0
0x00000000004010d7 <+117>: jmp 0x40108b 0x00000000004010d9 <+119>: mov rax,qword ptr [rsp+0x18]
0x00000000004010de <+124>: xor rax,qword ptr fs:0x28
0x00000000004010e7 <+133>: je 0x4010ee 0x00000000004010e9 <+135>: call 0x400b30 <__stack_chk_fail@plt>
0x00000000004010ee <+140>: add rsp,0x20
0x00000000004010f2 <+144>: pop rbx
0x00000000004010f3 <+145>: ret
大致看一下反彙編**,就知道這個又是乙個字串比較的,我們需要通過輸入6個字元,構造出與位址0x40245e中的字串相等的字串(『flyers』),構造的方法是取輸入6個字元的低4位加上某個位址0x4024b0得到乙個新位址,這個新位址中的字元就是構造後的字元,我們需要其分別為f、l、y、e、r、s。
(gdb) x /s 6305984
0x6038c0 : "flyers"
再看一下0x4024b0中的內容是啥:
(gdb) x /s 0x4024b0
0x4024b0 : "maduiersnfotvbylso you think you can stop the bomb with ctrl-c, do you?"
不難看出,在0x4024b0中序號為9,15,14,5,6,7的字元分別為f,l,y,e,r,s。這就是我們要找的。但是這幾個數字對應的ascii碼都是不可列印的,咋辦??我們看到反彙編**中有一句:
0x0000000000401096 <+52>: and edx,0xf # 與0b1111與操作,即取最低4位
這意味著,我們輸入的字元只要最後4位的值為9,15,14,5,6,7即可,於是我們可以將其值加上64得到73,79,78,69,70,71,再通過查詢ascii碼表,我們可以得到輸入的字串為:
ionefg
輸入後即可通過… 深入理解計算機系統
關鍵路徑是在迴圈的反覆執行中形成的資料相關鏈。迴圈展開是一種程式變換,通過增加每次迭代計算的元素的數量,減少迴圈的迭代次數。重新結合變換能夠減少計算中關鍵路徑上操作的數量,通過更好地利用功能單元的流水線能力得到更好的效能。浮點運算不保證是可結合的,通常迴圈展開和並行地累積在多個值中,是提高程式效能的...
《深入理解計算機系統》
知乎 深入理解計算機系統 這本書需要什麼水平能看懂?15 213 18 218 15 513 introduction to computer systems schedule fall 2016 鏈結失效則 cmu15 213的課程主頁,有ppt,還有錄影,主講人就是這本書的作者。備註 備註 詳細...
深入理解計算機系統
系統的硬體組成 快取記憶體 作業系統管理硬體 程序虛擬記憶體 檔案amdahl定律 併發和並行 0和1組成的位序列,又稱為位元序列,8個位被組織成一組,成為位元組。每個位元組表示程式中的某些文字字元。系統中的所有資訊 包括磁碟檔案 記憶體中的程式 記憶體中存放的的使用者資料以及網路上傳送的資料,都是...