眠気

戯言とメモ

advnt

暇つぶしアセンブラ

今日も誰も書かないので、適当に。

もう半分くらい自分の記事になってきた…

あとだんだん書くネタが無くなってきたこの頃。


この記事は OIC ITCreate Club Advent Calendar 2015 12日目(12/12)の記事です。

セキュリティキャンプ・キャラバンで拝聴した中島さんのアセンブリ読経がとても良かったので、最近の暇つぶしはもっぱらアセンブリ読経になっている。

gccの最適化とかさせてみる遊び。(mainのみ

$ cat code.c 
#include <stdio.h>

int main(){
    int n=10;
    n++;
    printf("%d",n);
    return 0;
}

適当なCを書く。

とりあえず最適化を無効にしてビルド。

$ gcc -mpreferred-stack-boundary=2 code.c -O0 -o ex
$ objdump -d -M intel --no-show-raw-insn ex

0804841d <main>:
 804841d:       push   ebp
 804841e:       mov    ebp,esp
 8048420:       sub    esp,0xc
 8048423:       mov    DWORD PTR [ebp-0x4],0xa
 804842a:       add    DWORD PTR [ebp-0x4],0x1
 804842e:       mov    eax,DWORD PTR [ebp-0x4]
 8048431:       mov    DWORD PTR [esp+0x4],eax
 8048435:       mov    DWORD PTR [esp],0x80484e0
 804843c:       call   80482f0 <printf@plt>
 8048441:       mov    eax,0x0
 8048446:       leave  
 8048447:       ret 

上のコードの通り、[ebp-0x4]に0xa(10)をmovして、それに0x1をaddしている。

最適化オプションを指定してみる。

$ gcc -mpreferred-stack-boundary=2 code.c -O1  -o ex1
$ objdump -d -M intel --no-show-raw-insn ex1

0804843d <main>:
 804843d:       sub    esp,0xc
 8048440:       mov    DWORD PTR [esp+0x8],0xb
 8048448:       mov    DWORD PTR [esp+0x4],0x8048500
 8048450:       mov    DWORD PTR [esp],0x1
 8048457:       call   8048330 <__printf_chk@plt>
 804845c:       mov    eax,0x0
 8048461:       add    esp,0xc
 8048464:       ret 
 

[esp+0x8]に直接0xb(11)をmovしている。

最初の2行とか、eaxに[ebp-0x4]を入れて戻してみたいな処理が削られている。

サイズの最適化オプションを指定してみる。-Os

$ gcc -mpreferred-stack-boundary=2 code.c -Os  -o exs
$ objdump -d -M intel --no-show-raw-insn exs

08048340 <main>:
 8048340:       push   ebp
 8048341:       mov    ebp,esp
 8048343:       push   0xb
 8048345:       push   0x80484e0
 804834a:       push   0x1
 804834c:       call   8048330 <__printf_chk@plt>
 8048351:       xor    eax,eax
 8048353:       leave  
 8048354:       ret 

mov処理がpushに変わっている。最後のmovもxorに変わってたりしてて面白い。

適当にコードを書いて、ビルドして、印刷して持ち歩くことによって暇つぶしになる。

オプション

最適化オプション


  • もっとCTFのバイナリ問題が解けるようになりたい。
  • Base64読みたかった。