Successfully reported this slideshow.

ctfで学ぼうリバースエンジニアリング

5

Share

Loading in …3
×
1 of 22
1 of 22

More Related Content

Related Books

Free with a 14 day trial from Scribd

See all

ctfで学ぼうリバースエンジニアリング

  1. 1. CTFで学ぼう! リバースエンジニアリング @junk_coken
  2. 2. 自己紹介 ● ジャンクさん(@junk_coken) ● どこかの留年しそうな専門学校生 ● セキュリティのことを勉強中 ● java女子部は昨年12月の部活からの超新参 ● CTF初心者 ● LT初です
  3. 3. リバースエンジニアリング、ご存知ですか?
  4. 4. リバースエンジニアリングとは ● 機械語である実行ファイル(.jarなど)から人間が 読めるソースコードを導き出すこと。 (一部の超人はバイナリ読んじゃう) ● マルウェア(ウイルス)の解析によく使われる手法 の一つ。
  5. 5. では、CTFはご存知ですか?
  6. 6. CTFとは ● Capture The Flagの略。 ● セキュリティ技術を競うコンテスト。 ● 有名なCTFでは日本では「SECCON」、 海外では 「DEFCON」などがある。 ● CTFで問われる技術の中に、 リバースエンジニアリングが存在する!
  7. 7. リバースエンジニアリング問題を 解いてみよう!
  8. 8. SECCON2015 Online CTF binary100 Reverse-Engineering Android APK 1 問題文:じゃんけんに1000回連続で勝ち続けよ rps.apk ← 実行ファイルが落ちてくる (解答は SECCON{hogehoge} の形式)
  9. 9. リバースエンジニアリングは難しい?
  10. 10. リバースエンジニアリングは難しい? ツールで簡単!!!!!
  11. 11. ざっくりリバースエンジニアリング 1. apkをzipとして解凍 2. 中のclasses.dexをdex2jarというツールでjarファイルに変換 3. 変換したjarをzipとして解凍 4. 中のclassファイルをjd-guiというツールで開く 参考: http://qiita.com/kasaharu/items/900fc937be80d87090ce http://d.hatena.ne.jp/ozuma/20130817/1376748772 _人人人人人人_>   完成   < ̄^Y^Y^Y^Y^Y ̄
  12. 12. 読める!! 読めるぞ!!
  13. 13. if (1000 == MainActivity.this.cnt) { localTextView.setText("SECCON{" + String. valueOf((MainActivity.this.cnt + MainActivity.this. calc()) * 107) + "}"); } つまり・・・ 解答:SECCON{ (1000+calc()の値) * 107 }
  14. 14. calc()とは何ぞや? static { System.loadLibrary("calc"); } public native int calc(); どうやらライブラリらしい・・・ libフォルダにlibcalc.soが存在
  15. 15. soファイルとは? ● Shared Objectという共有ライブラリ ● Linuxで扱われるELF形式の実行ファイル ● javaほどわかりやすい リバースエンジニアリングはできない 逆アセンブルをすることになる
  16. 16. x86フォルダ内のlibcalc.soをobjdumpで逆アセンブル! $ objdump -d libcalc.so <Java_com_example_seccon2015_rock_1paper_1scissors_ MainActivity_calc>: 400: b8 07 00 00 00 mov $0x7,%eax 405: c3 ret movは値をレジスタ(ここではeax)に格納する命令。 7をeaxに格納し、戻り値としてeaxを返している。 soファイルをリバースエンジニアリング!
  17. 17. x86フォルダ内のlibcalc.soをobjdumpで逆アセンブル! $ objdump -d libcalc.so <Java_com_example_seccon2015_rock_1paper_1scissors_ MainActivity_calc>: 400: b8 07 00 00 00 mov $0x7,%eax 405: c3 ret movは値をレジスタ(ここではeax)に格納する命令。 7をeaxに格納し、戻り値としてeaxを返している。 soファイルをリバースエンジニアリング! calc()は7を返すことがわかる!
  18. 18. それでは解答! SECCON{(1000+7) * 107} ↓ SECCON{107749} SECCON2015onlineCTF問題:https://github. com/SECCON/SECCON2015_online_CTF
  19. 19. まとめ ● リバースエンジニアリングすることでflagのように隠された情報 がわかってしまう (例えば、秘密鍵をそのままソースに埋めていたら・・・) ● 難読化を行うことでリバースエンジニアリングされにくくするこ とはできるが大体時間稼ぎにしかならないと思われる。 ● 機密情報はなるべくソースに入れないのが吉。
  20. 20. まとめ ここで紹介した技術は絶対に悪用しないように お願いします。 基本的にリバースエンジニアリングは著作者の許可 なく行うことは許されません。
  21. 21. ご清聴ありがとうございました

×