modify src's structure

This commit is contained in:
firmianay 2017-12-30 15:12:42 +08:00
parent b3ff465812
commit b3c82b0ccf
27 changed files with 31 additions and 73 deletions

View File

@ -19,6 +19,7 @@
``` ```
. .
├── .gitignore ├── .gitignore
├── .travis.yml
├── CHANGELOG ├── CHANGELOG
├── CONTRIBUTION.md ├── CONTRIBUTION.md
├── doc ├── doc
@ -35,10 +36,6 @@
│   │   └── init │   │   └── init
│   ├── Others │   ├── Others
│   │   └── 1.5.7_brk.c │   │   └── 1.5.7_brk.c
│   ├── Pwn
│   │   └── 3.3.1_goodlock_200
│   ├── Reverse
│   │   └── 2.2_serial_number_300
│   └── writeup │   └── writeup
│   └── 6.1.1_pwn_hctf2016_brop │   └── 6.1.1_pwn_hctf2016_brop
├── SUMMARY.md ├── SUMMARY.md
@ -53,6 +50,7 @@
- `CONTRIBUTION.md`:合作与贡献的相关内容。 - `CONTRIBUTION.md`:合作与贡献的相关内容。
- `SUMMARY.md`GitBook 目录结构。 - `SUMMARY.md`GitBook 目录结构。
- `.gitignore`:忽略特殊文件。 - `.gitignore`:忽略特殊文件。
- `.travis.yml`Travis CI 配置文件。
- `FAQ.md`:常见问题解答。 - `FAQ.md`:常见问题解答。
- `THANKS`:致谢名单。 - `THANKS`:致谢名单。
- `doc`:该目录包含书全部内容的 Markdown 文件。(文字) - `doc`:该目录包含书全部内容的 Markdown 文件。(文字)

View File

