在 CTF 的 Reverse / Pwn 題裡,會常常碰到要讀懂一小段 assembly 才能找到 flag 或漏洞。學會看組合語言、認識寄存器與 calling convention,就能在很多題目裡快攻破點關鍵。
rax, rbx, rcx, rdx, rsi, rdi, rbp, rsp, rip 等。eax, ebx...)。r0-r12 / x0-x30。在做題前先確認 binary 的架構:file ./binary
cmp / test + je/jne/jg/jl —— 通常是驗證邏輯mov 把結果放到某個地方mov [rbp-0x20], rax、mov al, [rdi] —— 對應到 buffer/字串讀寫,找 buffer overflow 點或字串比較。objdump -s -j .rodata 可查看。mov dst, src:複製/讀寫。lea reg, [mem]:load effective addresspush/pop:stack 操作。call / ret:函式呼叫/返回。cmp a,b / test a,b:比較 / 檢查 0。je/jne/jg/jl/ja/jb:條件跳轉(根據 flags)。xor reg, reg:清零或 XOR;常見 xor rax, rax。inc/dec:+1 / -1。add/sub:加減。這題給了一個反組譯程式問輸入0x2e0會回傳什麼
asm1:
	<+0>:	push   ebp
	<+1>:	mov    ebp,esp
	<+3>:	cmp    DWORD PTR [ebp+0x8],0x3fb
	<+10>:	jg     0x512 <asm1+37>
	<+12>:	cmp    DWORD PTR [ebp+0x8],0x280
	<+19>:	jne    0x50a <asm1+29>
	<+21>:	mov    eax,DWORD PTR [ebp+0x8]
	<+24>:	add    eax,0xa
	<+27>:	jmp    0x529 <asm1+60>
	<+29>:	mov    eax,DWORD PTR [ebp+0x8]
	<+32>:	sub    eax,0xa
	<+35>:	jmp    0x529 <asm1+60>
	<+37>:	cmp    DWORD PTR [ebp+0x8],0x559
	<+44>:	jne    0x523 <asm1+54>
	<+46>:	mov    eax,DWORD PTR [ebp+0x8]
	<+49>:	sub    eax,0xa
	<+52>:	jmp    0x529 <asm1+60>
	<+54>:	mov    eax,DWORD PTR [ebp+0x8]
	<+57>:	add    eax,0xa
	<+60>:	pop    ebp
	<+61>:	ret    
我們順著程式邏輯看下去
<+10>會判斷是否>0x3fb,答案為否所以不跳轉<+19>會判斷是否不=0x280,答案為是,所以跳轉到<+29><+29> eax = 0x2e0<+32> eax = eax - 0xa = 0x2d6,然後跳到<+60>
所以最後回傳的就是eax的值就是0x2d6
以上就是今天的內容啦
想看更多,記得明天再來喔~