Hacking

1,038 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,038
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
3
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Hacking

  1. 1. • HACKING脆弱性攻撃の理論と実際
  2. 2. • 概要• プログラミング• ネットワーク• 暗号学
  3. 3. 語源• 1950年代MITの鉄道模型愛好会が中古の電 話機で高度な鉄道模型制御システムを作 り上げた。 →創造的な機器の使用方法を ハッキングと呼んだ
  4. 4. 脆弱性の原因• 本来の意図と違う動作• オフバイワンエラー• 例)長さ100mの柵を作るために、杭を10m間隔で配置。 必要な杭の数は?• 実際に起こった事例:2002年 OpenSSH• ☓ If(id < 0 || id > channels_alloc) {• ○ If(id < 0 || id >= channels_alloc) {
  5. 5. 攻撃のテクニック• バッファオーバーフロー攻撃• フォーマット文字列攻撃• どちらの攻撃も最終目的は任意のコードの実行
  6. 6. マルチユーザー環境• suid:一般ユーザーが実行できるプログラムに、root権限を 持たせる仕組み。• suid権限を持つ プログラム:passwdなど$ ls -l /usr/bin/passwd-rwsr-xr-x 1 root root 23420 8月 11 2010 /usr/bin/passwd
  7. 7. 低位アドレス メモリ構造 • マシン語プログラム(書き込み不可)コード領域データ領域 • 初期化された変数、文字列:実行ファイルに含まれる • 初期化されていない変数:実行時にカーネルが割り当 bss領域 てる ヒープ • 動的に割り当てられる変数(malloc, calloc) スタック • 関数呼び出し時にコンテキストを退避高位アドレス
  8. 8. data領域使用 データとbssの比較 bss領域使用#include <stdio.h> #include <stdio.h>char x[20]="abcd"; char x[20];int main(){ int main(){ return 0; 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(実行ファイルのサイズ)
  9. 9. アドレスの確認#include <stdio.h>#include <stdlib.h> code 804841fvoid sub(){ data 8049728 int stack; bss 8049734 printf("stack %xn",&stack); heap 836b008} stack bfb3f9c4int data=10;int bss; 低位アドレス コード領域int main(){ データ領域 int *heap; heap = (int *)malloc(1); bss領域 printf("code %xn",&main); ヒープ printf("data %xn",&data); printf("bss %xn",&bss); printf("heap %xn",heap); sub(); free(heap);} スタック 高位アドレス
  10. 10. 命令実行手順• 命令実行手順 o PCのアドレスの命令をロード o PCを加算 o ロードした命令を実行 プログラムカウンタ(PC):次に実行するアドレス ベースレジスタ(BR):プログラムの先頭アドレス スタックポインタ(SP):スタックの先頭アドレス #include <stdio.h> 80483a4 X=1 int main(){ int x=1; 80483a5 X++ x++; printf("%xn",&main); PC = 80483a4 return 0; PCのアドレスから命令をロード(x=1) } PC = 80483a5 x=1を実行 $ ./a.out PCのアドレスから命令をロード(x++) 80483a4 PC=80483a6 x++を実行
  11. 11. 関数呼び出しの動作• 関数呼び出し o 引数の退避 o 戻りアドレス(PC)の退避 o ベースレジスタの退避 o 関数のローカル変数領域の確保

×