ログイン
編集不可のページディスカッション情報添付ファイル
"ytoku/Slides/Pwn勉強会"の差分

MMA
2と3のリビジョン間の差分
2015-05-05 22:21:25時点のリビジョン2
サイズ: 2211
編集者: ytoku
コメント:
2015-05-05 23:01:31時点のリビジョン3
サイズ: 3274
編集者: ytoku
コメント:
削除された箇所はこのように表示されます。 追加された箇所はこのように表示されます。
行 21: 行 21:
= x86/x86-64 ABI =
チートシート

= System call =
 * システムコールとは
  * プログラムがカーネルとやりとりする一元化された窓口
 * プログラムの動作権限
  * ユーザモード
   * 普通のプログラムが動作
   * 基本的にプロセスのメモリ内で計算しかできない.
   * それ以外のことをするためにはシステムコールを呼ぶ
  * カーネルモード
   * カーネルが動作
  * 任意の操作が可能

{{attachment:systemcall.png}}

= How to call System calls =
システムコールの呼び出し方

 * x86
  * int 0x80
   * INTerrupt (ソフトウェア割り込み命令)
  * システムコール番号: eax
  * 引数: ebx, ecx, edx, esi, edi, ebp
 * x86-64
  * syscall命令
  * システムコール番号: rax
  * 引数: rdi, rsi, rdx, r10, r8, r9

||<rowclass="header"> arch || instruction || syscall # || retval || arg1 || arg2 || arg3 || arg4 || arg5 || arg6 ||
|| x86 || int 0x80 || eax || eax || ebx || ecx || edx || esi || edi || ebp ||
|| x86-64 || syscall || rax || rax || rdi || rsi || rdx || r10 || r8 || r9 ||
行 33: 行 67:

= x86/x86-64 ABI =
チートシート

= System call =
システムコールの呼び出し方

Pwn勉強会(Stack day 1)

Tools

  • Disassembler
    • udcli / ndisasm
    • objdump
    • METASM / Hopper / IDA Pro
  • Assembler
    • nasm
    • Pwntools
    • METASM?
  • Debugger
    • gdb-peda
  • Pwn toolkit
    • Pwntools
    • Ruby系でなにか

Python(Pwntools)とRuby(METASM? ctfライブラリ?)好きな方を選んで作業を進めてもらう.

x86/x86-64 ABI

チートシート

System call

  • システムコールとは
    • プログラムがカーネルとやりとりする一元化された窓口
  • プログラムの動作権限
    • ユーザモード
      • 普通のプログラムが動作
      • 基本的にプロセスのメモリ内で計算しかできない.
      • それ以外のことをするためにはシステムコールを呼ぶ
    • カーネルモード
      • カーネルが動作
    • 任意の操作が可能

systemcall.png

How to call System calls

システムコールの呼び出し方

  • x86
    • int 0x80
      • INTerrupt (ソフトウェア割り込み命令)
    • システムコール番号: eax
    • 引数: ebx, ecx, edx, esi, edi, ebp
  • x86-64
    • syscall命令
    • システムコール番号: rax
    • 引数: rdi, rsi, rdx, r10, r8, r9

arch

instruction

syscall #

retval

arg1

arg2

arg3

arg4

arg5

arg6

x86

int 0x80

eax

eax

ebx

ecx

edx

esi

edi

ebp

x86-64

syscall

rax

rax

rdi

rsi

rdx

r10

r8

r9

Shellcode

   1 // gcc -z execstack -fno-stack-protector -o baby1 baby1.c
   2 // -m32 / -m64 両方やってもらうよ!
   3 #include <stdio.h>
   4 typedef void func();
   5 int main() {
   6     char buf[1024];
   7     fread(buf, 1, 4096, stdin);
   8     ((func *)buf)();
   9 }

Shellcode(no /bin/sh)

   1 // gcc -z execstack -fno-stack-protector -o baby1 baby1.c
   2 // -m32 / -m64 両方やってもらうよ!
   3 #include <stdio.h>
   4 typedef void func();
   5 int main() {
   6     char buf[1024];
   7     fread(buf, 1, 4096, stdin);
   8     ((func *)buf)();
   9 }

Return-to-plt

   1 // gcc -m32 -fno-stack-protector -o baby3 baby3.c
   2 #include <stdio.h>
   3 #include <unistd.h>
   4 char buf2[128];
   5 int f() {
   6     char buf[32];
   7     system("sleep 1");
   8     gets(buf);
   9     return 0;
  10 }
  11 int main() { return f(); }

ASLR

ASLRについて説明

Return-to-libc

   1 // gcc -m32 -pie -fPIE -fno-stack-protector -o baby4 baby4.c
   2 #include <unistd.h>
   3 int f() {
   4     char buf[32];
   5     write(1, buf, 64);
   6     read(0, buf, 1024);
   7     return 0;
   8 }
   9 int main() { return f(); }

Return-to-plt revisited(x86-64) with tiny ROP

   1 // gcc -m64 -fno-stack-protector -o baby5 baby5.c
   2 #include <stdio.h>
   3 #include <unistd.h>
   4 char buf2[128];
   5 int f() {
   6     char buf[32];
   7     system("sleep 1");
   8     gets(buf);
   9     return 0;
  10 }
  11 int main() { return f(); }

ROP

   1 // gcc -m32 -static -fno-stack-protector -o baby6 baby6.c
   2 #include <unistd.h>
   3 int f() {
   4     char buf[32];
   5     read(0, buf, 1024);
   6     return 0;
   7 }
   8 int main() { return f(); }

実践

適当な問題を探す

ytoku/Slides/Pwn勉強会 (最終更新日時 2015-10-07 15:46:40 更新者 nomeaning)