Microcorruption CTF 組込ハッキング 大和セキュリティ 田中ザック 2014年5月31日 マイクロクラプション CTF ・www.microcorruption.com ・Matasano社が提供 ・LockITProという架空の電子 ・スマホアプリからBluetoothで繋いで を開けるという嘘話 マイクロクラプション CTF ・HTML 5で仮想デバッガーを弄って 脆弱性を見つける ・ツールは無用 ・TI MSP430のMCUをエミュレート ・アセンブリ・バイナリの初心者向け 参考リンク ・ のマニュアル: https://microcorruption.com/manual.pdf ・MSP430のマニュアル: http://www.ti.com/sc/docs/products/micro/msp430/userguid/as_5.pdf ・MSP 430の日本語マニュアル等: http://www.tij.co.jp/mcu/jp/docs/mcusplash.tsp?contentId=101282 ・CTFのWiki: https://uctf.hackpad.com/ TI MSP 430 • Von Neumannアーキテクチャ! • 16ビットCPU! • リトルエンディアン!例:0c0d0a0b! • アドレスは偶数にアラインされている 0x1001にJMPしたらクラッシュ! • 16個のレジスタ(r0-r15) TI MSP 430 • r0~r3 = 特別なレジスタ! • r0 = PC = Program Counter (x86 → EIP)! r1 = SP = Stack Pointer (x86 → ESP)! r2 = SR = Status Register(フラグレジスタ) • • (間接的にセットされる)! • r3 = Constant Generator (六つのよく使う一定値) (読み込んだら0が返ってきて、書き込みできない)! • r4~r15 = 汎用レジスタ アドレシングモード • @r4 = r4の値ではなく、r4にあるアドレスの値! • 0x4(r4) = r4のアドレス+4にあるword! • @r4+ = r4にあるアドレスの値を使ってからr4++! • &0x015c = アドレス015cの値! • #0x015c = 一定値 (→0x5c01 → 23553)! • 命令がデフォルトで16ビットのワードを使うが、 .bがある場合(XXX.b)は8ビットのバイトを使う アセンブリ入門 - 命令 • 命令セット:27個! • シングルオペランドの命令(7個)! • RRC Rotate right (1 bit) through carry! SWPB Swap bytes! RRA Rotate right (1 bit) arithmetic! SXT Sign extend byte to word! PUSH Push value onto stack! CALL Subroutine call; push PC and move source to PC! RETI Return from interrupt; pop SR then pop PC • • • • • • アセンブリ入門 - 命令 • 条件付ジャンプ(8個)! • JNE/JNZ Jump if not equal/zero! JEQ/JZ Jump if equal/zero! JNC/JLO Jump if no carry/lower! JC/JHS Jump if carry/higher or same! JN Jump if negative! JGE Jump if greater or equal! JL Jump if less! JMP Jump (無条件) • • • • • • • アセンブリ入門 - 命令 • • • • • • • • • • • • • • 2オペランド命令(12個)! 形式:xxx src, dst (AT&T構文)! MOV - Move source to destination! ADD - Add source to destination! ADDC - Add source and carry to destination! SUBC - Subtract source from destination (with carry)! SUB - Subtract source from destination! CMP - Compare (pretend to subtract) source from destination! DADD - Decimal add source to destination (with carry)! BIT - Test bits of source AND destination! BIC - Bit clear (dest &= ~src)! BIS - Bit set (logical OR)! XOR - Exclusive or source with destination! AND - Logical AND source with destination (dest &= src) エミュレートされる命令 • • • • • • • • • • • • • • • • • • SETC (set carry) → BIS #1, SR! SETN (set neg) → BIS #4, SR! SETZ (set zero) → BIS #2, SR! TST (test) → CMP 0, dst! BR (branch) → MOV dst, pc! CLR (clear) → MOV #0, dst! CLRC (clear carry) → BIC #1, SR! CLRN (clear neg) → BIC #4, SR! CLRZ (clear zero) → BIC #2, SR! DEC (decrement) → SUB #1, dst! DECD (double decrement) → SUB #2, dst! INC (increment) → ADD #1, dst! INCD (double increment) → ADD #2, dst! INV (invert) → XOR #0xFFFF, dst! NOP (no-op) → MOV #0, r3 (r3 is magic)! POP → MOV @SP+, dst (@ means dereference, + means increase address)! RET → MOV @SP+, pc! RLA (rotate left) → ADD dst, dst 大事なフラグ • Z = 演算結果がゼロ CMPは実は引算(例:2-2=0) ZFゼロフラグをセット(1になる)! • C = (桁上げフラグ) 通常の演算結果で桁あふれが発生! • V = 桁あふれフラグ! • N = ネガティブフラグ(結果がネガティブ)! • C、V、Zの組み合わせで <, =, > アドレススペース • • • • • • • • 0x0000–0x0007 Processor special function registers (interrupt control registers)! 0x0008–0x00FF - 8-bit peripherals. ! 0x0100–0x01FF - 16-bit peripherals. ! 0x0200–0x09FF - RAM (2048バイトまで)! 0x0C00–0x0FFF - Bootstrap loader ROM ! 0x1000–0x10FF - 256 bytes of data flash ROM ! 0x1100–0x38FF - Extended RAM! 0x1100–0xFFFF - プログラムROM (60kbまで) 最後の16か32バイトがinterrupt vector
© Copyright 2024