干libm反汇编的时候用的挺多的,也就那几个操作,总结一下
GDB
layout asm (分屏 展开汇编) |
b function (根据函数名打断点 无论在汇编或源码调试中都可用) |
i r reg (查看寄存器的值) |
- 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位(小端模式)
r (argument) 运行(带参数) |
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位
还有些取位数的带参数宏,不一一列举,网上一搜就能找到