# 无需gdbpython的gdb增强脚本 ## 前言 在工作中遇到某些调试环境中gdb不支持gdbpython,大部分主流的增强脚本(PEDA,GEF等)均用python开发因此无法使用。本文记录一下查找相关脚本期间遇到的问题。 ## TUI https://sourceware.org/gdb/current/onlinedocs/gdb.html/TUI.html 可以使用 `gdb -tui`开启,或进入gdb以后输入命令`tui enable`或快捷键`Ctrl-x Ctrl-a`。进入tui模式后依次输入命令: ``` (gdb) layout asm (gdb) layout regs ``` 显示寄存器窗口和汇编窗口。 tui模式是gdb自带的增强调试界面,但对于个人而言宁可自己写简单的gdb辅助脚本也不会用tui。 ## gdb临时脚本 如果在断网环境下工具准备不够充分的前提下可以临时编写简单的gdb脚本用来辅助调试: ``` define regs i r end define disasm x/8i $pc end define context regs disasm backtrace 10 end define si stepi context end define s step context end define ni nexti context end define n next context end ``` 该脚本可以实时输出每步的寄存器、反汇编、函数调用栈的信息 ## rawdbg https://github.com/binLep/rawdbg FreeBSD上无需gdbpython的增强脚本。但该脚本在linux上无法运行,尝试对其移植的时候又遇到了一个gdb因为低版本导致的eval命令无法正确传参的问题: ```shell $ gdb GNU gdb (Debian 12.1-3) 12.1 ... (No debugging symbols found in /bin/sh) (gdb) set $arg0="aaa" (gdb) set $arg1="bbbb" (gdb) set $arg2="ccccc" (gdb) eval "set $ret=\"%s\" \"%s\" \"%s\"", $arg0, $arg1, $arg2 (gdb) p/s $ret $1 = "aaabbbbccccc" ``` 高版本gdb可以使用 eval %s 的方法拼接类型为字符串的变量,但较低版本的gdb(7.11)则会报错: ```shell $ gdb GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.5) 7.11.1 ... (gdb) set $arg0="aaa" (gdb) set $arg1="bbbb" (gdb) set $arg2="ccccc" (gdb) eval "set $ret=\"%s\" \"%s\" \"%s\"", $arg0, $arg1, $arg2 Couldn't write extended state status: Bad address. (gdb) p/s $ret $1 = void ``` ## Gdbinit https://github.com/gdbinit/Gdbinit/ OS X,iOS 上无需gdbpython的gdb增强脚本,只需要删掉一些针对Mac的配置即可在Linux平台使用。支持实时显示寄存器,栈数据,汇编代码等多种信息的实时显示,自定义了多种命令。但一些颜色设置在Linux平台上有bug但总体来说不影响使用。