IDA反编译的错误代码分析
IDA变量分析错误
2023.9.15
使用IDA进行分析时发现一些奇怪的代码,特别是有一些奇怪的指针强转(例如引用char数组的元素时强转为_DWORD*)时要去注意看IDA中变量的类型有无错误,多余,缺失.
例题1—BUUCTF-不一样的flag
1 | // IDA 分析出 |
注意--*(_DWORD *)&v3[25];
这行代码
实际上存储地图(分析题意得知是一个走迷宫游戏)的只有5x5,也就是0-24的下标.
且v3[25]的地址被强转为int*,也就是说原本的v3[25-28]这4个字节其实是一个单独的变量,实际上就是当前所在行row,
所以v3的类型应该被改成char v3[25];
而不是char v3[29];
注意if ( *(int *)&v3[4 * i + 25] < 0 || *(int *)&v3[4 * i + 25] > 4 )
这行代码
首先把v4(v3修改后新生成的那个v4)重命名成col,
前面把v3[25-28]这4个字节修改成row后变成if ( *(&v4 + i) < 0 || *(&v4 + i) > 4 )
,
更能看出问题—这个循环只有两次,实际上就是判断row和col两个变量是否 <0 或 >4
不过这里是代码分析,并不是变量分析错误的问题
注意if ( v7[5 * *(_DWORD *)&v3[25] - 41 + v4] == 35 )
这行代码
有_BYTE v7[12];这个数组,但我们只用了v8的地址,那么再根据这个函数的局部变量分布和5*5的地图这个信息,即:
1 | int main(...){ |
那么有4x4+25=41个字节的向前偏移,即v3[25]的25个字节,v4,v5,v6,i的16个字节
所以代码可以修改为if ( v7[5 * row + col] == '#' )
,实际上就是把v3当做5*5的二维数组来使用
这样整个代码就非常清晰了
例题2—BUUCTF-[ACTF新生赛2020]easyre
这个题一样,能看出来IDA分析的结果中常常有 int和char或其指针反复互相转换使用的代码
修改前IDA分析出来的结果:
1 | int __cdecl main(int argc, const char **argv, const char **envp) |
经过手动修改的结果:
1 | // 修改后的IDA伪代码 |
解密脚本:
1 |
|