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
├── .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 文件。(文字)

View File

@ -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<stdio.h>
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 <stdio.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);
```
例子:[源码](../src/Others/1.5.7_mmap.c)
例子:[源码](../src/Others/1.5.7_memory/mmap.c)
```C
#include <stdio.h>
#include <sys/mman.h>

View File

@ -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)

View File

@ -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)
{

View File

@ -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

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()` 调用时出现的顺序是一致的。
下面的演示我们都使用下面的[源码](../src/Others/3.3.1_fmt_2.c)
下面的演示我们都使用下面的[源码](../src/Others/3.3.1_format_string/fmt_2.c)
```c
#include<stdio.h>
void main() {
@ -1234,7 +1234,7 @@ pwnlib.fmtstr.fmtstr_payload(offset, writes, numbwritten=0, write_size='byte')
- numbwritten (int):已经由 printf 函数写入的字节数
- 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
#include<stdio.h>
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
#include<stdio.h>
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<stdio.h>
#include<string.h>

View File

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

View File

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

View File

@ -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* 再做一次)

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.