这两天做题的时候同届的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