PWN二进制安全修仙秘籍【第一章#工具篇02】GDB的利用及pwndbg插件安装 ...

打印 上一主题 下一主题

主题 919|帖子 919|积分 2757

很多人在学习新知识之前都不喜欢研究理论、原理,我觉得这是大错特错的!!!
所以
在学习GDB的利用之前,我们先来学习一下GDB的构成
1. GDB的构成

下面这张图就是GDB的构成架构,是不是很抽象哩,看不懂哩,让我总结一下!(其实我也看不懂

 简单来说就是
用户(就是我,小坤同砚)
通过
cli接口或者mi接口(就是可视化的图形界面)
然后
通过ptrace系统调用实现(ptrace系统调用是什么东东,百度了一下,下面具体讲讲俺百度的内容

2. 工作原理(本质就是ptrace系统调用)

 下面展示一段很抽象很简单的代码,也就是ptrace的函数原型:
  1. #include <sys/ptrace.h>
  2. long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data);
  3. /*
  4. pid_t pid:指示ptrace要跟踪的进程;
  5. *void addr:指示要监控的内存地址;
  6. *data:存放读取出的或者要写入的数据;
  7. enum __ptrace_request request:决定了系统调用的功能,它主要有以下几个选项:
  8.         1.PTRACE_TRACEME:表示表示被父进程跟踪,任何信号(除了SIGKILL)都会暂停子进程,接着阻塞于wait()等待的父进程被唤醒。子进程内部调用exec()时会发出SIGTRAP信号,可以让父进程在子进程新程序开始运行之前就完全控制它;
  9.         2.PTRACE_ATTACH:attach到一个指定的进程,使其成为当前进程跟踪的子进程,而子进程的行为等同于进行了一次PTRACE_TRACEME操作。需要注意的是,虽然当前进程成为被跟踪进程的子进程,但是子进程使用getppid()得到的仍是其原始父进程的PID;
  10.         3.PTRACE_CONT:继续运行之前停止子进程。可同时向子进程交付指定的信号。
  11. */
复制代码
研究一个东西,只必要知道它有什么用来自哪里它要去哪里就行了!!!
他有什么用??
ptrace系统调用可以操作父进程观察和控制其他进程的执行(痴汉),检查和改变其核心映像以及寄存器(大夫君主义)
它来自哪里??
ptrace系统调用被封装在libc中,利用时必要引入ptrace.h头文件,通过传入一个请求参数和一个进程ID来调用。
它要去哪里??
具体的调用过程等我再单独单开一篇,写完后再贴上来。

3. 三种调用方式


第一种 运行并调试一个新进程
步调一:输入gdb 目标步伐      或者    输入gdb后通过file下令指定目标步伐


步调二:输入run下令就可以愉悦の进行调试了~
   这里具体讲讲run下令后执行的一系列底层操作:
  起首 操作系统通过fork()系统调用创建一个新进程;
  然后 在新创建的子进程中执行操作ptrace(PTRACE_TRACEME,0,0,0);
  最后 在子进程中通过execv()系统调用加载用户指定的可执行文件。
  
第二种 attach并调试一个已经运行的进程
步调一:用户确定必要进行调试的进程PID;(查看pid下令:ps aux)
步调二:运行GDB,输入attach pid下令即可。(知识都是环环相扣的,tmux分屏这时候就表现到利益了:一屏运行步伐,二屏查找pid,三屏运行gdb)

    这里再补充一下底层做了什么:
  对该进程执行操作ptrace(PTRACE_ATTACH,pid,0,0)。
  
第三种 长途调试目标机上新创建的进程
步调一:长途调试目标机子上输入如下下令
  1. # 假设你想调试的进程ID是1234,开放远程调试端口9999
  2. gdbserver :9999 --attach 1234
复制代码
步调二:在本地利用gdb的机子上输入如下下令
  1. gdb
  2. # 在GDB中
  3. (gdb) target remote target-ip:9999
复制代码

    照例讲一下原理吧:
  起首 GDB运行在调试机上,gdbserver运行在目标机上,两者之间的通信数据格式由GDB长途串行协议(Remote Serial Protocol,RSP)界说;
  然后 RSP协议数据的基本格式为:$......#xx
  最后 gdbserver的启动方式相称于运行并调试一个新创建的进程。
  
4. 断点的实现

各人为什么要利用GDB?
最多的需求就是打断点
在这末节我们讲讨论如何实现断点
断点分为两种

硬件断点,顾名思义,通过硬件实现
在x86架构中,提供了8个调试寄存器(DR0~DR7)和2个MSR寄存器,其中DR0~DR3是硬件寄存器,用于放入内存或I/O地点,设置执行、修改等操作。

软件断点,通过内核信号实现
在x86架构中,内核向某个地点打断点,实际上就是往该地点写入断点指令INT 3,即0xCC;
目标步伐运行到这条指令之后就会触发SIGTRAP信号
GDB捕捉到这个信号,并根据目标步伐当前制止的位置查询GDB维护的断点链表
若发现在该地点确实存在断点,则可判断为断点命中。

 5. GDB窗口叫TUI

TUI(TextUser Interface)为GDB调试的文本用户界面
有五种窗口:
command窗口,即下令窗口,可以键入调试下令
source窗口,源代码窗口,表现当前行,断点等信息
assembly窗口,汇编代码窗口
register窗口,寄存器窗口
split窗口,源码和汇编混淆窗口
下面先容一个在gdb里利用的下令layout
输入layout src,即可进入源代码窗口,看下面!!

那要怎么退出咧?
有点复杂,和麻烦,就是要利用快捷键组合CTRL+X和CTRL+A可以关闭分屏窗口 
下面为兄弟们总结好layout分屏的相关下令了,接好了!
  1. # 显示源代码窗口
  2. layout src
  3. # 显示汇编窗口
  4. layout asm
  5. # 显示源代码/汇编和寄存器窗口
  6. layout regs
  7. # 显示源代码和汇编窗口
  8. layout split
  9. # 显示下一个layout
  10. layout next
  11. # 显示上一个layout
  12. layout prev
  13. # 刷新窗口
  14. Ctrl + L
  15. # 单窗口模式,显示一个窗口
  16. Ctrl + x,再按1
  17. # 双窗口模式,显示两个窗口
  18. Ctrl + x,再按2
  19. # 退出layout分屏
  20. Ctrl + x,再按a
复制代码

6. GDB常用操作下令

最后就总结一下GDB调试中常用的操作下令,忘记下令的时候来瞧一眼
特别留意的是!!
全部的地点操作,都要在地点前加上星号  * !!!


  • 断点操作相关下令
  1. # 下断点
  2. break
  3. # 查看断点
  4. info break
  5. # 禁用断点
  6. disable
  7. # 启用断点
  8. enable
  9. # 清除断点
  10. clear
复制代码


  • 步进/步过/继续/启动下令
  1. # 以源码的形式单步步进,会进入子程序
  2. step
  3. # 以源码的形式单步步过,不会进入子程序
  4. next
  5. # 以机器码的形式单步步进,会进入子程序
  6. stepi
  7. # 以机器码的形式单步步过,不会进入子程序
  8. nexti
  9. # 在信号或断点之后,继续运行被调试程序
  10. continue
  11. # 启动被调试程序
  12. run
复制代码


  •  打印输出下令
  1. # 求表达式expr的值并打印
  2. print [expr]
  3. # 查看内存;指定要查看n个单位的内存值;显示格式是print('x','d','u','o','t','a','c','f','s')使用的格式之一,再加i(机器指令);u是单位大小,常用单位有b表示单字节、h表示双字节、w表示四字节、g表示八字节
  4. x/nfu <addr>
  5. # 每次程序停止时打印表达式expr或者内存地址addr的值
  6. display <expr>|<addr>
  7. # 打印整个栈的回溯,每个栈帧一行
  8. backtrace
  9. # 反编译指定函数
  10. disassemble
  11. # 反编译的同时显示机器码
  12. disassemble /r
  13. # 查看栈帧信息
  14. info frame
复制代码

7. 增强工具pwndbg/peda/gef

一样平常的小黑子是不会用原生的GDB的
他们会加点科技
就是下面这些常用的插件工具
pwndbg:是一个GDB插件,使GDB的调试不那么糟糕,重点关注低级软件开辟职员、硬件黑客、逆向工程师和开辟职员必要的特性;(最常用)
peda:GDB的Python开辟帮忙;
gef:是一组用于x86/64、ARM、MIPS、PowerPC和SPARC的下令,用于在利用老式GDB时资助开辟职员和反向工程师。
安装步调就不重复了,网上很多文章,这里抄一篇大佬的文章Linux下gdb(插件pwndbg、pead、gef)安装及调试常用指令

下一节拿一个案例来具体说说gdb调试怎么用吧~

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

圆咕噜咕噜

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表