hackme 攻防世界RE

本文解析了一种基于随机数的密码验证算法,通过逆向工程揭示了其工作原理。作者通过观察和猜测,发现了一个看似神秘的随机数生成函数,并成功地反向设计了一套验证过程。该文详细介绍了如何利用特定的数学运算和字符映射来验证输入的22个字符密码,只需选取10个随机位置进行检查。最后,提供了一段C++代码示例,演示了如何通过逆向工程生成正确的密码。
__int64 __fastcall sub_400F8E(__int64 a1, char a2)
{
  __int64 v2; // r8@1
  __int64 v3; // rdx@1
  __int64 v4; // rcx@1
  __int64 v5; // r8@1
  __int64 v6; // r9@1
  signed int v7; // eax@5
  char buffer[136]; // [sp+10h] [bp-B0h]@3
  int v10; // [sp+98h] [bp-28h]@12
  char v11; // [sp+9Fh] [bp-21h]@8
  int v12; // [sp+A0h] [bp-20h]@5
  unsigned __int8 v13; // [sp+A6h] [bp-1Ah]@5
  char v14; // [sp+A7h] [bp-19h]@5
  int v15; // [sp+A8h] [bp-18h]@5
  int v16; // [sp+ACh] [bp-14h]@5
  int v17; // [sp+B0h] [bp-10h]@5
  int v18; // [sp+B4h] [bp-Ch]@4
  int v19; // [sp+B8h] [bp-8h]@4
  int i; // [sp+BCh] [bp-4h]@1

  output((unsigned __int64)"Give me the password: ");
  sub_4075A0((__int64)"%s", v2, a2);
  for ( i = 0; buffer[i]; ++i )                 // strlen
    ;
  v19 = i == 22;
  v18 = 10;
  do
  {
    v7 = rand((__int64)"%s", (__int64)buffer, v3, v4, v5, v6);
    v4 = (unsigned int)(v7 % 22);
    v15 = v7 % 22;
    v17 = 0;
    v14 = byte_6B4270[(signed __int64)(v7 % 22)];
    v13 = buffer[v7 % 22];
    v12 = v7 % 22 + 1;
    v16 = 0;
    while ( v16 < v12 )
    {
      ++v16;
      v17 = 0x6D01788D * v17 + 12345;
    }
    v3 = (unsigned int)v17;
    v11 = v17 ^ v13;
    if ( v14 != ((unsigned __int8)v17 ^ v13) )
      v19 = 0;
    --v18;
  }
  while ( v18 );
  if ( v19 )
    v10 = output((unsigned __int64)"Congras\n");
  else
    v10 = output((unsigned __int64)"Oh no!\n");
  return 0LL;
}

这道题出的很玄幻,我一直都不知道那个是个随机数生成的函数,我只是运行它发现每次都是不一样的数字,就猜测是否是随机数,没想到是的。
具体逻辑就是:输入22个字符,取10个随机数作为序号取字符进行验证即可,只要将验证反过来写就可以了

#include<cstdio>
#include<cstring>
using namespace std;
unsigned char chars[] =
{
  0x5F, 0xF2, 0x5E, 0x8B, 0x4E, 0x0E, 0xA3, 0xAA, 0xC7, 0x93, 
  0x81, 0x3D, 0x5F, 0x74, 0xA3, 0x09, 0x91, 0x2B, 0x49, 0x28, 
  0x93, 0x67, 0x00
};
int main()
{
	for(int i=0;i<22;i++)
	{
		int t=0;
		for(int j=0;j<i+1;j++)
			t=t*0x6D01788D+12345;
		chars[i]^=t;
	} 
	printf("%s\n",chars);
    return 0;
}

个人感觉逆向还是要多猜测。。。

### 关于攻防世界中的加密技术及其应用 #### 加密与解密的基础概念 加密是一种通过特定算法将原始数据转换为不可读形式的技术,目的是保护数据的安全性和隐私性。在网络安全领域,加密技术被广泛应用于防止敏感信息泄露、篡改和窃听。常见的加密方法包括对称加密(如AES)、非对称加密(如RSA)以及流加密(如RC4)。这些技术不仅用于静态数据的存储安全,还适用于动态通信过程中的数据传输安全保障[^1]。 #### 开源工具的应用实例 在网络攻防实践中,开源工具扮演着重要角色。例如,`Bash Crypt` 是一种基于命令行的简单加密工具,它能够实现基本的数据加密功能;而 `EAS Phish` 则专注于钓鱼攻击场景下的密码学运用。通过对这些工具的学习和实践,可以深入理解加密机制的实际操作流程及其潜在漏洞[^2]。 #### 动态解密技术探讨 针对某些复杂的恶意软件或者高级持续威胁 (APT),它们可能采用自定义或嵌套式的加解密逻辑来隐藏行为特征。在这种情况下,研究如何逆向分析并修改其内部处理函数变得尤为重要。正如提到的一种技巧——将原本负责加密的部分代码替换为对应的反向运算即解密操作,则可有效还原受保护的内容结构[^3]。 #### 蜜罐技术的成本考量 从更宏观的战略层面来看,在构建防御体系时引入蜜罐作为诱饵节点之一,不仅可以迷惑入侵者延长其探索周期,更重要的是收集到更多有关对方战术情报以便后续改进措施制定。这种做法体现了现代信息安全防护理念中对于资源消耗平衡的关注点所在[^4]。 ```python import base64 def simple_encrypt(data, key='secret'): """ 使用Base64编码模拟简易加密 """ encoded_data = data.encode('utf-8') encrypted = base64.b64encode(encoded_data).decode() return f"{key}:{encrypted}" def simple_decrypt(encrypted_text, key='secret'): """ 对应上述方法进行解码恢复原字符串 """ _, cipher_part = encrypted_text.split(':') # 假设格式固定 decrypted_bytes = base64.b64decode(cipher_part) return decrypted_bytes.decode() example_message = "This is a secret message." print("Original Message:", example_message) ciphered_result = simple_encrypt(example_message) print("Encrypted Result:", ciphered_result) deciphered_output = simple_decrypt(ciphered_result) print("Decrypted Output:", deciphered_output) ``` 以上示例展示了基础层次上的字符串加密/解密过程,尽管实际应用场景下通常需要更加复杂且经过验证强度更高的方案支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值