IDA使用技巧
这两天做题的时候同届的pwn师傅sakura来问有没有可以修改IDA局部变量的方法。研究了一下感觉很有意思,于是单独开一篇文章记录我经常用到的IDA小技巧。
修改局部变量
IDA
IDA有两种实现方式,我在网上查到可以force new variable,但是我一直没成功。
实现效果:
步骤:
因为可以观察到都是分开赋值的
我们在var_5那边按U
我们的目标是分出一个char+int,因为我得需求是让v2[0]单独分出来变成char,v2[1]-v2[4]变成四字节的int,所以我们选择1+4
在01的地方按N重命名成i,在05的地方选择建立数组(可以按A)在N成opcode
回到executeBrainfuck按F5
接着来改汇编
因为IDA在反编译的时候,会根据变量的访问方式和指令来推断变量类型
1 | mov dword ptr [rbp+opcode+1], 0 ; 赋值了 4 个字节 |
opcode[1]之后是 4 个连续的字节,IDA会推测opcode[5]这样的存储
我们把它nop掉
1、opcode+1
字节数显着地4
初始化,IDA 无法确认它是内存的一部分,因此可能会被拆除int
。
2.IDA偏向于最简单的数据结构,因此[rbp-5h]
直接赋值signed __int8 opcode
,而[rbp-4h]
作为int opcode_1
处理。
在opcode那里按Y转换函数类型+按N重命名i就好了
Ghidra一把梭
考虑到是pwn的师傅,所以不推荐()ghidra挺麻烦的但是足够底层,确实好用
伪代码对应汇编
可以实现点伪代码哪里汇编会相应跳转,汇编同理,patch的时候好用
修复枚举值
以ptrace函数为例,这里的12LL表示一个功能号。在12上面按M,点击yes,ctrl+F搜索ptrace,这里是PTRACE_GETREGS
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Samsāraのblog!