Yamatosec-2014/05/31

3,628 views

Published on

Published in: Technology
0 Comments
10 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,628
On SlideShare
0
From Embeds
0
Number of Embeds
539
Actions
Shares
0
Downloads
44
Comments
0
Likes
10
Embeds 0
No embeds

No notes for slide

Yamatosec-2014/05/31

  1. 1. 大和セキュリティ勉強会 @potetisensei
  2. 2. じこしょうかい
  3. 3. じこしょうかい ● 小池 悠生 – @potetisensei – 私立灘高等学校 1年 – パソコン研究部 部長 – EpsilonDeltaのバイナリ担当 ● 主にpwn ● CTF歴: 1年9ヶ月ほど
  4. 4. じこしょうかい ● 戦績 – CSAW 2013 Quals 33位 – Facebook CTF Finals 6位 – 30c3 Quals 16位 – PHDays Quals 28位 – SECCON 2013 Finals 2位 – CODEGATE 2014 Quals 39位 – DEFCON 2014 Quals 31位
  5. 5. はなすこと
  6. 6. はなすこと ● CTFのバイナリ入門?
  7. 7. はなすこと ● CTFのバイナリ入門? – 自分で(ある程度)やってくれ
  8. 8. はなすこと ● CTFのバイナリ入門? – 自分で(ある程度)やってくれ – microcorruption, ksnctf etc...
  9. 9. はなすこと ● CTFのバイナリ入門? – 自分で(ある程度)やってくれ – microcorruption, ksnctf etc... – バイナリ書籍も最近は多い
  10. 10. バイナリしょせき
  11. 11. バイナリしょせき ● x86アセンブラ入門 – 読めないと話にならないので...
  12. 12. バイナリしょせき ● リバースエンジニアリングバイブル – 解析特化 – 体系的に解析の基本がまとまってる – CTFのReversing問題も
  13. 13. バイナリしょせき ● Hacking: 美しき策謀 – めずらしいExploitation寄りの本 ● C言語の基礎からShellcodeまで – ネットワーク、暗号理論も少し – 書式指定子攻撃を扱う数少ない本
  14. 14. バイナリしょせき ● たのしいバイナリの歩き方 – 基本を抑えた上でかなり幅広い ● 解析 ● Exploit ● 実装 ● ツールの利用 – 近状に則した新しい話題が多い
  15. 15. バイナリしょせき ● 他にも – ハッカープログラミング大全 – Art Of Reversingシリーズ – ももいろテクノロジー(サイト) ● http://inaz2.hatenablog.com/
  16. 16. で、何するの?
  17. 17. (再掲)
  18. 18. バイナリの走り方(pwn)
  19. 19. バイナリの走り方(全力疾走)
  20. 20. バイナリの走り方(全力疾走) ● 基本は掴んだ、簡単な物は解けるという人向け
  21. 21. バイナリの走り方(全力疾走) ● 基本は掴んだ、簡単な物は解けるという人向け – 少し難しい問題を解くには?
  22. 22. バイナリの走り方(全力疾走) ● 基本は掴んだ、簡単な物は解けるという人向け – 少し難しい問題を解くには? ● CTFは過去問をやり込むしか無い
  23. 23. バイナリの走り方(全力疾走) ● 基本は掴んだ、簡単な物は解けるという人向け – 少し難しい問題を解くには? ● CTFは過去問をやり込むしか無い – 泥臭いですが、それしかない ● (Writeup見てるだけじゃダメ)
  24. 24. バイナリの走り方(全力疾走) ● 基本は掴んだ、簡単な物は解けるという人向け – 少し難しい問題を解くには? ● CTFは過去問をやり込むしか無い – 泥臭いですが、それしかない ● (Writeup見てるだけじゃダメ) – いくつかの良問、難問を紹介したいと思います
  25. 25. バイナリの走り方(全力疾走) ● ただし – microcorruptionやってる間も勝手に話します – 解きたい人、聞きたい人ご自由に – 休憩目的なので、小話を幾つかする感じです – 質問があればすぐに止めて頂いて構いません
  26. 26. 一旦中断?(microcorruptionタイム)
  27. 27. CSAW 2013 Exp300 fil_chal
  28. 28. http://bit.ly/1hpuvpG ● CSAW CTF – 比較的簡単なので入門にオススメ – 基本ジャンル + Recon, Trivia, Misc – 今年も9月にあるので皆さん出ましょう
  29. 29. http://bit.ly/1hpuvpG ● Exp300 fil_chal – オーソドックスな問題 – バッファーオーバーフローの基本 – あらゆる問題はこの形に落とし込めば勝ち
  30. 30. http://bit.ly/1hpuvpG ● 環境(重要)
  31. 31. http://bit.ly/1hpuvpG ● 環境(重要) – Full RELRO ● GOT Overwriteなどの攻撃は不可 – No canary found ● stack overflowのmitigationがない – NX disabled ● NX bitによるデータ実行防止がない ● shellcodeを利用することが出来る – ASLR disabled(これは実行環境依存) ● stackやheap, libcはアドレスが固定
  32. 32. http://bit.ly/1hpuvpG ● 基本挙動
  33. 33. http://bit.ly/1hpuvpG ● 基本挙動 – とりあえず動かしてみる癖を付ける(demo) ● malwareには注意...
  34. 34. http://bit.ly/1hpuvpG ● 基本挙動 – とりあえず動かしてみる癖を付ける(demo) ● malwareには注意... – 初めにユーザー名とパスワードを求められる ● 特に難読化はないのでstringsで対応 – csaw2013:S1mplePWD – ログインに成功すると日記を付けられる ● ここが怪しそう...?
  35. 35. http://bit.ly/1hpuvpG ● 静的解析
  36. 36. http://bit.ly/1hpuvpG ● 静的解析 – “ある程度手で確かめた上で”静的解析に移る ● 「動かした時に起こった挙動」を確認しつつ ● 怪しいと思った所を見てみる
  37. 37. http://bit.ly/1hpuvpG ● 静的解析 – “ある程度手で確かめた上で”静的解析に移る ● 「動かした時に起こった挙動」を確認しつつ ● 怪しいと思った所を見てみる – ここら辺は勘、あるいは経験 ● 全てに静的解析行うのは次の手段(だと思ってる) ● (demo)
  38. 38. http://bit.ly/1hpuvpG ● 怪しい箇所? – バッファーオーバーフローがないか調べたい – 初めに文字数を入力した上で文字列を入力するっぽい – そもそも入力サイズの上限は? ● 0x400で適正っぽいなあ – このチェックを回避できないか考える ● 整数値オーバーフローはない?
  39. 39. 0x08048F09 ~ 0x08048F36 mov eax, [ebp+arg_4] mov [ebp+var_4AC], ax movsx eax, [ebp+var_4AC] mov [ebp+n], eax mov eax, [ebp+n] add eax, 1 cmp eax, 400h jbe short loc_8048F5B http://bit.ly/1hpuvpG
  40. 40. 0x08048F09 ~ 0x08048F36 mov eax, [ebp+arg_4] ; string size mov [ebp+var_4AC], ax ; short movsx eax, [ebp+var_4AC] ; cast to int mov [ebp+n], eax mov eax, [ebp+n] add eax, 1 ; eax = size + 1 cmp eax, 400h ; cast to uint jbe short loc_8048F5B http://bit.ly/1hpuvpG
  41. 41. short size; if ((unsined int)(size+1) <= 0x400) { ・ ・ ・ http://bit.ly/1hpuvpG
  42. 42. http://bit.ly/1hpuvpG ● size = -1の時?
  43. 43. http://bit.ly/1hpuvpG ● size = -1の時? – 「(-1 + 1) <= 0x400」 ⇔ 「0 <= 0x400」は成立
  44. 44. http://bit.ly/1hpuvpG ● size = -1の時? – 「(-1 + 1) <= 0x400」 ⇔ 「0 <= 0x400」は成立 – 入力サイズには-1(0xffffffff)が用いられる ● 明らかな整数値オーバーフロー ● これでバッファーオーバーフローは利用できる
  45. 45. http://bit.ly/1hpuvpG ● 利用する脆弱性が決まったら – exploit構築フェーズ – 本質ではないここに時間がかかってはいけない ● 慣れれば5分程度でexploitは書けるようになります
  46. 46. http://bit.ly/1hpuvpG ● 唯一考えなければならない事
  47. 47. http://bit.ly/1hpuvpG ● 唯一考えなければならない事 – 今回exploitに必要なアドレスは何か?
  48. 48. http://bit.ly/1hpuvpG ● 唯一考えなければならない事 – 今回exploitに必要なアドレスは何か? ● stack(shellcodeさえ配置できれば良い)
  49. 49. http://bit.ly/1hpuvpG ● 唯一考えなければならない事 – 今回exploitに必要なアドレスは何か? ● stack(shellcodeさえ配置できれば良い) – それに対して利用できるアドレスは?
  50. 50. http://bit.ly/1hpuvpG ● 唯一考えなければならない事 – 今回exploitに必要なアドレスは何か? ● stack(shellcodeさえ配置できれば良い) – それに対して利用できるアドレスは? ● ASLRはdisbled
  51. 51. http://bit.ly/1hpuvpG ● 唯一考えなければならない事 – 今回exploitに必要なアドレスは何か? ● stack(shellcodeさえ配置できれば良い) – それに対して利用できるアドレスは? ● ASLRはdisbled – ただし実行環境依存であるstackのアドレスはわからない – stackのアドレスはleak出来るか?
  52. 52. http://bit.ly/1hpuvpG ● Address leak – 出力系関数によってメモリ領域のアドレスを知ること
  53. 53. http://bit.ly/1hpuvpG ● Address leak – 出力系関数によってメモリ領域のアドレスを知ること – 大きく分けて2タイプ ● 出力するアドレスを決め打ち – 有効なアドレスであれば返ってくる ● 既知のアドレスの中身を見る – 知りたいアドレスが中にあることが前提
  54. 54. http://bit.ly/1hpuvpG ● 出力するアドレスを決め打ち – 有効なアドレスであれば返ってくる 今回はこちらが妥当
  55. 55. http://bit.ly/1hpuvpG ● 根拠
  56. 56. http://bit.ly/1hpuvpG ● 根拠 – 出力関数がsendであること ● アドレスさえ当ててしまえば無限長読み出せる
  57. 57. http://bit.ly/1hpuvpG ● 根拠 – 出力関数がsendであること ● アドレスさえ当ててしまえば無限長読み出せる – ASLRは無効である = アドレスは固定 ● 一度でも当てれば良い
  58. 58. http://bit.ly/1hpuvpG ● 根拠 – 出力関数がsendであること ● アドレスさえ当ててしまえば無限長読み出せる – ASLRは無効である = アドレスは固定 ● 一度でも当てれば良い – ASLRなしのスタックの大体の位置 ● 0xbfff0000 ~ 0xbfffffff ● 0xffff0000 ~ 0xffffffff ● 16 * 2回の探索で行けそう
  59. 59. http://bit.ly/1hpuvpG ● これらを踏まえて書いたexploit fil_chal.py
  60. 60. http://bit.ly/1hpuvpG ● これらを踏まえて書いたexploit fil_chal.py – search_fd ● バッファーオーバーフローによりfdを上書きしてしまう ● 大体のfdの値を求める必要がある
  61. 61. http://bit.ly/1hpuvpG ● これらを踏まえて書いたexploit fil_chal.py – search_fd ● バッファーオーバーフローによりfdを上書きしてしまう ● 大体のfdの値を求める必要がある – search_stack ● 前述の通り、stack領域がどこにあるか探す
  62. 62. http://bit.ly/1hpuvpG ● これらを踏まえて書いたexploit fil_chal.py – search_fd ● バッファーオーバーフローによりfdを上書きしてしまう ● 大体のfdの値を求める必要がある – search_stack ● 前述の通り、stack領域がどこにあるか探す – search_shellcode ● 実際にshellcodeを格納できるアドレスがどこか探す
  63. 63. http://bit.ly/1hpuvpG ● これらを踏まえて書いたexploit fil_chal.py – search_fd ● バッファーオーバーフローによりfdを上書きしてしまう ● 大体のfdの値を求める必要がある – search_stack ● 前述の通り、stack領域がどこにあるか探す – search_shellcode ● 実際にshellcodeを格納できるアドレスがどこか探す – gain_shell ● 127.0.0.1 4444にconnectbackさせるshellcodeを起動
  64. 64. http://bit.ly/1hpuvpG ● 実行してみる... – (demo)
  65. 65. http://bit.ly/1hpuvpG ● 実行してみる... – (demo) – 遅くない...?
  66. 66. http://bit.ly/1hpuvpG ● 実行してみる... – (demo) – 遅くない...? – Flag: signness_oh_what_a_world_we_live_in! – とりあえずFLAGが手に入ったので良しとしよう
  67. 67. http://bit.ly/1hpuvpG ● 余談
  68. 68. http://bit.ly/1hpuvpG ● 余談 – 総当りは美しくない ● 上手く行ったが時間がかかる ● ASLRが有効ならば通用しない
  69. 69. http://bit.ly/1hpuvpG ● 余談 – 総当りは美しくない ● 上手く行ったが時間がかかる ● ASLRが有効ならば通用しない – ASLR有効な場合ではどうすればよかったのか
  70. 70. http://bit.ly/1hpuvpG ● 余談 – 総当りは美しくない ● 上手く行ったが時間がかかる ● ASLRが有効ならば通用しない – ASLR有効な場合ではどうすればよかったのか ● わざわざstackに置かなくても、より良い場所がある ● Stager ROPという概念 ● ここで説明することはないので課題とします
  71. 71. 一旦中断?(microcorruptionタイム)
  72. 72. Hacklu 2012 Bin300 braincpy
  73. 73. http://bit.ly/1hpuvpG ● Hacklu CTF – バイナリ寄りなCTF – かなり質の良い問題しか出ない
  74. 74. http://bit.ly/1hpuvpG ● Bin300 Braincpy – 典型ROP問題 – Stack PivotとROPの基本が集約された良問 – ssh接続 + setgidされたバイナリ
  75. 75. http://bit.ly/1hpuvpG ● 環境(重要)
  76. 76. http://bit.ly/1hpuvpG ● 環境(重要) – Partial RELRO ● GOT Overwrite可能 – No canary found ● Stack Canaryは存在しない – NX enabled ● NX bitによるDEPが有効 ● return2libc, あるいはROPで攻める
  77. 77. http://bit.ly/1hpuvpG ● 基本挙動 – とりあえず動かしてみる癖を付ける(demo) ● malwareには注意...
  78. 78. http://bit.ly/1hpuvpG ● 基本挙動 – とりあえず動かしてみる癖を付ける(demo) ● malwareには注意... – よく分からん
  79. 79. http://bit.ly/1hpuvpG ● 基本挙動 – とりあえず動かしてみる癖を付ける(demo) ● malwareには注意... – よく分からん ● argc != 2ならNO! ● argc == 2 && strlen(argv[1]) <= nならNOMNOMNOM! ● strlen(argv[1]) > nならNO! ● みたいな感じ...?
  80. 80. http://bit.ly/1hpuvpG ● 静的解析 – “ある程度手で確かめた上で”静的解析に移る ● 「動かした時に起こった挙動」を確認しつつ ● 怪しいと思った所を見てみる – ここら辺は勘、あるいは経験 ● 全てに静的解析行うのは次の手段(だと思ってる) ● (demo)
  81. 81. http://bit.ly/1hpuvpG ● 怪しい箇所? – envpを全てNULLで上書きしている ● envpは使って欲しくない問題みたい? – seteuid, setegidが呼び出されている ● exploit中で権限を設定し直す必要がある – argv[1]<=strlen(0x60)の時、argv[1]がstrcpyされる – 明らかにバッファーオーバーフローしている ● ただしオーバーフローするサイズが小さすぎる(demo)
  82. 82. http://bit.ly/1hpuvpG ● 8byteしかオーバーフロー出来ないっぽい? – 書き換えられるのはebp, return addressのみ – ROPは(そのままでは)構築出来ない....
  83. 83. http://bit.ly/1hpuvpG ● 通常のROP
  84. 84. http://bit.ly/1hpuvpG local variables2 stack saved ebp return address ● 通常のROP local variables1 arguments1
  85. 85. http://bit.ly/1hpuvpG local variables2 stack saved ebp return address local variables1 overwritten ● 通常のROP BufferOverflow local variables1 arguments1
  86. 86. http://bit.ly/1hpuvpG local variables2 stack saved ebp return address func1 args[n] local variables1 junk ● 通常のROP BufferOverflow functon1 addr n pop gadget local variables1 arguments1 functon2 addr
  87. 87. http://bit.ly/1hpuvpG ● 通常のROP function1の呼び出し function1の引数分popを行うgadgetへのreturn function2の呼び出し ・ ・ ・
  88. 88. http://bit.ly/1hpuvpG ● 今回の場合 local variables2 stack saved ebp return address local variables1 arguments1
  89. 89. http://bit.ly/1hpuvpG ● 今回の場合 local variables2 stack saved ebp return address local variables1 overwritten local variables1 arguments1 local variables2 arguments1 BufferOverflow
  90. 90. http://bit.ly/1hpuvpG ● 思考
  91. 91. http://bit.ly/1hpuvpG ● 思考 – ROPを行うには“下に”十分な書き込みが必要
  92. 92. http://bit.ly/1hpuvpG ● 思考 – ROPを行うには“下に”十分な書き込みが必要 – すなわち、espの指すアドレスの下に入力を与えたい
  93. 93. http://bit.ly/1hpuvpG ● 思考 – ROPを行うには“下に”十分な書き込みが必要 – すなわち、espの指すアドレスの下に入力を与えたい – 2通りの方法
  94. 94. http://bit.ly/1hpuvpG ● 思考 – ROPを行うには“下に”十分な書き込みが必要 – すなわち、espの指すアドレスの下に入力を与えたい – 2通りの方法 ● 入力系関数で更に読み込む ● espそのものの値をいじってしまう
  95. 95. http://bit.ly/1hpuvpG ● espそのものの値をいじってしまう 今回はこちらが妥当
  96. 96. http://bit.ly/1hpuvpG ● 根拠 – そもそも引数をいじれないので入力関数は呼べない – 入力自体は96byteも与えている ● espをいじってどうにか利用できないか
  97. 97. http://bit.ly/1hpuvpG local variables1 overwritten local variables2 arguments1 esp returnする時点での位置
  98. 98. http://bit.ly/1hpuvpG local variables1 overwritten local variables2 arguments1 esp これをreturn後に上手くずらせれば...
  99. 99. http://bit.ly/1hpuvpG local variables1 local variables2 arguments1 esp ROPは実行可能になる! functon1 addr ・ ・ ・
  100. 100. http://bit.ly/1hpuvpG ● espをいじる – このような手法をstack pivotという
  101. 101. http://bit.ly/1hpuvpG ● espをいじる – このような手法をstack pivotという – 一度のreturnだけでespをいじれるgadgetを探す ● gadgetの列挙にはrp++を使用(demo)
  102. 102. http://bit.ly/1hpuvpG ● 探したいgadget
  103. 103. http://bit.ly/1hpuvpG ● 探したいgadget – sub esp, n ● 良いのがなさそう...
  104. 104. http://bit.ly/1hpuvpG ● 探したいgadget – sub esp, n ● 良いのがなさそう... – add esp, n(負数)でもいいのでは?
  105. 105. http://bit.ly/1hpuvpG ● 探したいgadget – sub esp, n ● 良いのがなさそう... – add esp, n(負数)でもいいのでは? ● add esp, dword [ebp+0x0A] ; ret – ebpをいじれるしちょうど良さそう – 後は -0x60 = 0xffffffa0を指すようなアドレスを探す
  106. 106. http://bit.ly/1hpuvpG ● IDAで0xffffffa0を指す固定アドレスを探す(demo) – sequence of bytesが便利
  107. 107. http://bit.ly/1hpuvpG ● IDAで0xffffffa0を指す固定アドレスを探す(demo) – sequence of bytesが便利 – 0x08086C1C
  108. 108. http://bit.ly/1hpuvpG ● Exploit: braincpy.py, braincpy2.py – braincpy.py ● 実際に/home/braincpy/braincpyを起動 ● freadを呼び出し、入力をbufferに読みこむ ● stackをbufferに変更(espをbufferに変更) – braincpy2.py ● freadで読み込む入力を与える ● setegidをsyscallで、fopen,fgets,putsをret2libcで呼ぶ ● freadへの入力なのでNULL文字が含まれても問題ない
  109. 109. http://bit.ly/1hpuvpG ● 実行してみる... – (demo)
  110. 110. http://bit.ly/1hpuvpG ● 実行してみる... – (demo) – 良さだ – Flag: ROP_GOLF_IS_A_NICE_GAME!
  111. 111. http://bit.ly/1hpuvpG ● 実行してみる... – (demo) – 良さだ – Flag: ROP_GOLF_IS_A_NICE_GAME! – freadによる読み込みは最高
  112. 112. 一旦中断?(microcorruptionタイム)
  113. 113. SECUINSIDE 2013 Pwn750 Pwnme!!
  114. 114. http://bit.ly/1hpuvpG ● SECUINSIDE CTF – 韓国のCTF – CODEGATEと性質が似ていて、バイナリが重たい
  115. 115. http://bit.ly/1hpuvpG ● Pwn750 Pwnme – 難問中の難問 ● 感じだけでも掴んでもらえれば
  116. 116. http://bit.ly/1hpuvpG ● 環境(重要)
  117. 117. http://bit.ly/1hpuvpG ● 環境(重要) – Partial RELRO ● GOT Overwrite可能 – No canary found ● Stack Canaryは存在しない – NX enabled ● NX bitによるDEPが有効 ● return2libc, あるいはROPで攻める – PIE enabled ● 全ての領域のアドレスがランダマイズされる
  118. 118. http://bit.ly/1hpuvpG ● 基本挙動 – とりあえず動かしてみる癖を付ける(demo) ● malwareには注意...
  119. 119. http://bit.ly/1hpuvpG ● 基本挙動 – とりあえず動かしてみる癖を付ける(demo) ● malwareには注意... – 名前を入力するだけっぽい ● server側で、clientが入力した名前を出力 ● バッファーオーバーフローはしてそう
  120. 120. http://bit.ly/1hpuvpG ● 静的解析 – “ある程度手で確かめた上で”静的解析に移る ● 「動かした時に起こった挙動」を確認しつつ ● 怪しいと思った所を見てみる – ここら辺は勘、あるいは経験 ● 全てに静的解析行うのは次の手段(だと思ってる) ● (demo)
  121. 121. http://bit.ly/1hpuvpG ● 怪しい箇所? – 明らかにバッファーオーバーフローしている ● braincpyと同様、ROPには足りてない... ● またespをズラしてやればいいだけっぽい?
  122. 122. http://bit.ly/1hpuvpG ● 探したいgadget(demo)
  123. 123. http://bit.ly/1hpuvpG ● 探したいgadget(demo) – sub esp, n ● !!!そもそも存在しなかった!!!
  124. 124. http://bit.ly/1hpuvpG ● 探したいgadget(demo) – sub esp, n ● !!!そもそも存在しなかった!!! – add esp, n(負数)は? ● 負数のnは存在してないですね... ● braincpyは静的リンクしていたからgadgetが豊富だった
  125. 125. http://bit.ly/1hpuvpG ● 思考
  126. 126. http://bit.ly/1hpuvpG ● 思考 – CTFは必ず解けるようになってる
  127. 127. http://bit.ly/1hpuvpG ● 思考 – CTFは必ず解けるようになってる ● 問題不備もたまにあるけど、絶対に解法があるはず
  128. 128. http://bit.ly/1hpuvpG ● 思考 – CTFは必ず解けるようになってる ● 問題不備もたまにあるけど、絶対に解法があるはず – stack pivotは必ず使う ● ROPの本質は自分の入力をstackに持ち込むこと ● pivot先のアドレスを考えることがこの問題の本質
  129. 129. http://bit.ly/1hpuvpG ● 勘、あるいは経験則
  130. 130. http://bit.ly/1hpuvpG ● 勘、あるいは経験則 – stack pivotは絶対に必要
  131. 131. http://bit.ly/1hpuvpG ● 勘、あるいは経験則 – stack pivotは絶対に必要 ● ただし、espを相対的にいじるgadgetはなかった ● leaveなどで絶対的なアドレスを代入するしかない
  132. 132. http://bit.ly/1hpuvpG ● 勘、あるいは経験則 – stack pivotは絶対に必要 ● ただし、espを相対的にいじるgadgetはなかった ● leaveなどで絶対的なアドレスを代入するしかない ● PIEがネック
  133. 133. http://bit.ly/1hpuvpG ● 勘、あるいは経験則 – stack pivotは絶対に必要 ● ただし、espを相対的にいじるgadgetはなかった ● leaveなどで絶対的なアドレスを代入するしかない ● PIEがネック – 高得点問題にはLinuxやELF、libcの中身を問うケース も ● 何か関係あるのだろうか...
  134. 134. http://bit.ly/1hpuvpG ● 勘、あるいは経験則 – stack pivotは絶対に必要 ● ただし、espを相対的にいじるgadgetはなかった ● leaveなどで絶対的なアドレスを代入するしかない ● PIEがネック – 高得点問題にはLinuxやELF、libcの中身を問うケース も ● 何か関係あるのだろうか... – (server側の不自然なprintfが怪しい)
  135. 135. http://bit.ly/1hpuvpG ● 勘、あるいは経験則 – stack pivotは絶対に必要 ● ただし、espを相対的にいじるgadgetはなかった ● leaveなどで絶対的なアドレスを代入するしかない ● PIEがネック – 高得点問題にはLinuxやELF、libcの中身を問うケース も ● 何か関係あるのだろうか... – (server側の不自然なprintfが怪しい) ● 作問を経験し、作問者の気持ちになるのは重要 ● このprintf要らなくない??? ● あまり違和感はないので、僕も気づかなかったかも
  136. 136. http://bit.ly/1hpuvpG ● 勘をまとめる
  137. 137. http://bit.ly/1hpuvpG ● 勘をまとめる – stack pivotは使う ● ただし絶対的なアドレス代入のみ
  138. 138. http://bit.ly/1hpuvpG ● 勘をまとめる – stack pivotは使う ● ただし絶対的なアドレス代入のみ ● stack領域はPIEなので総当りきつそう
  139. 139. http://bit.ly/1hpuvpG ● 勘をまとめる – stack pivotは使う ● ただし絶対的なアドレス代入のみ ● stack領域はPIEなので総当りきつそう ● 他に入力を保存してるバッファないかな...
  140. 140. http://bit.ly/1hpuvpG ● 勘をまとめる – stack pivotは使う ● ただし絶対的なアドレス代入のみ ● stack領域はPIEなので総当りきつそう ● 他に入力を保存してるバッファないかな... – printf怪しくないですか? ● そういえば、出力バッファみたいなのなかった???
  141. 141. http://bit.ly/1hpuvpG ● 勘をまとめる – stack pivotは使う ● ただし絶対的なアドレス代入のみ ● stack領域はPIEなので総当りきつそう ● 他に入力を保存してるバッファないかな... – printf怪しくないですか? ● そういえば、出力バッファみたいなのなかった??? ● どちらにせよPIEはどうなんですかね
  142. 142. http://bit.ly/1hpuvpG ● 実験
  143. 143. http://bit.ly/1hpuvpG ● 実験 – 領域によってASLRのエントロピーに差はあるか(demo)
  144. 144. http://bit.ly/1hpuvpG ● 実験 – 領域によってASLRのエントロピーに差はあるか(demo) ● stack領域 ・・・ 16^3 = 4096 ● glibc領域 ・・・ 16^2 = 256 ● 総当りとはいえ、かなり上手く行きそう
  145. 145. http://bit.ly/1hpuvpG ● 実験 – 領域によってASLRのエントロピーに差はあるか(demo) ● stack領域 ・・・ 16^3 = 4096 ● glibc領域 ・・・ 16^2 = 256 ● 総当りとはいえ、かなり上手く行きそう – printf内に入力を保存しているバッファは存在するか ● glibcは読みたくないのでgdbで調べる(demo)
  146. 146. http://bit.ly/1hpuvpG ● 実験 – 領域によってASLRのエントロピーに差はあるか(demo) ● stack領域 ・・・ 16^3 = 4096 ● glibc領域 ・・・ 16^2 = 256 ● 総当りとはいえ、かなり上手く行きそう – printf内に入力を保存しているバッファは存在するか ● glibcは読みたくないのでgdbで調べる(demo) ● 存在してるっぽい!
  147. 147. http://bit.ly/1hpuvpG ● これらを踏まえて exploit pwnme.py – daemon型なのでアドレスは変化しない ● 256回の総当りを行う – libcのアドレスのみでexploitを構成する事が重要 ● system関数、引数のbuffer、leave-ret gadget
  148. 148. http://bit.ly/1hpuvpG ● 実行してみる... – (demo)
  149. 149. http://bit.ly/1hpuvpG ● 実行してみる... – (demo) – Excellent – Flag: yeah you got a key! – 非常に良い問題だった
  150. 150. まとめ
  151. 151. まとめ ● Exploitation問題は、ここ数年の難化が激しい
  152. 152. まとめ ● Exploitation問題は、ここ数年の難化が激しい – ROPが前提条件となってきている
  153. 153. まとめ ● Exploitation問題は、ここ数年の難化が激しい – ROPが前提条件となってきている – もはや初心者が簡単に入って来れるものではない...
  154. 154. まとめ ● Exploitation問題は、ここ数年の難化が激しい – ROPが前提条件となってきている – もはや初心者が簡単に入って来れるものではない... ● 何を学んで欲しいか
  155. 155. まとめ ● Exploitation問題は、ここ数年の難化が激しい – ROPが前提条件となってきている – もはや初心者が簡単に入って来れるものではない... ● 何を学んで欲しいか – exploit構築の上で何が必要なのかを考える力
  156. 156. まとめ ● Exploitation問題は、ここ数年の難化が激しい – ROPが前提条件となってきている – もはや初心者が簡単に入って来れるものではない... ● 何を学んで欲しいか – exploit構築の上で何が必要なのかを考える力 ● どの脆弱性がある時どのようなexploitを組むのか
  157. 157. まとめ ● Exploitation問題は、ここ数年の難化が激しい – ROPが前提条件となってきている – もはや初心者が簡単に入って来れるものではない... ● 何を学んで欲しいか – exploit構築の上で何が必要なのかを考える力 ● どの脆弱性がある時どのようなexploitを組むのか ● どの領域のアドレスをどのようにして手に入れるのか
  158. 158. まとめ ● Exploitation問題は、ここ数年の難化が激しい – ROPが前提条件となってきている – もはや初心者が簡単に入って来れるものではない... ● 何を学んで欲しいか – exploit構築の上で何が必要なのかを考える力 ● どの脆弱性がある時どのようなexploitを組むのか ● どの領域のアドレスをどのようにして手に入れるのか ● address leakやstagerなどの手法の知識も重要
  159. 159. ご静聴ありがとうございました

×