總是好奇:電腦是如何讀懂程式碼?電腦不是0和1的邏輯電路構成的嗎、為什麼在寫程式的時候不用寫一大堆0與1就能與它溝通?如果它跑得動,不就代表他中間有經過處理、剖析、那它到底是怎麼運作的?我能不能夠過逆向來更加了解電腦(CPU)的運作邏輯?打CTF的時候很常遇到Reverse題目,有哪些工具、技巧可以運用?惡意程式到底有什麼行為、我應該如何分析?
為什麼要逆向工程 (Reverse Engineering)? 當今世界的運作,縱然有些科技你無需了解其原理,但你卻能感受到缺了它,生活便會極度不便。比方說,大...
學習一門新的程式語言,大多會從 Hello world 切入。完成後,總覺得離這門語言更親近一步XD Day2,我會講解如何使用組合語言寫 Hello worl...
今天的重頭戲,正是逆向昨天剛寫好的 Hello world,從反方向觀察程式碼的長相。如果運用得宜,你可以更了解程式的具體行為。在生活中,逆向工程使用時機就好比...
一般而言,系統會將程式碼與 data 分離,所以才會有分段的產生,因此不同目的程式碼對系統而言儲存的位置也不同。 資料的分段(Section) 縱覽 我先用一張...
記憶體在電腦中扮演極重要的角色。生活中,每次想多開幾個瀏覽器,電腦就開始 lag 甚至最後當機、跑不動,與記憶體的使用息息相關。本篇中,會說明程式在記憶體中的配...
我在 Day2 的文章裡有講到暫存器(e.g. eax, ebx),可能對初學者而言相對陌生。這篇主要來介紹這些暫存器代表的意義與使用時機。 為什麼要使用暫存器...
多數組合語言指令(instructions)需透過運算元(operand)來存取資料[可以把運算元想像成容器]。有一些指令不需要運算元即可存取資料,而另一些指令...
昨天我們知道:暫存器定址、立即定址、記憶體定址,是CPU 透過匯流排與記憶體互動時的不同方法。今天,來說明記憶體的定址方式。 記憶體定址 分成三類,直接存取、直...
今天來正式介紹一下 Intel x86 的指令。雖然前面已經偷渡了很多次XD,不過這裡分門別類的描述各個指令的使用時機。有點多,不過還是請讀者慢慢服用。 複製資...
介紹 Syscall (system call),中文翻成系統呼叫,可以把它理解成系統的 API (Application Programming Interf...