解密循环

逆向工程 二元分析 反编译
2021-06-21 09:27:28

我正在反转 CTF 二进制文件,我发现了一个由 IDA 反编译的解密循环,如下所示:

for ( i = 0; i < n; ++i )
  {
    v22 = *((_BYTE *)sub_5657D89B + i);
    v0 = v22 ^ 0x90;
    v1 = strlen(&s);
    *((_BYTE *)src + i) = *(&s + i % v1) ^ v0;
  }

该变量&s指向具有这些其他字节的堆栈:

  s = 0xF9u;
  v4 = 0xFCu;
  v5 = 0xFFu;
  v6 = 0xE6u;
  v7 = 0xF5u;
  v8 = 0xE0u;
  v9 = 0xF1u;
  v10 = 0xF3u;
  v11 = 0xFBu;
  v12 = 0xF9u;
  v13 = 0xFEu;
  v14 = 0xF7u;
  v15 = 0xFDu;
  v16 = 0xE9u;
  v17 = 0xF3u;
  v18 = 0xFFu;
  v19 = 0xF4u;
  v20 = 0xF5u;
  v21 = 0;

我真的不从这里获得除法的V1目的:*(&s + i % v1)变量 n 等于 0x140。

1个回答

基本上,它只是将索引包装在字符串的长度处。

在 C 中,它看起来像这样:

src[i] = s[i % strlen(s)] ^ v0;

例如,如果s是“ABCD”,strlen(s)则是 4。当i等于:

  • 4、 4 % 4 == 0
  • 5、 5 % 4 == 1
  • 等等。