僕と技術とセキュリティ

セキュリティエンジニアの備忘録

pwnのお勉強に便利なテクニック(CTF)の話

Pwnのお勉強に便利なテクニックをご紹介

普段CTFでPwnに取り組む時、ちょっとした時短になるコマンドを書き留めておきます。つよエンジニアの皆さんやPwnerの方は普段から実践されているテクニックだと思うが、まとめられているところはあまりなかったのでメモです。

目次

  • バイナリを実行する際のテク
    • 変更監視で時短
  • 視覚化テクニック
    • アセンブリをお手軽に見る方法
    • ちょっとした手間をお手軽にする方法

バイナリを実行する際のテク

変更監視で時短

ちょっとしたCのファイルを実行して動きを確認したい時に便利です。通常だと、この関数はどういう動きだったっけ?などの少しだけ確認したい場合にファイル開いて->コンパイルして->実行となるパターンを繰り返していますが、この作業、なかなか煩わしい一手間です。 そこで、変更監視にしてしまえば良いかということで色々ためしてしっくり来たのがこちら

https://qiita.com/tamanobi/items/74b62e25506af394eae5

本来はファイルの変更後に下記のようなコマンドを実行する必要があります。 echo_hello

int main(){
  printf("hello");
}
gcc echo_hello.c -o echo_hello
./echo_hello
hello # 出力結果

やりたいこと Cで書いたファイルを保存した際に 1. コンパイルする 2. 実行する

を実現したいので

上記の記事のファイルと組み合わせて実施しているコマンドがこちら。 ターミナル1

./mywatch.sh echo_hello.c 'gcc echo_hello.c -o echo_hello'

ターミナル2

./mywatch.sh echo_hello './echo_hello && echo "\n"'
hello # Cのファイル変更の都度実行結果が表示される

mywatch.shは↑で参照させていただいた記事よりコピペしています。 ターミナルを2つ開いて実行するのが便利です。実行結果だけ追うようにしているとコンパイルの失敗時に気づけなくなるため。 node.jsでGulp watchしている時にCで簡単に実行する方法ないかなと考えた結果こちらの方法を思いつきました。 makeで実施する場合にはnodeとかrubyで良きツールがいくらでも出ているためそちらを利用する方が圧倒的に楽です。あくまでPwnのための勉強用途にどうぞ。

視覚化テクニック

アセンブラで出力する方法や、バイナリ解析時にあのコマンドどうするのだっけ集です。

アセンブリをお手軽に見る方法

アセンブラに通る時どうなるんだっけ..?というのをすぐに確認する方法。gdbやobjdumpを利用すればすぐ確認できますが、起動するのも面倒だよというものぐさな方の覚書用途に

※hello.cというファイルをダンプした場合、hello.sというファイルが作成されます。

gcc hello.c -S -masm=intel

## %bb.0:
    push rbp
    .cfi_def_cfa_offset 16
    .cfi_offset rbp, -16
    mov  rbp, rsp
    .cfi_def_cfa_register rbp
    sub  rsp, 16

AT&T記法が好きな方は-masm=intelオプションを外してください。

gcc hello.c -S -g -masm=intel

ちょっとした情報をお手軽に見る方法

ちょっとした方法がわからない時に。調べれば3秒でわかることだけれどもしっておくと時短になるかもしれないテクニック?集。

  • asciiコードを知りたい
man ascii

~~
    The hexadecimal set:
40  @    41  A    42  B    43  C    44  D    45  E    46  F    47  G
     48  H    49  I    4a  J    4b  K    4c  L    4d  M    4e  N

それぞれ8進,10進,16進で確認できます。
0x41 は 'A'

また思い出した際に追記します...!