diff --git a/CONTRIBUTION.md b/CONTRIBUTION.md index 9f190fc..a321a89 100644 --- a/CONTRIBUTION.md +++ b/CONTRIBUTION.md @@ -19,6 +19,7 @@ ``` . ├── .gitignore +├── .travis.yml ├── CHANGELOG ├── CONTRIBUTION.md ├── doc @@ -35,10 +36,6 @@ │   │   └── init │   ├── Others │   │   └── 1.5.7_brk.c -│   ├── Pwn -│   │   └── 3.3.1_goodlock_200 -│   ├── Reverse -│   │   └── 2.2_serial_number_300 │   └── writeup │   └── 6.1.1_pwn_hctf2016_brop ├── SUMMARY.md @@ -53,6 +50,7 @@ - `CONTRIBUTION.md`:合作与贡献的相关内容。 - `SUMMARY.md`:GitBook 目录结构。 - `.gitignore`:忽略特殊文件。 +- `.travis.yml`:Travis CI 配置文件。 - `FAQ.md`:常见问题解答。 - `THANKS`:致谢名单。 - `doc`:该目录包含书全部内容的 Markdown 文件。(文字) diff --git a/doc/1.5.7_memory.md b/doc/1.5.7_memory.md index 1ad665c..96f2eaa 100644 --- a/doc/1.5.7_memory.md +++ b/doc/1.5.7_memory.md @@ -65,7 +65,7 @@ RET ; 函数返回并跳转 ![](../pic/1.5.7_stack.png) -我们来看一个例子:[源码](../src/Others/1.5.7_stack.c) +我们来看一个例子:[源码](../src/Others/1.5.7_memory/stack.c) ```c #include int add(int a, int b) { @@ -208,7 +208,7 @@ void *sbrk(intptr_t increment); 在上图中我们看到 brk 指示堆结束地址,start_brk 指示堆开始地址。BSS segment 和 heap 之间有一段 Random brk offset,这是由于 ASLR 的作用,如果关闭了 ASLR,则 Random brk offset 为 0,堆结束地址和数据段开始地址重合。 -例子:[源码](../src/Others/1.5.7_brk.c) +例子:[源码](../src/Others/1.5.7_memory/brk.c) ```C #include #include @@ -347,7 +347,7 @@ void *mmap(void *addr, size_t len, int prot, int flags, int munmap(void *addr, size_t len); ``` -例子:[源码](../src/Others/1.5.7_mmap.c) +例子:[源码](../src/Others/1.5.7_memory/mmap.c) ```C #include #include diff --git a/doc/2.1_vm.md b/doc/2.1_vm.md index 5c45024..95decec 100644 --- a/doc/2.1_vm.md +++ b/doc/2.1_vm.md @@ -81,4 +81,4 @@ r2pipe #### 工具安装脚本 - ctf-tools - https://github.com/zardus/ctf-tools -- [pwn_env](../src/Others/2.1_pwn_env.sh) +- [pwn_env](../src/Others/2.1_vm/pwn_env.sh) diff --git a/doc/2.2_gdb.md b/doc/2.2_gdb.md index 2ea8e1a..fc42523 100644 --- a/doc/2.2_gdb.md +++ b/doc/2.2_gdb.md @@ -459,7 +459,7 @@ $ yaourt -S peda gdb-peda$ python myrun(100) ``` -下面我们通过一道 CTF 题目来练习一下 PEDA 脚本的编写:[asis-ctf-quals-2014 serial-number re-300](../src/Reverse/2.2_serial_number_300) +下面我们通过一道 CTF 题目来练习一下 PEDA 脚本的编写:[asis-ctf-quals-2014 serial-number re-300](../src/Others/2.2_gdb/serial_number_300) ``` __int64 __fastcall main(__int64 a1, char **a2, char **a3) { diff --git a/doc/2.7_pwntools.md b/doc/2.7_pwntools.md index 90623f9..a6cf62f 100644 --- a/doc/2.7_pwntools.md +++ b/doc/2.7_pwntools.md @@ -40,7 +40,7 @@ $ yaourt -S python2-pwntools $ yaourt -S python2-pwntools-git ``` -但是由于 Arch 没有 PPA 源,如果想要支持更多的体系结构(如 arm, aarch64 等),只能手动编译安装相应的 binutils,使用下面的脚本,注意将变量 `V` 和 `ARCH` 换成你需要的。[binutils](https://ftp.gnu.org/gnu/binutils/) +但是由于 Arch 没有 PPA 源,如果想要支持更多的体系结构(如 arm, aarch64 等),只能手动编译安装相应的 binutils,使用下面的脚本,注意将变量 `V` 和 `ARCH` 换成你需要的。[binutils](https://ftp.gnu.org/gnu/binutils/)[源码](../src/Others/2.7_pwntools/binutils.sh) ```bash #!/usr/bin/env bash diff --git a/doc/3.3.1_format_string.md b/doc/3.3.1_format_string.md index dcec50a..30ef617 100644 --- a/doc/3.3.1_format_string.md +++ b/doc/3.3.1_format_string.md @@ -292,7 +292,7 @@ printf("%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s") 使程序崩溃只是验证漏洞的第一步,攻击者还可以利用格式化输出函数来获得内存的内容,为下一步漏洞利用做准备。我们已经知道了,格式化字符串函数会根据格式字符串从栈上取值。由于在 x86 上栈由高地址向低地址增长,而 `printf()` 函数的参数是以逆序被压入栈的,所以参数在内存中出现的顺序与在 `printf()` 调用时出现的顺序是一致的。 -下面的演示我们都使用下面的[源码](../src/Others/3.3.1_fmt_2.c): +下面的演示我们都使用下面的[源码](../src/Others/3.3.1_format_string/fmt_2.c): ```c #include void main() { @@ -1234,7 +1234,7 @@ pwnlib.fmtstr.fmtstr_payload(offset, writes, numbwritten=0, write_size='byte') - numbwritten (int):已经由 printf 函数写入的字节数 - write_size (str):必须是 byte,short 或 int。告诉你是要逐 byte 写,逐 short 写还是逐 int 写(hhn,hn或n) -我们通过一个例子来熟悉下该模块的使用(任意地址内存读写):[fmt.c](../src/Others/3.3.1_fmt.c) [fmt](../src/Other/3.3.1_fmt) +我们通过一个例子来熟悉下该模块的使用(任意地址内存读写):[fmt.c](../src/Others/3.3.1_format_string/fmt.c) [fmt](../src/Other/3.3.1_format_string/fmt) ```c #include void main() { diff --git a/doc/3.3.2_integer_overflow.md b/doc/3.3.2_integer_overflow.md index e95fe92..ed3fffc 100644 --- a/doc/3.3.2_integer_overflow.md +++ b/doc/3.3.2_integer_overflow.md @@ -77,7 +77,7 @@ printf("ui = %u\n", ui); // 在 x86-32 上,ui = 4 294 967 295 #### 整型提升和宽度溢出 整型提升是指当计算表达式中包含了不同宽度的操作数时,较小宽度的操作数会被提升到和较大操作数一样的宽度,然后再进行计算。 -示例:[源码](../src/Other/3.3.2_width_overflow.c) +示例:[源码](../src/Other/3.3.2_integer_overflow/width_overflow.c) ```c #include void main() { @@ -254,7 +254,7 @@ void main(int argc, char *argv[]) { 这个例子接受两个字符串类型的参数并计算它们的总长度,程序分配足够的内存来存储拼接后的字符串。首先将第一个字符串参数复制到缓冲区中,然后将第二个参数连接到尾部。如果攻击者提供的两个字符串总长度无法用 `total` 表示,则会发生截断,从而导致后面的缓冲区溢出。 #### 实战 -看了上面的示例,我们来真正利用一个整数溢出漏洞。[源码](../src/Other/3.3.2_integer.c) +看了上面的示例,我们来真正利用一个整数溢出漏洞。[源码](../src/Other/3.3.2_integer_overflow/integer.c) ```c #include #include diff --git a/doc/3.3.4_rop.md b/doc/3.3.4_rop.md index 31ddce4..07747b1 100644 --- a/doc/3.3.4_rop.md +++ b/doc/3.3.4_rop.md @@ -61,6 +61,8 @@ 这些挑战都包含一个 `flag.txt` 的文件,我们的目标就是通过控制程序执行,来打印出文件中的内容。当然你也可以尝试获得 shell。 +[下载文件](../src/Others/3.3.4_rop/rop_emporium.bin) + #### ret2win32 通常情况下,对于一个有缓冲区溢出的程序,我们通常先输入一定数量的字符填满缓冲区,然后是精心构造的 ROP 链,通过覆盖堆栈上保存的返回地址来实现函数跳转(关于缓冲区溢出请查看上一章 3.3.3栈溢出)。 diff --git a/doc/5.2_pin.md b/doc/5.2_pin.md index 8522efa..970c26f 100644 --- a/doc/5.2_pin.md +++ b/doc/5.2_pin.md @@ -335,7 +335,7 @@ Pintool 的入口为 `main` 函数,通常需要完成下面的功能: ## Pin 在 CTF 中的应用 由于程序具有循环、分支等结构,每次运行时执行的指令数量不一定相同,于是我们可是使用 Pin 来统计执行指令的数量,从而对程序进行分析。特别是对一些使用特殊指令集和虚拟机,或者运用了反调试等技术的程序来说,相对于静态分析去死磕,动态插桩技术是一个比较好的选择。 -我们先举一个例子,[源码](../src/Others/5.2_pin.c)如下: +我们先举一个例子,[源码](../src/Others/5.2_pin/passwd.c)如下: ```c #include #include diff --git a/doc/8.1_Linuxtools.md b/doc/8.1_Linuxtools.md index 8451018..5da3bc2 100644 --- a/doc/8.1_Linuxtools.md +++ b/doc/8.1_Linuxtools.md @@ -321,7 +321,7 @@ $ ssdeep -bm hash.txt modified.elf ## strings -**strings** 命令在对象文件或二进制文件中查找可打印的字符串。字符串是4个或更多可打印字符的任意序列,以换行符或空字符结束。strings命令对识别随机对象文件很有用。 +**strings** 命令在对象文件或二进制文件中查找可打印的字符串。字符串是4个或更多可打印字符的任意序列,以换行符或空字符结束。strings 命令对识别随机对象文件很有用。 #### 重要参数 ```text @@ -331,6 +331,21 @@ $ ssdeep -bm hash.txt modified.elf s = 7-bit, S = 8-bit, {b,l} = 16-bit, {B,L} = 32-bit ``` +`-e` 的作用,例如在这样一个二进制文件中: +``` +$ rabin2 -z a.out +vaddr=0x080485d0 paddr=0x000005d0 ordinal=000 sz=17 len=16 section=.rodata type=ascii string=Enter password: +vaddr=0x080485e5 paddr=0x000005e5 ordinal=001 sz=10 len=9 section=.rodata type=ascii string=Congrats! +vaddr=0x080485ef paddr=0x000005ef ordinal=002 sz=7 len=6 section=.rodata type=ascii string=Wrong! +vaddr=0x0804a040 paddr=0x00001040 ordinal=000 sz=36 len=8 section=.data type=utf32le string=w0wgreat +``` +字符串 `w0wgreat` 类型为 utf32le,而不是传统的 ascii,这时 strings 就需要指定 `-e L` 参数: +``` +$ strings a.out | grep w0wgreat +$ strings -e L a.out | grep w0wgreat +w0wgreat +``` + #### 常见用法 组合使用 *strings* 和 *grep*。 @@ -344,11 +359,6 @@ $ strings -t x /lib32/libc-2.24.so | grep /bin/sh $ strings [executable] | grep -i upx ``` -#### 练习 -[strings_crackme](../src/Reverse/strings_crackme) - -[flag_pwnablekr](../src/Reverse/flag_pwnablekr) - ## xxd **xxd** 的作用就是将一个文件以十六进制的形式显示出来。 @@ -366,6 +376,3 @@ $ strings [executable] | grep -i upx ```shell $ xxd -g1 [binary] ``` - -#### 练习 -[xxd_crackme](../src/Reverse/xxd_crackme) (使用 *strings* 再做一次) diff --git a/doc/8.4_writeup.md b/doc/8.4_writeup.md deleted file mode 100644 index c200c07..0000000 --- a/doc/8.4_writeup.md +++ /dev/null @@ -1,49 +0,0 @@ -# 8.4 习题答案 - - -## 3.3.1 格式化字符串漏洞 -#### **pwn** - UIUCTF 2017 - goodluck - 200 - - -## 6.1 更多 Linux 工具 -#### Strings - strings_crackme -```text -$ strings -e L strings_crackme -w0wgreat -``` - -#### **Pwn** - Strings - flag_pwnablekr -```text -$ ./flag_pwnablekr -I will malloc() and strcpy the flag there. take it. -$ strings flag_pwnablekr | grep UPX -UPX! -$Info: This file is packed with the UPX executable packer http://upx.sf.net $ -$Id: UPX 3.08 Copyright (C) 1996-2011 the UPX Team. All Rights Reserved. $ -UPX! -UPX! -$ upx -d flag_pwnablekr - Ultimate Packer for eXecutables - Copyright (C) 1996 - 2017 -UPX 3.94 Markus Oberhumer, Laszlo Molnar & John Reiser May 12th 2017 - File size Ratio Format Name - -------------------- ------ ----------- ----------- - 883745 <- 335288 37.94% linux/amd64 flag_pwnablekr -Unpacked 1 file. -$ strings flag_pwnablekr | grep -i upx -UPX...? sounds like a delivery service :) -``` - -#### xxd - xxd_crackme -```text -$ xxd -g1 xxd_crackme -...... -00001020: 00 00 00 00 67 30 30 64 4a 30 42 21 00 00 00 00 ....g00dJ0B!.... -...... -``` -```text -$ strings -d xxd_crackme -...... -g00dJ0B! -...... -``` diff --git a/src/Others/1.5.7_brk.c b/src/Others/1.5.7_memory/brk.c similarity index 100% rename from src/Others/1.5.7_brk.c rename to src/Others/1.5.7_memory/brk.c diff --git a/src/Others/1.5.7_mmap.c b/src/Others/1.5.7_memory/mmap.c similarity index 100% rename from src/Others/1.5.7_mmap.c rename to src/Others/1.5.7_memory/mmap.c diff --git a/src/Others/1.5.7_stack.c b/src/Others/1.5.7_memory/stack.c similarity index 100% rename from src/Others/1.5.7_stack.c rename to src/Others/1.5.7_memory/stack.c diff --git a/src/Others/2.1_pwn_env.sh b/src/Others/2.1_vm/pwn_env.sh similarity index 100% rename from src/Others/2.1_pwn_env.sh rename to src/Others/2.1_vm/pwn_env.sh diff --git a/src/Reverse/2.2_serial_number_300 b/src/Others/2.2_gdb/serial_number_300 similarity index 100% rename from src/Reverse/2.2_serial_number_300 rename to src/Others/2.2_gdb/serial_number_300 diff --git a/src/Others/2.7_pwntools.sh b/src/Others/2.7_pwntools/binutils.sh similarity index 100% rename from src/Others/2.7_pwntools.sh rename to src/Others/2.7_pwntools/binutils.sh diff --git a/src/Others/3.3.1_fmt b/src/Others/3.3.1_format_string/fmt similarity index 100% rename from src/Others/3.3.1_fmt rename to src/Others/3.3.1_format_string/fmt diff --git a/src/Others/3.3.1_fmt.c b/src/Others/3.3.1_format_string/fmt.c similarity index 100% rename from src/Others/3.3.1_fmt.c rename to src/Others/3.3.1_format_string/fmt.c diff --git a/src/Others/3.3.1_fmt_2.c b/src/Others/3.3.1_format_string/fmt_2.c similarity index 100% rename from src/Others/3.3.1_fmt_2.c rename to src/Others/3.3.1_format_string/fmt_2.c diff --git a/src/Others/3.3.2_integer.c b/src/Others/3.3.2_integer_overflow/integer.c similarity index 100% rename from src/Others/3.3.2_integer.c rename to src/Others/3.3.2_integer_overflow/integer.c diff --git a/src/Others/3.3.2_width_overflow.c b/src/Others/3.3.2_integer_overflow/width_overflow.c similarity index 100% rename from src/Others/3.3.2_width_overflow.c rename to src/Others/3.3.2_integer_overflow/width_overflow.c diff --git a/src/Pwn/3.3.4_rop_emporium.bin b/src/Others/3.3.4_rop/rop_emporium.bin similarity index 100% rename from src/Pwn/3.3.4_rop_emporium.bin rename to src/Others/3.3.4_rop/rop_emporium.bin diff --git a/src/Others/5.2_pin.c b/src/Others/5.2_pin/passwd.c similarity index 100% rename from src/Others/5.2_pin.c rename to src/Others/5.2_pin/passwd.c diff --git a/src/Reverse/flag_pwnablekr b/src/Reverse/flag_pwnablekr deleted file mode 100755 index bfe60ff..0000000 Binary files a/src/Reverse/flag_pwnablekr and /dev/null differ diff --git a/src/Reverse/strings_crackme b/src/Reverse/strings_crackme deleted file mode 100755 index 904868d..0000000 Binary files a/src/Reverse/strings_crackme and /dev/null differ diff --git a/src/Reverse/xxd_crackme b/src/Reverse/xxd_crackme deleted file mode 100755 index 61917fa..0000000 Binary files a/src/Reverse/xxd_crackme and /dev/null differ