- A. 控制台实用命令——commandline
- B. 常数类——constants
- C. ROP——ROP类
- D. SROP——SigReturnFrame类
- E. FILE结构体——FileStructure类
- F. 格式化字符串漏洞工具——FmtStr类
- G. 数据打包实用函数——pwnlib/util/packing.py
A. 控制台实用命令——commandline
pwntools提供了一系列实用的控制台命令工具,源码相对路径:/pwnlib/commandline。
1. asm
命令用法:pwn asm [-h] [-f {raw,hex,string,elf}] [-o file] [-c context] [-v AVOID] [-n] [-z] [-d] [-e ENCODER] [-i INFILE] [-r] [line ...]
选项:
options:
-h, --help show this help message and exit
-f {raw,hex,string,elf}, --format {raw,hex,string,elf}
Output format (defaults to hex for ttys, otherwise raw)
-o file, --output file
Output file (defaults to stdout)
-c context, --context context
The os/architecture/endianness/bits the shellcode will run in (default: linux/i386), choose from: ['16', '32', '64', 'android', 'baremetal', 'cgc', 'freebsd', 'linux',
'windows', 'powerpc64', 'aarch64', 'powerpc', 'sparc64', 'mips64', 'msp430', 'alpha', 'amd64', 'riscv', 'sparc', 'thumb', 'cris', 'i386', 'ia64', 'm68k', 'mips', 's390',
'none', 'avr', 'arm', 'vax', 'little', 'big', 'be', 'eb', 'le', 'el']
-v AVOID, --avoid AVOID
Encode the shellcode to avoid the listed bytes (provided as hex)
-n, --newline Encode the shellcode to avoid newlines
-z, --zero Encode the shellcode to avoid NULL bytes
-d, --debug Debug the shellcode with GDB
-e ENCODER, --encoder ENCODER
Specific encoder to use
-i INFILE, --infile INFILE
Specify input file
-r, --run Run output
这里的asm命令有一个-z选项和-n选项,可以通过修改原本的指令来避免指令中出现换行和空字符。但是经过实际测试发现,这个功能转换出来的汇编指令并不是很好看。因此asm的这两个选项谨慎使用。
2. checksec
usage: pwn checksec [-h] [--file [elf ...]] [elf ...]
Check binary security settings
positional arguments:
elf Files to check
options:
-h, --help show this help message and exit
--file [elf ...] File to check (for compatibility with checksec.sh)
这个命令就不必多言了,检查ELF的安全选项,常用的命令。
3. constgrep
usage: pwn constgrep [-h] [-e] [-i] [-m] [-c arch_or_os] regex [constant]
Looking up constants from header files.
Example: constgrep -c freebsd -m ^PROT_ '3 + 4'
positional arguments:
regex The regex matching constant you want to find
constant The constant to find
options:
-h, --help show this help message and exit
-e, --exact Do an exact match for a constant instead of searching for a regex
-i, --case-insensitive
Search case insensitive
-m, --mask-mode Instead of searching for a specific constant value, search for values not containing strictly less bits that the given value.
-c arch_or_os, --context arch_or_os
The os/architecture/endianness/bits the shellcode will run in (default: linux/i386), choose from: ['16', '32', '64', 'android', 'baremetal', 'cgc', 'freebsd', 'linux',
'windows', 'powerpc64', 'aarch64', 'powerpc', 'sparc64', 'mips64', 'msp430', 'alpha', 'amd64', 'riscv', 'sparc', 'thumb', 'cris', 'i386', 'ia64', 'm68k', 'mips', 's390',
'none', 'avr', 'arm', 'vax', 'little', 'big', 'be', 'eb', 'le', 'el']
这个命令的功能有点意思。我们都知道在C语言标准库中有很多的宏定义常量,如mmap中的映射选项、读写权限选项等,有的时候,这种常量可能很多,在IDA中查看源码的时候,IDA当然是不可能会将函数传入的常数转换为这种宏定义的,这就会让我们阅读代码带来一定的困难,还需要去查阅源码才能知道传入常量的具体含义。而constgrep命令则允许我们通过一定的正则匹配筛选出源码中的常量,然后根据我们给出的值自动进行或操作拼接,最终给出原本的宏定义含义。如输入命令constgrep -c amd64 -m ^PROT_ 7,其输出如下:
#define PROT_NONE 0x0
#define PROT_READ 0x1
#define PROT_WRITE 0x2
#define PROT_EXEC 0x4
(PROT_WRITE | PROT_READ | PROT_EXEC) == 7
上面命令的功能是:找到amd64架构下所有以"PROT_"开头的宏定义,并通过或操作获得值7,输出中给出了或操作的具体项。如果不传入具体的数值而是添加-m选项,则会输出所有与正则匹配的宏定义。这个小工具有助于我们更容易理解IDA反编译出来的C代码。
4. cyclic
usage: pwn cyclic [-h] [-a alphabet] [-n length] [-c context] [-l lookup_value | count]
Cyclic pattern creator/finder
positional arguments:
count Number of characters to print
options:
-h, --help show this help message and exit
-a alphabet, --alphabet alphabet
The alphabet to use in the cyclic pattern (defaults to all lower case letters)
-n length, --length length
Size of the unique subsequences (defaults to 4).
-c context, --context context
The os/architecture/endianness/bits the shellcode will run in (default: linux/i386), choose from: ['16', '32', '64', 'android', 'baremetal', 'cgc', 'freebsd', 'linux',
'windows', 'powerpc64', 'aarch64', 'powerpc', 'sparc64', 'mips64', 'msp430', 'alpha', 'amd64', 'riscv', 'sparc', 'thumb', 'cris', 'i386', 'ia64', 'm68k', 'mips', 's390',
'none', 'avr', 'arm', 'vax', 'little', 'big', 'be', 'eb', 'le', 'el']
-l lookup_value, -o lookup_value, --offset lookup_value, --lookup lookup_value
Do a lookup instead printing the alphabet
这个工具可以生成指定长度的缓冲数据,可通过-a选项指定缓冲数据可以使用的字符。
5. debug
usage: pwn debug [-h] [-x GDBSCRIPT] [--pid PID] [-c context] [--exec EXECUTABLE] [--process PROCESS_NAME] [--sysroot SYSROOT]
Debug a binary in GDB
options:
-h, --help show this help message and exit
-x GDBSCRIPT Execute GDB commands from this file.
--pid PID PID to attach to
-c context, --context context
The os/architecture/endianness/bits the shellcode will run in (default: linux/i386), choose from: ['16', '32', '64', 'android', 'baremetal', 'cgc', 'freebsd', 'linux',
'windows', 'powerpc64', 'aarch64', 'powerpc', 'sparc64', 'mips64', 'msp430', 'alpha', 'amd64', 'riscv', 'sparc', 'thumb', 'cris', 'i386', 'ia64', 'm68k', 'mips', 's390',
'none', 'avr', 'arm', 'vax', 'little', 'big', 'be', 'eb', 'le', 'el']
--exec EXECUTABLE File to debug
--process PROCESS_NAME
Name of the process to attach to (e.g. "bash")
--sysroot SYSROOT GDB sysroot path
这个指令和gdb的功能类似,可以通过–pid参数对某个进程进行调试,可以通过–process参数根据进程名对进程进行调试等。
6. disablenx
后面跟上ELF文件名即可,可以让该ELF文件执行时关闭NX栈不可执行保护。
7. disasm
usage: pwn disasm [-h] [-c arch_or_os] [-a address] [--color] [--no-color] [hex ...]
Disassemble bytes into text format
positional arguments:
hex Hex-string to disassemble. If none are supplied, then it uses stdin in non-hex mode.
options:
-h, --help show this help message and exit
-c arch_or_os, --context arch_or_os
The os/architecture/endianness/bits the shellcode will run in (default: linux/i386), choose from: ['16', '32', '64', 'android', 'baremetal', 'cgc', 'freebsd', 'linux',
'windows', 'powerpc64', 'aarch64', 'powerpc', 'sparc64', 'mips64', 'msp430', 'alpha', 'amd64', 'riscv', 'sparc', 'thumb', 'cris', 'i386', 'ia64', 'm68k', 'mips', 's390',
'none', 'avr', 'arm', 'vax', 'little', 'big', 'be', 'eb', 'le', 'el']
-a address, --address address
Base address
--color Color output
--no-color Disable color output
反汇编命令,传入的数据是以16进制bytes的形式,如需要传入字符串’aa’则应该写成6161。
8. elfdiff
传入两个ELF文件,比较两个文件。
9. elfpatch
usage: pwn elfpatch [-h] elf offset bytes
Patch an ELF file
positional arguments:
elf File to patch
offset Offset to patch in virtual address (hex encoded)
bytes Bytes to patch (hex encoded)
options:
-h, --help show this help message and exit
修改ELF文件中的几个字节。
10. errno
传入一个整数或者errno的宏定义,获取其errno宏定义或值。
11. hex
将传入字符串转换为16进制字符串。
12. libcdb
libc相关信息查询。
pwn libcdb file [LIBC]:通过给定libc打印其哈希、关键函数偏移等
pwn libcdb lookup [FUNC] [OFFSET]:通过给定函数和偏移查询候选libc,推测是使用LibcSearcher引擎,较新的libc可能搜不到
pwn libcdb hash [HASH_VALUE]:通过给定哈希值获取libc,不常用
13. phd
与hexdump功能类似,以pretty形式打印二进制文件的每个字节。
14. pwnstrip
和strip功能类似,去除程序符号表增加逆向难度。
15. scramble
usage: pwn scramble [-h] [-f {raw,hex,string,elf}] [-o file] [-c context] [-p] [-v AVOID] [-n] [-z] [-d]
Shellcode encoder
options:
-h, --help show this help message and exit
-f {raw,hex,string,elf}, --format {raw,hex,string,elf}
Output format (defaults to hex for ttys, otherwise raw)
-o file, --output file
Output file (defaults to stdout)
-c context, --context context
The os/architecture/endianness/bits the shellcode will run in (default: linux/i386), choose from: ['16', '32', '64', 'android', 'baremetal', 'cgc', 'freebsd', 'linux',
'windows', 'powerpc64', 'aarch64', 'powerpc', 'sparc64', 'mips64', 'msp430', 'alpha', 'amd64', 'riscv', 'sparc', 'thumb', 'cris', 'i386', 'ia64', 'm68k', 'mips', 's390',
'none', 'avr', 'arm', 'vax', 'little', 'big', 'be', 'eb', 'le', 'el']
-p, --alphanumeric Encode the shellcode with an alphanumeric encoder
-v AVOID, --avoid AVOID
Encode the shellcode to avoid the listed bytes
-n, --newline Encode the shellcode to avoid newlines
-z, --zero Encode the shellcode to avoid NULL bytes
-d, --debug Debug the shellcode with GDB
这个命令看上去应该是一个shellcode的解码器,支持将shellcode解码成全字母,允许定义黑名单等,但是笔者在全网都没有搜到这个命令的一个使用的例子,试了各种方法命令运行都报错,甚至连new bing返回的结果都是错的。不过想要实现全字母shellcode还能用AE64。若有读者知道这个命令到底是怎么用的,还请不吝赐教。
学习路线:
这个方向初期比较容易入门一些,掌握一些基本技术,拿起各种现成的工具就可以开黑了。不过,要想从脚本小子变成黑客大神,这个方向越往后,需要学习和掌握的东西就会越来越多以下是网络渗透需要学习的内容: