C 在二进制文件中激发密码
我正在用ghidra做一些逆向工程,我有一个二进制文件,它会提示我输入密码,如果我输入正确,我会得到一个标志 为此生成的c代码如下所示:C 在二进制文件中激发密码,c,reverse-engineering,binaryfiles,C,Reverse Engineering,Binaryfiles,我正在用ghidra做一些逆向工程,我有一个二进制文件,它会提示我输入密码,如果我输入正确,我会得到一个标志 为此生成的c代码如下所示: __isoc99_scanf(&DAT_00400a82,local_28); __s2 = (char *)FUN_0040078d(0x14); iVar1 = strcmp(local_28,__s2); if (iVar1 == 0) { FUN_00400978(&local_48); } void *
__isoc99_scanf(&DAT_00400a82,local_28);
__s2 = (char *)FUN_0040078d(0x14);
iVar1 = strcmp(local_28,__s2);
if (iVar1 == 0) {
FUN_00400978(&local_48);
}
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);
}
因此,它从用户处获取一个值,并将其与函数调用的输出进行比较FUN\u 0040078d(0x14)
。现在,我已经看了很多,而且FUN\u 0040078d
是不确定的,使用了很多随机性,所以我知道我无法预测它的输出将是什么。但这是一个长度为14的字符。
如果您想知道,它看起来是这样的:
__isoc99_scanf(&DAT_00400a82,local_28);
__s2 = (char *)FUN_0040078d(0x14);
iVar1 = strcmp(local_28,__s2);
if (iVar1 == 0) {
FUN_00400978(&local_48);
}
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);
}
void*FUN\u 0040078d(int参数1)
{
int iVar1;
时间tVar2;
void*pvVar3;
int local_c;
tVar2=时间((时间*)0x0);
DAT_00601074=DAT_00601074+1;
srand(DAT_00601074+(int)tVar2*参数1);
pvVar3=malloc((长)(参数1+1));
如果(pvVar3!=(void*)0x0){
局部_c=0;
while(局部_c
所以现在我想做的是,我想能够输入条件形式,我在这里展示的第一个代码片段,而不需要预测`
是否有任何工具或技术可以帮助我完成这项工作?反汇编,找到可以跳过调用
FUN\u 00400978(&local\u 48)的条件分支指令
当测试失败时,用nop
s覆盖条件分支,以便不进行跳转?或者,如果您没有修补二进制文件,如果您自己运行相同的算法,仍然可以复制由FUN\u 0040078d
生成的字符串,使用相同的系统rand
功能并使用当前时间进行播种。如果你能及时得到你的输入,让它在下一秒结束前运行它的种子,你应该会得到相同的结果。是的,我还是有点迷路:D例如,我如何跳过wihtnop
,这到底是什么意思?