11
HACKING 脆脆脆脆脆脆脆脆脆脆脆

Hacking

Embed Size (px)

Citation preview

Page 1: Hacking

•HACKING脆弱性攻撃の理論と実際

Page 2: Hacking

• 概要• プログラミング• ネットワーク• 暗号学

Page 3: Hacking

語源• 1950 年代 MIT の鉄道模型愛好会が中古

の電話機で高度な鉄道模型制御システムを作り上げた。

  →創造的な機器の使用方法を     ハッキングと呼んだ

Page 4: Hacking

脆弱性の原因• 本来の意図と違う動作• オフバイワンエラー• 例)長さ 100m の柵を作るために、杭を 10m 間隔で配

置。必要な杭の数は?

• 実際に起こった事例: 2002 年  OpenSSH• ☓   If(id < 0 || id > channels_alloc) {• ○   If(id < 0 || id >= channels_alloc) {

Page 5: Hacking

攻撃のテクニック• バッファオーバーフロー攻撃• フォーマット文字列攻撃

• どちらの攻撃も最終目的は任意のコードの実行

Page 6: Hacking

マルチユーザー環境• suid :一般ユーザーが実行できるプログラムに、 root 権限

を持たせる仕組み。• suid 権限を持つ プログラム: passwd など

$ ls -l /usr/bin/passwd -rwsr-xr-x 1 root root 23420 8 月 11 2010 /usr/bin/passwd

Page 7: Hacking

メモリ構造• マシン語プログラム(書き込み不可)

• 初期化された変数、文字列:実行ファイルに含まれる

• 初期化されていない変数:実行時にカーネルが割り当てる

• 動的に割り当てられる変数( malloc, calloc )

• 関数呼び出し時にコンテキストを退避

コード領域

データ領域

bss 領域

ヒープ

スタック

高位アドレス

低位アドレス

Page 8: Hacking

データと bss の比較data 領域使用#include <stdio.h>char x[20]="abcd";int main(){

return 0;}

bss 領域使用#include <stdio.h>char x[20];int main(){

return 0;

$ size data bss text data bss dec hex filename 915 268 8 1191 4a7 data.out 915 248 28 1191 4a7 bss.out( コード領域 データ領域  bss 領域 総メモリサイズ )

$ ls -ls data bss4846 8 月 28 20:13 bss.out4866 8 月 28 20:13 data.out(実行ファイルのサイズ)

Page 9: Hacking

アドレスの確認#include <stdio.h>#include <stdlib.h>void sub(){

int stack;printf("stack %x\n",&stack);

}int data=10;int bss;int main(){

int *heap;heap = (int *)malloc(1);printf("code %x\n",&main);printf("data %x\n",&data);printf("bss %x\n",&bss);printf("heap %x\n",heap);sub();free(heap);

}

code 804841fdata 8049728bss 8049734heap 836b008stack bfb3f9c4

コード領域

データ領域

bss 領域

ヒープ

スタック高位アドレス

低位アドレス

Page 10: Hacking

命令実行手順• 命令実行手順

o PC のアドレスの命令をロードo PC を加算o ロードした命令を実行

プログラムカウンタ (PC) :次に実行するアドレスベースレジスタ (BR) :プログラムの先頭アドレススタックポインタ (SP) :スタックの先頭アドレス

X=180483a

4

X++80483a

5

#include <stdio.h>int main(){

int x=1;x++;printf("%x\n",&main);return 0;

}

$ ./a.out80483a4

PC = 80483a4PC のアドレスから命令をロード (x=1)PC = 80483a5x=1 を実行PC のアドレスから命令をロード (x++)PC=80483a6x++ を実行

Page 11: Hacking

関数呼び出しの動作• 関数呼び出し

o 引数の退避o 戻りアドレス (PC) の退避o ベースレジスタの退避o 関数のローカル変数領域の確保