iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 11
2
Security

我搶到旗子了!30天CTF入門系列 第 11

Day11 [Reverse] 不要看到組合語言就跑阿!

今天開始是逆向工程的系列,逆向工程是在做什麼什麼呢?
最廣為人知的大概就是遊戲外掛了,透過分析得知遊戲的內部流程進而開發出遊戲外掛,或是破解一些程式、找到程式中的漏洞等等
那這邊的介紹就是介紹一些基本的工具、怎麼進行逆向工程,還有最重要的組合語言,不過我想大概很多人看到組合語言就直接上一頁了,雖然我對組合語言也很頭痛,不過就透過這次機會好好學吧~

一樣按照慣例先來三題基本熱身題


這題他給了一個程式,那提示說我們要怎麼利用命令列執行這個程式呢

$ ./run
picoCTF{welc0m3_t0_r3VeRs1nG}

對 就是熱身題

這邊他給了一串Base64的格式要我們轉成ASCII,那這邊推薦一個很好用的進位轉換的網站

這裡只要將base64的值輸入到對應的框框裡,按下Convert就成功轉換成各種格式了
那這邊轉出來的結果是 th4t_w4s_s1mpL3 提交時記得要加上picoCTF{}才會通過!


這一題說 asmO(0xaa,0xf2)這個函數的回傳值是多少,那我們先把題目的檔案下載下來
cat intro_asm_rev.S 會顯示一段組合語言

那這邊介紹一下呼叫函式時stack的概念

在呼叫函式之前我們有幾個動作要做,先把所有參數push到堆疊上面
以 asm0(0xaa,0xf2)來說會由push
所以順序是
push 0xf2
push 0xaa
add esp 0x08(因為記憶體每一格是4個byte這邊我們push兩個要esp+8)

esp:永遠指在stack的最上面,也就是位址最低
ebp:固定不動ebp與esp所形成的範圍就是函數的stack範圍

所以這時候整個stack 如下

再來進到函式會先把ebp push進來,再來將使ebp跟esp指到同一個位置 mov ebp,esp
目前的Stack 如下

所以目前ebp與esp會指向同一個位址
那再來將eax暫存器放入ebp+8的值 也就是0xaa mov eax,DWORD PTR [ebp+0x8]
再將ebx暫存器放入ebp+C的值 也就是0xf2 mov eax,DWORD PTR [ebp+0xC]
最後在讓eax=ebx 所以這時eax的值(0xaa)被ebx(0xf2)的值蓋過去了 mov eax,ebx
所以這時eax=0xf2 也就是我們要傳回的值
那最後結束函式之前要將往上跑的esp叫回來 mov esp,ebp 所以ebp與esp之間的資料就當作消失了,不過在這題esp沒有往上跑,但還是要知道這個概念,最後將ebp pop掉就可以以剛剛push進來的return address會被pop至eip中,就知道要回到原本的呼叫函式的位址繼續執行

這題的Flag就是 picoCTF{0xf2}


最後這個stack的概念對於剛開始接觸的人會比較難以理解,建議可以多看幾次,網路上也有很多資源包括這題題示也有一些組合語言、暫存器的概念,多看幾次可以的話也可以自己追蹤看看,懂了之後看見組合語言就不會想按上一頁啦~


上一篇
Day10 [Web] 天然純手工HTTP request
下一篇
Day12 [Reverse] 電腦不夠快怎麼辦
系列文
我搶到旗子了!30天CTF入門30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言