とりあえずCでコードを書いてみる。
$ vi test1.c
int f1(int a, int b)
{
int c;
c = a + b;
return c;
}
int main(int argc, char *argv[])
{
int a, b, c;
a = 1;
b = 2;
c = f1(a, b);
return 0;
}
$ ls
test1.c
次に、-g付きでコンパイル
$ gcc -g -o test1 test1.c $ ls -F test* test1.c
objdumpを使って、できた実行ファイルを見てみる。 -dは逆アセンブルするオプション。-Sは対応するソースコードを表示(gcc -gでコンパイルする必要あり)。
$ objdump -Sd ./test1 | lv
・
・
・
08048354 <f1>:
int f1(int a, int b)
{
8048354: 55 push %ebp
8048355: 89 e5 mov %esp,%ebp #ベースポインタ(%ebp)の設定
8048357: 83 ec 04 sub $0x4,%esp #スタックポインタ(%esp)の設定
int c;
c = a + b;
804835a: 8b 45 0c mov 0xc(%ebp),%eax #変数aの値を%eaxに代入
804835d: 03 45 08 add 0x8(%ebp),%eax #変数bと%eaxを足す。結果は%eaxに入る
8048360: 89 45 fc mov %eax,0xfffffffc(%ebp) #%eaxを変数cに代入
return c;
8048363: 8b 45 fc mov 0xfffffffc(%ebp),%eax #returnの値は%eaxで渡す決まりなので、
} #変数cの値を%eaxへ代入
8048366: c9 leave
8048367: c3 ret #callした次のアドレスへ戻る。
#ここでは0x8048398に戻る
08048368 <main>:
int main(int argc, char *argv[])
{
8048368: 55 push %ebp
8048369: 89 e5 mov %esp,%ebp #ベースポインタ(%ebp)の設定
804836b: 83 ec 18 sub $0x18,%esp
804836e: 83 e4 f0 and $0xfffffff0,%esp
8048371: b8 00 00 00 00 mov $0x0,%eax
8048376: 29 c4 sub %eax,%esp #スタックポインタ(%esp)の設定
int a, b, c;
a = 1;
8048378: c7 45 fc 01 00 00 00 movl $0x1,0xfffffffc(%ebp) #変数aに1を代入
b = 2;
804837f: c7 45 f8 02 00 00 00 movl $0x2,0xfffffff8(%ebp) #変数bに2を代入
c = f1(a, b);
8048386: 8b 45 f8 mov 0xfffffff8(%ebp),%eax #f1()を呼ぶときの引数を準備
8048389: 89 44 24 04 mov %eax,0x4(%esp) #変数a,bの値をスタックに代入している
804838d: 8b 45 fc mov 0xfffffffc(%ebp),%eax
8048390: 89 04 24 mov %eax,(%esp)
8048393: e8 bc ff ff ff call 8048354 <f1> #関数f1()を呼ぶ。
8048398: 89 45 f4 mov %eax,0xfffffff4(%ebp) #戻り値は%eaxに入ってるので、それを変数cに代入
return 0;
804839b: b8 00 00 00 00 mov $0x0,%eax
}
80483a0: c9 leave
80483a1: c3 ret
80483a2: 90 nop
80483a3: 90 nop
80483a4: 90 nop
・
・
・
見るポイント
明日発売のハッカージャパン9月号に、チームチドリで執筆したCTFの予選参戦記が掲載されます。おたのしみにー。
最近、非常に暑い日が続いて自宅に帰ったときに部屋が超暑いので、 Twitterに「あついー」と書いたら、自宅のエアコンをONする仕掛けを Plaggerで作ってみました。
エアコンの制御には、BUFFALOの赤外線学習リモコン PC-OP-RS1を使いました。
config.yamlはこんな感じで。
plugins:
- module: CustomFeed::Twitter
config:
username: twitterのユーザ
password: twitterのパスワード
- module: Filter::Rule
rule:
- module: Fresh
mtime:
path: /Users/yoggy/plagger/fresh.tmp
autoupdate: 1
- module: Filter::Rule
rule:
expression: $args->{entry}->{title} =~ /あついー/
- module: Publish::Pipe
config:
command: /Users/yoggy/plagger/irrc -d /dev/cu.usbserial-0000080c aon
単純に「あついー」という文字列が書いてあったら、 PC-OP-RS1を制御するirrcコマンドを実行しているだけです。
CustomFeed::Twitterの入手先はこちらから
PC-OP-RS1をコントロールするためのirrcコマンドについてはこちら
現在Mac miniで動かしているのですが、MacでPC-OP-RS1を 使えるようにするための手順はこちら。
念のために、これを動かすときは自己責任でお願いします。 Twitterの調子が悪くてエアコンがつかなかったり、部屋に誰もいないときに クーラーから水が落ちてきて水浸しになったりしても知りませんw