汇总: pwn分析工具GDB + peda + objdump + readelf
前言
本篇内容持续完善中…
- GDB是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具. GDB主要来调试C/C++语言写的程序,GDB调试是可执行文件而不是.c文件.
- GDB的一些增强工具:peda,pwbdbg,gef等.
- GNU工具链 (GNU Toolchain) 是一组用于开发应用程序和操作系统的编程工具的集合,这些工具构成了一个完整的系统。GNU工具链包括GDB、GCC、GNU Binutils、GNU make等部分.
熟练掌握GDB-> gdb peda -> GNU Binutils: objdump readelf等工具,对调试很重要.
1、GDB的基本操作
GDB是一个终端调试器, 这就要习惯于使用命令来操作.常用命令:
-
run 简记 r 运行GDB调试
-
quit 简记 q 退出GDB调试
-
list 简记 l 可以列出所调试程序的代码.
- list+***** 列出******附近的代码
- list+***** 列出******附近的代码
-
break n (简写b n) 在第n行处设置断点
- break [function] 在函数体处设置断点
- break [line] 在源文件指定行下断点
- break -N break + N 在源文件前n行 后n行下断点
- break [address] 在程序指令地址处下断点
- delete d 删除断点, 不带参数时删除所有断点
-
info (简写i)
- i b 查看断点
- info reg 查看寄存器
- 在寄存器之前添加 $,即可以显示各个寄存器的内容
- info threads 打印所有线程信息
- info frame 打印指定栈帧的详细信息
-
- info proc 查看proc里的进程信息
- i b 查看断点
-
step 简记s step N 单步步进,参数n表示执行n次
-
next 简记n next N单步步过.
-
continue 简记 c continue N 继续运行程序,程序会在遇到断点后再次暂停运行,如果没有遇到断点就会一直运行到结束。
-
x/nfu 显示内存的内容,x这个名字的由来是eXamining.
- x/格式 地址
格式 说明
x 显示为十六进制数
d 显示为十进制数
u 显示为无符号十进制数
o 显示为八进制数
t 显示为二进制数,t的由来是two
a 地址
c 显示为字符(ASCII)
f 浮点小数
s 显示为字符串
i 显示为机器语言(仅在显示内存的X命令中可以使用) - x/n 重复次数,
- x/ni 的意思是显示汇编指令 x/10i
- x/格式 地址
-
disassemble 简记 disas
- 反汇编当前整个函数
- disassemble 开始地址 结束地址, 反汇编从开始地址到结束地址之间的部分
-
backtrace 简记bt
- bt 打印整个栈的回溯,每个栈帧一行
- bt N 只打印最内层的N个栈帧
- bt -N 只打印最外层的N个栈帧
2、GDB增强工具peda
peda是为GDB设计的一个插件,全称是Python Exploit Development Assistance for GDB。它提供了很多人性化的功能,比如高亮显示反汇编代码、寄存器、内存信息,提高了debug的效率.
安装:
$ git clone https://github.com/longld/peda.git ~/peda
$ echo "source ~/peda/peda.py" >> ~/.gdbinit
使用:
添加命令以支持调试和利用开发(有关命令使用的完整列表peda help):
aslr - 显示/设置GDB的ASLR设置
checksec - 检查二进制文件的各种安全选项
dumpargs - 在呼叫指令处停止时显示传递给函数的参数
dumprop - 将特定内存范围内的所有ROP小工具转储
elfheader - 从被调试的ELF文件中获取标题信息
elfsymbol - 从ELF文件获取非调试符号信息
lookup - 搜索所有地址/参考地址属于一个内存范围
patch - 修补程序内存以string / hexstring / int的地址开始
pattern - 生成,搜索或写入循环模式到内存
procinfo - 显示/ proc / pid /
pshow - 显示各种PEDA选项和其他设置
pset - 设置各种PEDA选项和其他设置
readelf - 从ELF文件获取标题信息
ropgadget - 获取二进制或库的通用ROP小工具
ropsearch - 在内存中搜索ROP小工具
searchmem|find - 在内存中搜索模式; 支持正则表达式搜索//查找用,例如searchmem“/ bin / sh”libc
shellcode - 生成或下载常用的shellcode。
skeleton - 生成python漏洞利用代码模板
vmmap -- //可以用来查看栈、bss段是否可以执行
xormem - 用一个键异或存储区域
- pattern – 生成字符串模板 写入内存 用于定位溢出点
- pattern create size 生成特定长度字符串
- pattern offset value 定位字符串
3、GNU工具链 (GNU Toolchain): objdump + readelf
GNU工具链 (GNU Toolchain)是一组用于开发应用程序和操作系统的编程工具的集合,这些工具构成了一个完整的系统。GNU工具链包括GDB、GCC、GNU Binutils、GNU make等部分.
-
GNU Binutils 是 GNU Binary Utilities 的简写,一般简称为 Binutils。中文可以翻译为 GNU 的二进制工具集。显然,Binutils 是一组二进制工具的集合。也就是说,Binutils 不是指某一个工具,而是指一组工具,并且这些工具都是专门针对于二进制的.
-
GNU Binutils是一系列二进制工具的集合。主要包括:
ld —— GNU链接器, ld是链接器,通常由GCC/G++调用。外部基本不可见
as—— GNU汇编器 -
GNU Binutils还包括以下二进制工具( 这些工具程序通常搭配GCC、make、和GDB这些程序来使用。):
- nm:显示目标文件内的符号信息
- objdump:显示目标文件的相关信息,具备反汇编是其最大的亮点, 不过其反汇编依赖与ELF节头,而且不不会进行控制流分析。
- readelf: 解析ELF格式文件的信息. 与objdump类似, 但是显示内容更加具体, 而且不依赖BFD库. 可通过参数选项来控制显示哪些特定信息。( readelf不支持显示静态库, 也不支持64位的ELF文件)。
…本篇内容持续完善中…