Hacking
Upcoming SlideShare
Loading in...5
×
 

Hacking

on

  • 1,067 views

 

Statistics

Views

Total Views
1,067
Views on SlideShare
1,067
Embed Views
0

Actions

Likes
0
Downloads
1
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Hacking Hacking Presentation Transcript

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