大家可以先到 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 (就是不相等啦)
所以就也會達成條件囉~