Upgrade to Pro — share decks privately, control downloads, hide ads and more …

任意コード実行の原理

 任意コード実行の原理

新ローレイヤー勉強会
~番外編:初心者向け低レイヤーの世界#1~
任意コード実行の原理

https://ffri-security.connpass.com/event/308829/

FFRI Security, Inc.

March 26, 2024
Tweet

More Decks by FFRI Security, Inc.

Other Decks in Technology

Transcript

  1. FFRI Security,Inc. 講師紹介 ー ざくっと経歴 HTMLにめっちゃハマる W3Cの「HTML 4.01 Specification」が愛読書 大学の研究室はWeb関係

    シェルコードにもハマる 超絶技巧が面白くて無駄すぎるEGGも作成 KNOPPIXベースのWhoppix環境で攻撃を試行 3 小学生 家にあったPCを触ってITに関わる 高校生 中学生 セキュリティに漠然とした興味を持つ C言語の勉強をしてみたり、HTMLで色々ページを作ったり IT業界で生きていくことを決意 ひとまず基本情報技術者試験を勉強 大学時代
  2. FFRI Security,Inc. コンピュータの基本構成 メモリにデータとコードを配置 CPUは適宜メモリからコードを読み取って実行 メモリは領域を区切って情報を管理 6 メモリ ストレージ CPU

    演算部/制御部 入力装置 テキスト領域: プログラムのコード部 分を配置 スタック領域: 一時的な情報を配置 データ領域: プログラムでずっと使 う情報を配置 高位から低位に 伸びる 0x0000 0xFFFF
  3. FFRI Security,Inc. 命令実行の動作イメージ 6 12 0041D459 プログラムカウンタ 8901C083 命令レジスタ add

    eax, 1 デコーダ 5 汎用レジスタ eax ALU メモリ 制御部 演算部 5 + 1 = 6
  4. FFRI Security,Inc. 関数 まとまった処理や特定の機能をグループ化 コードの可読性や再利用性を担保するうえで必須の概念 16 int isEven( int target

    ) { int result = 0; if ( target % 2 == 0 ) { result = 1; } return result; } … a =1440; if ( isEven( a ) == TRUE ) { result *= 2; } … 重要な点は関数での仕事が終わったら 元の場所に戻ってくるということ
  5. FFRI Security,Inc. バッファオーバフローの原理 ローカル変数とRETの位置関係に着目 4バイトの変数に12バイト分の「A」を書き込むとどうなる? 24 RET = 00401054 0x0000

    0xFFFF SEBP var_4 RET = 00401054 0x0000 0xFFFF SEBP var_4 41 41 41 41 41 41 41 41 41 41 41 41 関数からretnすると0x41414141がEIPにセットされる RETに位置するデータをうまく構築すれば任意アドレスをEIPにできる コレ!
  6. FFRI Security,Inc. どこに制御を移すべきか 実行させたい命令が偶然メモリに入っている? 関与しやすいのはRETを上書きした時に使ったデータ 実行させたい命令を詰め込み、先頭に処理を移す 25 RET = 00401054

    0x0000 0xFFFF SEBP var_4 RET = 00401054 0x0000 0xFFFF SEBP var_4 0x00CFFC34 48 40 90 90 33 C0 40 48 00 CF FC 34 0x00CFFC34 攻撃者が用意する必要がある!! 48 dec eax 40 inc eax 90 nop 90 nop 33 C0 xor eax, eax 40 inc eax 48 dec eax