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 *

我正在用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 * 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例如,我如何跳过wiht
nop
,这到底是什么意思?