mirror of
https://github.com/nganhkhoa/CTF-All-In-One.git
synced 2024-12-24 03:01:15 +07:00
modify src's structure
This commit is contained in:
parent
b3ff465812
commit
b3c82b0ccf
@ -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 文件。(文字)
|
||||
|
@ -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>
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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
|
||||
|
||||
|
@ -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):必须是 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<stdio.h>
|
||||
void main() {
|
||||
|
@ -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>
|
||||
|
@ -61,6 +61,8 @@
|
||||
|
||||
这些挑战都包含一个 `flag.txt` 的文件,我们的目标就是通过控制程序执行,来打印出文件中的内容。当然你也可以尝试获得 shell。
|
||||
|
||||
[下载文件](../src/Others/3.3.4_rop/rop_emporium.bin)
|
||||
|
||||
#### ret2win32
|
||||
通常情况下,对于一个有缓冲区溢出的程序,我们通常先输入一定数量的字符填满缓冲区,然后是精心构造的 ROP 链,通过覆盖堆栈上保存的返回地址来实现函数跳转(关于缓冲区溢出请查看上一章 3.3.3栈溢出)。
|
||||
|
||||
|
@ -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>
|
||||
|
@ -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* 再做一次)
|
||||
|
@ -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.
Loading…
Reference in New Issue
Block a user