@ -65,7 +65,7 @@ RET ; 函数返回并跳转
![](../pic/1.5.7_stack.png) ![](../pic/1.5.7_stack.png)
我们来看一个例子:[源码](../src/Others/1.5.7_stack.c) 我们来看一个例子:[源码](../src/Others/1.5.7_memory/stack.c)
```c ```c
#include<stdio.h> #include<stdio.h>
int add(int a, int b) { 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堆结束地址和数据段开始地址重合。 在上图中我们看到 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 ```C
#include <stdio.h> #include <stdio.h>
#include <unistd.h> #include <unistd.h>
@ -347,7 +347,7 @@ void *mmap(void *addr, size_t len, int prot, int flags,
int munmap(void *addr, size_t len); int munmap(void *addr, size_t len);
``` ```
例子:[源码](../src/Others/1.5.7_mmap.c) 例子:[源码](../src/Others/1.5.7_memory/mmap.c)
```C ```C
#include <stdio.h> #include <stdio.h>
#include <sys/mman.h> #include <sys/mman.h>

View File

@ -81,4 +81,4 @@ r2pipe
#### 工具安装脚本 #### 工具安装脚本
- ctf-tools - https://github.com/zardus/ctf-tools - 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)

View File

@ -459,7 +459,7 @@ $ yaourt -S peda
gdb-peda$ python myrun(100) 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) __int64 __fastcall main(__int64 a1, char **a2, char **a3)
{ {

View File

@ -40,7 +40,7 @@ $ yaourt -S python2-pwntools
$ yaourt -S python2-pwntools-git $ 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 ```bash
#!/usr/bin/env bash #!/usr/bin/env bash

View File

@ -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()` 调用时出现的顺序是一致的。 使程序崩溃只是验证漏洞的第一步,攻击者还可以利用格式化输出函数来获得内存的内容,为下一步漏洞利用做准备。我们已经知道了,格式化字符串函数会根据格式字符串从栈上取值。由于在 x86 上栈由高地址向低地址增长,而 `printf()` 函数的参数是以逆序被压入栈的,所以参数在内存中出现的顺序与在 `printf()` 调用时出现的顺序是一致的。
下面的演示我们都使用下面的[源码](../src/Others/3.3.1_fmt_2.c) 下面的演示我们都使用下面的[源码](../src/Others/3.3.1_format_string/fmt_2.c)
```c ```c
#include<stdio.h> #include<stdio.h>
void main() { void main() {
@ -1234,7 +1234,7 @@ pwnlib.fmtstr.fmtstr_payload(offset, writes, numbwritten=0, write_size='byte')
- numbwritten (int):已经由 printf 函数写入的字节数 - numbwritten (int):已经由 printf 函数写入的字节数
- write_size (str):必须是 byteshort 或 int。告诉你是要逐 byte 写,逐 short 写还是逐 int 写hhnhn或n - write_size (str):必须是 byteshort 或 int。告诉你是要逐 byte 写,逐 short 写还是逐 int 写hhnhn或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 ```c
#include<stdio.h> #include<stdio.h>
void main() { void main() {

View File

@ -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 ```c
#include<stdio.h> #include<stdio.h>
void main() { void main() {
@ -254,7 +254,7 @@ void main(int argc, char *argv[]) {
这个例子接受两个字符串类型的参数并计算它们的总长度,程序分配足够的内存来存储拼接后的字符串。首先将第一个字符串参数复制到缓冲区中,然后将第二个参数连接到尾部。如果攻击者提供的两个字符串总长度无法用 `total` 表示,则会发生截断,从而导致后面的缓冲区溢出。 这个例子接受两个字符串类型的参数并计算它们的总长度,程序分配足够的内存来存储拼接后的字符串。首先将第一个字符串参数复制到缓冲区中,然后将第二个参数连接到尾部。如果攻击者提供的两个字符串总长度无法用 `total` 表示,则会发生截断,从而导致后面的缓冲区溢出。
#### 实战 #### 实战
看了上面的示例,我们来真正利用一个整数溢出漏洞。[源码](../src/Other/3.3.2_integer.c) 看了上面的示例,我们来真正利用一个整数溢出漏洞。[源码](../src/Other/3.3.2_integer_overflow/integer.c)
```c ```c
#include<stdio.h> #include<stdio.h>
#include<string.h> #include<string.h>

View File

@ -61,6 +61,8 @@
这些挑战都包含一个 `flag.txt` 的文件,我们的目标就是通过控制程序执行,来打印出文件中的内容。当然你也可以尝试获得 shell。 这些挑战都包含一个 `flag.txt` 的文件,我们的目标就是通过控制程序执行,来打印出文件中的内容。当然你也可以尝试获得 shell。
[下载文件](../src/Others/3.3.4_rop/rop_emporium.bin)
#### ret2win32 #### ret2win32
通常情况下,对于一个有缓冲区溢出的程序,我们通常先输入一定数量的字符填满缓冲区,然后是精心构造的 ROP 链,通过覆盖堆栈上保存的返回地址来实现函数跳转(关于缓冲区溢出请查看上一章 3.3.3栈溢出)。 通常情况下,对于一个有缓冲区溢出的程序,我们通常先输入一定数量的字符填满缓冲区,然后是精心构造的 ROP 链,通过覆盖堆栈上保存的返回地址来实现函数跳转(关于缓冲区溢出请查看上一章 3.3.3栈溢出)。

View File

@ -335,7 +335,7 @@ Pintool 的入口为 `main` 函数,通常需要完成下面的功能:
## Pin 在 CTF 中的应用 ## Pin 在 CTF 中的应用
由于程序具有循环、分支等结构,每次运行时执行的指令数量不一定相同,于是我们可是使用 Pin 来统计执行指令的数量,从而对程序进行分析。特别是对一些使用特殊指令集和虚拟机,或者运用了反调试等技术的程序来说,相对于静态分析去死磕,动态插桩技术是一个比较好的选择。 由于程序具有循环、分支等结构,每次运行时执行的指令数量不一定相同,于是我们可是使用 Pin 来统计执行指令的数量,从而对程序进行分析。特别是对一些使用特殊指令集和虚拟机,或者运用了反调试等技术的程序来说,相对于静态分析去死磕,动态插桩技术是一个比较好的选择。
我们先举一个例子,[源码](../src/Others/5.2_pin.c)如下: 我们先举一个例子,[源码](../src/Others/5.2_pin/passwd.c)如下:
```c ```c
#include<stdio.h> #include<stdio.h>
#include<string.h> #include<string.h>

View File

@ -321,7 +321,7 @@ $ ssdeep -bm hash.txt modified.elf
## strings ## strings
**strings** 命令在对象文件或二进制文件中查找可打印的字符串。字符串是4个或更多可打印字符的任意序列以换行符或空字符结束。strings命令对识别随机对象文件很有用。 **strings** 命令在对象文件或二进制文件中查找可打印的字符串。字符串是4个或更多可打印字符的任意序列以换行符或空字符结束。strings 命令对识别随机对象文件很有用。
#### 重要参数 #### 重要参数
```text ```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 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* 组合使用 *strings**grep*
@ -344,11 +359,6 @@ $ strings -t x /lib32/libc-2.24.so | grep /bin/sh
$ strings [executable] | grep -i upx $ strings [executable] | grep -i upx
``` ```
#### 练习
[strings_crackme](../src/Reverse/strings_crackme)
[flag_pwnablekr](../src/Reverse/flag_pwnablekr)
## xxd ## xxd
**xxd** 的作用就是将一个文件以十六进制的形式显示出来。 **xxd** 的作用就是将一个文件以十六进制的形式显示出来。
@ -366,6 +376,3 @@ $ strings [executable] | grep -i upx
```shell ```shell
$ xxd -g1 [binary] $ xxd -g1 [binary]
``` ```
#### 练习
[xxd_crackme](../src/Reverse/xxd_crackme) (使用 *strings* 再做一次)

View File

@ -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!
......
```

Binary file not shown.

Binary file not shown.

Binary file not shown.