攻防世界76号

本文详细分析了一个ELF文件中的密码验证过程,通过IDA查看反汇编代码,揭示了输入密码的校验规则。密码由一系列特定字符组成,每个字符对应不同的状态转换。最终得出正确密码为'09vdf7wefijbk',并以此解密了文件。这展示了逆向工程在软件安全和破解中的应用。
摘要由CSDN通过智能技术生成

elf文件,打开提示需要输入正确password
在这里插入图片描述
IDA查看字符串
在这里插入图片描述
查看Correct附近的反汇编代码
在这里插入图片描述
将输入字符串的地址和0x0作为sub_8048580的两个参数,调用sub_8048580后返回值为1则跳转到Correct

查看sub_8048580反编译代码

_BOOL4 __cdecl sub_8048580(int a1, int a2)
{
  char v3; // al
  _BOOL4 result; // eax
  char v5[128]; // [esp+Ch] [ebp-A0h] BYREF
  unsigned int v6; // [esp+8Ch] [ebp-20h]

  v6 = __readgsdword(0x14u);
  while ( 1 )
  {
    memset(v5, 0, sizeof(v5));
    v3 = *(_BYTE *)(a1 + a2);  // v3随a2改变
    v5[(v3 + 64) % 128] = 1;
    switch ( v3 )
    {
      case '\n':
        return a2 == 13 && v5[74] != 0;
      case '0':
        if ( a2 || !v5[112] )
          return 0;
        a2 = 1;
        continue;
      case '1':
        if ( a2 == 14 && v5[113] )
          goto LABEL_12;
        return 0;
      case '2':
        if ( a2 == 20 && v5[114] )
          goto LABEL_15;
        return 0;
      case '3':
        if ( a2 != 89 || !v5[115] )
          return 0;
        a2 = 90;
        continue;
      case '4':
        if ( a2 != 15 || !v5[116] )
          return 0;
        a2 = 16;
        continue;
      case '5':
        if ( a2 != 14 || !v5[117] )
          return 0;
LABEL_12:
        a2 = 15;
        continue;
      case '6':
        if ( a2 != 12 || !v5[118] )
          return 0;
        a2 = 13;
        continue;
      case '7':
        if ( a2 != 5 || !v5[119] )
          return 0;
        a2 = 6;
        continue;
      case '8':
        result = 0;
        if ( v5[121] )
          result = a2 == 33 || a2 == 2;
        return result;
      case '9':
        if ( a2 != 1 || !v5[121] )
          return 0;
        a2 = 2;
        continue;
      case 'a':
        if ( a2 != 35 || !v5[33] )
          return 0;
        a2 = 36;
        continue;
      case 'b':
        if ( a2 != 11 || !v5[34] )
          return 0;
        a2 = 12;
        continue;
      case 'c':
        if ( a2 != 32 || !v5[33] )
          return 0;
        a2 = 33;
        continue;
      case 'd':
        if ( a2 != 3 || !v5[36] )
          return 0;
        a2 = 4;
        continue;
      case 'e':
        if ( a2 != 7 || !v5[37] )
          return 0;
        a2 = 8;
        continue;
      case 'f':
        if ( !v5[38] || a2 != 8 && a2 != 4 )
          return 0;
        goto LABEL_53;
      case 'g':
        return a2 == 12 && v5[52] != 0;
      case 'h':
        if ( a2 != 13 || !v5[39] )
          return 0;
        a2 = 14;
        continue;
      case 'i':
        if ( a2 != 9 || !v5[41] )
          return 0;
        a2 = 10;
        continue;
      case 'j':
        if ( a2 != 10 || !v5[42] )
          return 0;
        a2 = 11;
        continue;
      case 'k':
        return a2 == 12 && v5[43] != 0;
      case 'l':
        if ( a2 != 19 || !v5[44] )
          return 0;
        a2 = 20;
        continue;
      case 'm':
        if ( a2 != 17 || !v5[45] )
          return 0;
        a2 = 18;
        continue;
      case 'n':
        return a2 == 18 && v5[45] != 0;
      case 'o':
        if ( !v5[46] || a2 != 6 && a2 != 28 )
          return 0;
LABEL_53:
        ++a2;
        continue;
      case 'p':
        if ( a2 != 30 || !v5[48] )
          return 0;
        a2 = 31;
        break;
      case 'q':
        if ( a2 != 29 || !v5[49] )
          return 0;
        a2 = 30;
        break;
      case 'r':
        if ( a2 != 20 || !v5[50] )
          return 0;
LABEL_15:
        a2 = 21;
        break;
      case 's':
        if ( a2 != 25 || !v5[51] )
          return 0;
        a2 = 26;
        break;
      case 't':
        return a2 == 24 && v5[50] != 0;
      case 'u':
        if ( a2 != 26 || !v5[53] )
          return 0;
        a2 = 27;
        break;
      case 'v':
        if ( a2 != 2 || !v5[54] )
          return 0;
        a2 = 3;
        break;
      case 'w':
        if ( a2 != 6 || !v5[55] )
          return 0;
        a2 = 7;
        break;
      case 'x':
        if ( a2 != 22 || !v5[56] )
          return 0;
        a2 = 23;
        break;
      case 'y':
        if ( a2 != 23 || !v5[57] )
          return 0;
        a2 = 24;
        break;
      case 'z':
        return a2 == 21 && v5[33] != 0;
      default:
        return 0;
    }
  }
}

输入的第一个字符为不0时,返回值为0
接着推下去可以得出正确的password为09vdf7wefijbk

在这里插入图片描述
flag{09vdf7wefijbk}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值