大家可以先到 picoCTF 2019 這個平台看看
裡面就有個 Reverse Engineering
這個分類
除了逆向還有其他之前介紹過的類型
大家也可以玩玩看
首先我們來看看這題
最最最基本的組合語言
題目敘述中告訴我們 asm1
是一個函數
並且在 call 這個 function 時放入參數 0x4f3
在這邊參數會被放在 ebp+0x8
的位置
大家先記著
這部分會留到 Pwn 的時候再做詳細說明
我們直接從第四行開始看
首先將我們的的參數跟 0x45d
做比較
然後第二行的 jg
是說如果上面的 cmp
比較結果是大於的話就跳到指定位置 <asm1+37>
也就是這份 code 的第 14 行啦~
直接跳過去的意思就是中間的都不用做事喔
直接到指定位置再開始做事就好
所以接著是將參數跟 0x7cd
比較jne
就是問說是否不相等
如果是就跳到 <asm1+54>
的位置上
所以當然跳因為 0x4f3
不等於 0x7cd
嘛~
接著就是將我們的參數 ebp+0x8
這個位置的值放到 eax 這個暫存器中
還記得上一篇說的嗎
任何的運算都需要透過暫存器
然後就是把 eax 加上 0x17
所以答案就是 0x50a
囉~
這邊補充一點小東西
就是上面那些 jne
啦,jg
啦
是如何判斷前一段的 cmp
是大是小呢
在組語中有幾個重要的暫存器叫做 flag
其用來表示一些程式運行上重要的狀態
在這邊介紹幾個重要且常見的
名稱 | 功能 |
---|---|
CF (Carry Flag) | 最高位元是否有進位 |
ZF (Zero Flag) | 運算後是記憶體否為 0 |
SF (Sign Flag) | 運算後是否為負數(有號數最高位為 1) |
OF (Overflow Flag) | 運算後是否有 overflow |
比如說上面題目遇到的 jne
在 cmp
比較時會將前面的值與後面的值相減
所以 0x4f3 - 0x7cd
不等於 0
那 ZF=0
這樣就代表不相等了~
再比如說 jg
兩數相減如果 SF=0 && ZF=0
就代表成立
因此上面的 0x4f3 - 0x45d
出來的值是正數且不為 0 (就是不相等啦)
所以就也會達成條件囉~