如何解决C 中的复杂变量赋值反编译 ELF
所以我必须获得“隐藏”在这里的密码
void __regparm3 entry(undefined4 param_1,void *param_2,size_t param_3,void *param_4,size_t param_5)
{
char cVar1;
int iVar2;
size_t __n;
void *__buf;
int unaff_retaddr;
_write((int)prompt,param_2,param_3);
_read(unaff_retaddr,param_4,param_5);
iVar2 = 0;
do {
cVar1 = (**(code **)(&vfunc + (uint)(byte)(&vmp)[iVar2] * 4))(); //cant understand this
if (cVar1 != (&vmr)[__n]) {
_write((int)fail,__buf,__n);
/* WARNING: Subroutine does not return */
_exit(unaff_retaddr);
}
iVar2 = __n + 1;
} while (iVar2 != 0x17);
_write((int)success,0x17);
/* WARNING: Subroutine does not return */
_exit(unaff_retaddr);
}
我发现 vmr 包含 0x17 个值,而 vmp 只有一个:03。
问题:
cVar1 是如何创建的,特别是这个 (**(code **)(&vfunc + (uint)(byte)(&vmp)[iVar2] * 4))()
是什么意思?此行是将 vmp 值转换为某个数字还是其他什么?
解决方法
这是对索引函数指针引用的函数的调用,返回一些内容然后存储到char
变量中,但是:
- 它似乎是故意混淆的;
- 此表达式中隐含的一些变量明显是在我们在这里看到的代码示例之外声明的。
但无论如何,这里的表达是:
-
vfunc
可能是一个 32 位整数数组,就像指向不同回调函数的指针一样,没有明确声明为指针(可能是因为某些长度和格式目的); -
vmp
可能是一个数组,包含每个特定情况下要调用的函数的编号; -
&vmp
返回这个数组的地址(如果这真的是一个数组,这是没有用的,如果它是一个union
或其他东西,则可能是必要的); -
&vmp[iVar]
获取由iVar
索引的条目的值; -
(uint)(byte)
然后先将此值转换为一个字节(可能是为了修剪不必要的位),然后转换为一个整数。请注意,转换运算符优先级(…)
出现在索引[…]
之后; - 由于是 32 位指针,因此该索引乘以
* 4
,这往往意味着vfunc
不指向本机声明的指针,否则将应用指针算法; - 如此获得的指针被强制转换为
(code **)
,这是一个“指向某个代码的指针的指针”。code
这里可能是用typedef
声明的函数指针的别名; - 该指针被取消引用两次以访问函数本身:
(** …)
- 通过附加最后的括号
…()
调用此函数(不带参数); - 这个函数的这个结果被赋值给 cVar1 :
cVar1 = …
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。