iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 16
0
Security

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

Day16[Reverse] 組合語言--暫存器運用

又是碰到組合語言的題目了,這種題目就只能自己看沒辦法利用ghidra的decompile
不過這類的題目都不是很難,基礎的觀念有了就很容易~


這題要我們解出asm3(0xfac0f685,0xe0911505,0xaee1f319)的傳回值是多少

這邊先把一開始的stack畫出來

這邊介紹一下暫存器的部份,一般在我們的電腦暫存器是64 bits但我們有時不需要用到這麼大的

以rax做範例,可以看到不同大小有不同的名稱,這題就會運用到這個觀念,我們直接來看看吧

以下就會針對一個一個指令做講解,所使用到的表格就是一個32 bits的暫存器


  • mov eax,0x27

這裡直接將0x27填入就好

0000 0000 0000 0000 0000 0000 0010 0111
  • xor al,al

自己對自己做xor就是全部歸零的意思,而且這邊我們也只有用到al,所以就是整個暫存器又回到0

0000 0000 0000 0000 0000 0000 0000 0000
  • mov ah,BYTE PTR [ebp+0xb]

[ebp+0xb]這又是什麼呢,他所代表的是[ebp+0x8]這個數字中的fa
還記得之前介紹過intel是使用littel endian的方式嗎,所以在記憶體中 0xfac0f685 這段數字的順序是

ebp+8 85
ebp+9 f6
ebp+a c0
ebp+b fa

將fa放到ah的位子

0000 0000 0000 0000 1111 1010 0000 0000
  • sal ax,0x10

sal是算術左移指令,不過這邊要注意,他是ax左移16個
會造成溢位,所以整串又變成0了

0000 0000 0000 0000 0000 0000 0000 0000

但這邊若是 sal eax,0x10 就會變成以下這樣,我一開始解的時候也沒注意看難怪怎麼提交都錯XD

1111 1010 0000 0000 0000 0000 0000 0000
  • sub al,BYTE PTR [ebp+0xc]

跟上面的意思一樣 [ebp+0xc]這個Byte的值是 05 不過因為目前al的值是0所以這邊可以將他視為-5
-5在二補數表示方式是

0000 0000 0000 0000 0000 0000 1111 1011
  • add ah,BYTE PTR [ebp+0xf]

[ebp+0xf]這個Byte的值是 e0

0000 0000 0000 0000 1110 0000 1111 1011
  • xor ax,WORD PTR [ebp+0x12]

這邊要看清楚他是從[ebp+0x12]取一個word一個word是2個bytes的意思
ae , e1這兩個bytes

這個word 表示的方式如下

0000 0000 0000 0000 1010 1110 1110 0001

與我們的ax做xor運算

運算完的結果如下

0000 0000 0000 0000 0100 1110 0001 1010

這個結果就是最終傳回的值 0x4e1a
記得提交的時候要加上 picoCTF{0x4e1a}


上一篇
Day15 [Reverse] 暴力解或許更快!?
下一篇
Day17[Reverse] 電腦不夠快怎麼辦(3)
系列文
我搶到旗子了!30天CTF入門30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言