a

よろしくのキワミ

Reversing進捗9

Reversing進捗9

  • picoCTF assembly-0
  • picoCTF assembly-1

picoCTF assembly-0

問題文

What does asm0(0x2a,0x4f) return? Submit the flag as a hexadecimal value (starting with '0x').

NOTE: Your submission for this question will NOT be in the normal flag format. Source located in the directory at /problems/assembly-0_3_b7d6c21be1cefd3e53335a66e7815307. 

フラグの形式がpicoCTF{*********}のテンプレではないらしい。

ソースコードが落とせるので中を見てみる。

.intel_syntax noprefix
.bits 32

.global asm0

asm0:
        push    ebp
        mov     ebp,esp
        mov     eax,DWORD PTR [ebp+0x8]
        mov     ebx,DWORD PTR [ebp+0xc]
        mov     eax,ebx
        mov     esp,ebp
        pop     ebp
        ret

機械語の基本的なことをわかっていれば簡単に溶ける問題だ。

0x2aと0x4fを

        mov     eax,DWORD PTR [ebp+0x8] // 0x2a
        mov     ebx,DWORD PTR [ebp+0xc] // 0x4f

の部分に当てはめる。 mov eax,ebxとしているので、帰ってくるeaxの中には0x4fが入っていることがわかる。

picoCTF assembly-1

問題文

What does asm1(0xc8) return? Submit the flag as a hexadecimal value (starting with '0x').

NOTE: Your submission for this question will NOT be in the normal flag format. Source located in the directory at /problems/assembly-1_4_99ac7ff5dfe75417ed616e35bfc2c023. 

ソースコードの中を見る。

.intel_syntax noprefix
.bits 32

.global asm1

asm1:
        push    ebp
        mov     ebp,esp
        cmp     DWORD PTR [ebp+0x8],0x9a
        jg      part_a
        cmp     DWORD PTR [ebp+0x8],0x8
        jne     part_b
        mov     eax,DWORD PTR [ebp+0x8]
        add     eax,0x3
        jmp     part_d
part_a:
        cmp     DWORD PTR [ebp+0x8],0x2c
        jne     part_c
        mov     eax,DWORD PTR [ebp+0x8]
        sub     eax,0x3
        jmp     part_d
part_b:
        mov     eax,DWORD PTR [ebp+0x8]
        sub     eax,0x3
        jmp     part_d
        cmp     DWORD PTR [ebp+0x8],0xc8
        jne     part_c
        mov     eax,DWORD PTR [ebp+0x8]
        sub     eax,0x3
        jmp     part_d
part_c:
        mov     eax,DWORD PTR [ebp+0x8]
        add     eax,0x3
part_d:
        pop     ebp
        ret

0xc8の返す値を調べればいいらしい(英語力不足)

[ebp+0x8]の中が0xc8だと思うのでそう考えながら読んでいく。

実行されるとまず引数と0x9aを比較して分岐している部分がある。

cmp     DWORD PTR [ebp+0x8],0x9a
jg      part_a

0xc80x9aを比較し、0x8aが大きければpart_aにジャンプする。
この場合は小さいのでジャンプすることなく次の処理に進む。

するとまた比較の処理が出てくる。

cmp     DWORD PTR [ebp+0x8],0x8
jne     part_b

今度は0xc80x8を比較し、同じでなければpart_bへジャンプする。

0xc80x8は違う値なのでpart_bの処理へジャンプする。

part_b:
        mov     eax,DWORD PTR [ebp+0x8]
        sub     eax,0x3
        jmp     part_d
        cmp     DWORD PTR [ebp+0x8],0xc8
        jne     part_c
        mov     eax,DWORD PTR [ebp+0x8]
        sub     eax,0x3
        jmp     part_d

eaxに移動させた0xc8から0x3を引き、part_dへジャンプする。
引いたので今eaxに入っている値は0xc5になっている。

part_d:
        pop     ebp
        ret

終わった・・・

ソースコードの中を延々とぐるぐるさせられると思っていたのでほっとした。

感想

もうpicoで収まる器ではなかったと感じた。

プライバシーポリシー お問い合わせ