我正在玩一些关于 ghidra 逆向工程的挑战。
我分析了一个 bin 文件,其中应该包含一些关于密码的信息。当你运行文件时,你可以给它一些输入,它会检查它是否是正确的密码。这是负责执行此操作的伪 c 代码(评论是我):
__isoc99_scanf(&DAT_00400a82,local_28); // input scanned from user
__s2 = (char *)FUN_0040078d(0x14); // password retrieved from function
iVar1 = strcmp(local_28,__s2); // comparing strings
if (iVar1 == 0) { // if they are equal, do this
FUN_00400978(&local_48);
}
好的,所以我尝试查找该功能FUN_0040078d
:
void * FUN_0040078d(int param_1)
{
int iVar1;
time_t tVar2;
void *pvVar3;
int local_c;
tVar2 = time((time_t *)0x0);
DAT_00601074 = DAT_00601074 + 1;
srand(DAT_00601074 + (int)tVar2 * param_1);
pvVar3 = malloc((long)(param_1 + 1));
if (pvVar3 != (void *)0x0) {
local_c = 0;
while (local_c < param_1) {
iVar1 = rand();
*(char *)((long)local_c + (long)pvVar3) = (char)(iVar1 % 0x5e) + '!';
local_c = local_c + 1;
}
*(undefined *)((long)pvVar3 + (long)param_1) = 0;
return pvVar3;
}
/* WARNING: Subroutine does not return */
exit(1);
}
所以这里有很多信息。但总的来说,我认为通过执行操作构造了一个字符数组:
(char)(iVar1 % 0x5e) + '!';
我不知道这是什么意思(对字符取模有什么作用?并且确实+ '!'
)只是意味着连接一个“!”。
总的来说,我在阅读这篇文章时遇到了一些问题,我想知道是否有可能预测这个函数会为特定输入输出什么。在这种情况下,函数14
作为输入给出。
或许使用了rand()
无法解构的手段?
谁能猜猜/告诉我这个函数可能会为输入 14 输出什么?