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

MMA
1と2のリビジョン間の差分
2015-04-27 20:48:40時点のリビジョン1
サイズ: 2190
編集者: ytoku
コメント:
2015-05-05 22:21:25時点のリビジョン2
サイズ: 2211
編集者: ytoku
コメント:
削除された箇所はこのように表示されます。 追加された箇所はこのように表示されます。
行 4: 行 4:
== Tools == = Tools =
行 10: 行 10:
  * nasm
行 20: 行 21:
== Shellcode == = Shellcode =
行 33: 行 34:
== x86/x86-64 ABI == = x86/x86-64 ABI =
行 36: 行 37:
== System call == = System call =
行 39: 行 40:
== Shellcode(slightly modified) == = Shellcode(no /bin/sh) =
行 41: 行 42:
// gcc -z execstack -fno-stack-protector -o baby2 baby2.c // gcc -z execstack -fno-stack-protector -o baby1 baby1.c
行 47: 行 48:
    scanf("%1023s", buf);     fread(buf, 1, 4096, stdin);
行 53: 行 54:
== Return-to-plt == = Return-to-plt =
行 59: 行 60:
int main() { int f() {
行 65: 行 66:
int main() { return f(); }
行 67: 行 69:
== ASLR == = ASLR =
行 70: 行 72:
== Return-to-libc == = Return-to-libc =
行 74: 行 76:
int main() { int f() {
行 80: 行 82:
int main() { return f(); }
行 83: 行 86:
== Return-to-plt revisited(x86-64) with tiny ROP == = Return-to-plt revisited(x86-64) with tiny ROP =
行 89: 行 92:
int main() { int f() {
行 95: 行 98:
int main() { return f(); }
行 99: 行 103:
== ROP == = ROP =
行 103: 行 107:
int main() { int f() {
行 108: 行 112:
int main() { return f(); }
行 110: 行 115:
= Pwn勉強会(Stack day 2) = = 実践 =
行 112: 行 117:

= Pwn勉強会(Heap day 1) =
やりたいな

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ライブラリ?)好きな方を選んで作業を進めてもらう.

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 }

x86/x86-64 ABI

チートシート

System call

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

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)