简易gdb & IDA操作

干libm反汇编的时候用的挺多的,也就那几个操作,总结一下

GDB

1
2
3
layout asm (分屏 展开汇编)
layout src (分屏 展开源码)
tui reg float (分屏 展开浮点型寄存器 别的同理 tab看一下选项就知道了)
1
2
3
4
b function (根据函数名打断点 无论在汇编或源码调试中都可用)
b line (行号打断点)
rb function (递归函数名断点)
rb .*function.* (根据函数名关键字匹配,递归打断点)
1
2
3
i r reg (查看寄存器的值)
watch variable (查看变量,当变量值发生变化时输出,需要程序运行起来,否则没有上下文信息)
p variable/expression (打印变量\表达式的值,表达式可以调用已有的函数、变量,也支持寄存器的计算)
  • p/x variable/expression 16进制
  • p/d … 10进制
  • p/u … 16进制无符号整型
  • p/o … 8进制
  • p/t … 2进制
  • p/c … 字符格式
  • p/f … 浮点型

查看内存地址

examine(简写x)

x/[n][f][u] addr

  • n - 内存单元数
  • f - 要打印的格式,控制字符同上print
  • u - 要打印的单元长度
  • addr - 内存地址,可以直接算直接地址,寄存器运算,或者取变量地址

单元长度

  • b 字节
  • h 双字节
  • w 四字节
  • g 八字节

例如 x/2gx 就显示的是两个8字节16进制的值。即连续的128位,像x86上的long double只用80位,那么看的就是低地址的第四位和高地址的全16位(小端模式)


1
2
3
4
5
6
r (argument) 运行(带参数)
c 运行到下一个断点
n 单步执行
s 单步进入,若有函数则进入该函数
finish 执行完当前函数
si 汇编单步进入

IDA Pro

Hex-rays

F5翻译出一份简化反汇编的伪C代码,也有可能失败。

tab在反编译和反汇编之间切换

远程调试

dbgsrv文件夹里丢一个linux_server64到服务器上去,选remote linux debugger,填一下服务器上的路径和程序、命令行参数,直接跑就完事了,有输入就往./linux_server进程里丢。

数据格式

双击常量变量/数组跳转到对应的rodata部分,按d转换数据格式,在 Options$\to$Setup data types中选择要转换的数据类型。

单个数据转换完之后右键Array可以手动转换一定长度的数组,IDA会根据分析(它往往切分好了数组)给你预设一个值,当然也不一定对,例如实际上在别的地方可能会跨数组,即在多个地方用了同一数组的不同部分,IDA便认为这些是不相干的数组,但是最后在某个地方发现跨数组,然后发现是同一个,这需要自己判断。

转换时注意Option中的signed element选项不要勾选。如果发现16进制带负号要注意这并不是真实的16进制值。

常用宏

tbyte - 80位 long double
qword - 64位
dword - 32位

还有些取位数的带参数宏,不一一列举,网上一搜就能找到