大和セキュリティ 田中ザック 2014年5月31日

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