攻防世界——reverse_re3

本文介绍了如何使用IDA64分析一个64位程序,通过观察函数`__int64sub_940`中的逻辑,发现涉及迷宫和ASCII字符判断。程序要求用户输入解密一个字符串,最终通过MD5加密来验证输入。

查壳——64bit

用IDA64打开

F12查看字符串

首先就发现了这个flag

跟进

__int64 sub_940()
{
  int v0; // eax
  int v2; // [rsp+8h] [rbp-218h]
  int v3; // [rsp+Ch] [rbp-214h]
  char v4[520]; // [rsp+10h] [rbp-210h] BYREF
  unsigned __int64 v5; // [rsp+218h] [rbp-8h]

  v5 = __readfsqword(0x28u);
  v3 = 0;
  memset(v4, 0, 0x200uLL);
  _isoc99_scanf(&unk_1278, v4, v4);
  while ( 1 )
  {
    do
    {
      v2 = 0;
      sub_86C();
      v0 = v4[v3];
      if ( v0 == 100 )
      {
        v2 = sub_E23();
      }
      else if ( v0 > 100 )
      {
        if ( v0 == 115 )
        {
          v2 = sub_C5A();
        }
        else if ( v0 == 119 )
        {
          v2 = sub_A92();
        }
      }
      else
      {
        if ( v0 == 27 )
          return 0xFFFFFFFFLL;
        if ( v0 == 97 )
          v2 = sub_FEC();
      }
      ++v3;
    }
    while ( v2 != 1 );
    if ( dword_202AB0 == 2 )
      break;
    ++dword_202AB0;
  }
  puts("success! the flag is flag{md5(your input)}");
  return 1LL;
}

按R转换为字符

判断 wasd,四个数字

从头开始看吧:

跟进这个sub

很懵逼

但是看的出来这个dword是个数组

看看他

好家伙,更懵逼了,但是有赋值

看到这个10101,加上前面的wasd——想到了迷宫的可能性

那就先按迷宫的思路做吧,逆向这东西本来就要试

注意啊:!!dword 是双字(字=2字节)

那么4个才是一个数据

然后你就代码列出迷宫(具体多少你就直接数学推算)

s=[ 1,
  1,
  1,
  1,
  1,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  1,
  1,
  1,
  1,
  1,
  0,
  3,
  1,
  1,
  0,
  0,
  0,
  0,
  0,
  0,
  1,
  1,
  1,
  1,
  1,
  0,
  0,
  0,
  1,
  0,
  0,
  0,
  0,
  0,
  0,
  1,
  1,
  1,
  1,
  1,
  0,
  0,
  0,
  1,
  0,
  0,
  0,
  0,
  0,
  0,
  1,
  1,
  1,
  1,
  1,
  0,
  0,
  0,
  1,
  1,
  1,
  1,
  1,
  0,
  0,
  1,
  1,
  1,
  1,
  1,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  1,
  0,
  0,
  1,
  1,
  1,
  1,
  1,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  1,
  0,
  0,
  1,
  1,
  1,
  1,
  1,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  1,
  1,
  0,
  1,
  1,
  1,
  1,
  1,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  1,
  0,
  1,
  1,
  1,
  1,
  1,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  4,
  0,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  1,
  1,
  0,
  3,
  1,
  1,
  1,
  1,
  1,
  0,
  0,
  0,
  0,
  0,
  0,
  1,
  1,
  0,
  1,
  1,
  0,
  0,
  0,
  1,
  0,
  0,
  0,
  0,
  0,
  0,
  1,
  1,
  0,
  0,
  0,
  0,
  0,
  0,
  1,
  0,
  0,
  0,
  0,
  0,
  0,
  1,
  1,
  0,
  1,
  1,
  0,
  0,
  0,
  1,
  1,
  1,
  1,
  1,
  0,
  0,
  1,
  1,
  0,
  1,
  1,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  1,
  0,
  0,
  1,
  1,
  0,
  1,
  1,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  1,
  0,
  0,
  1,
  1,
  0,
  1,
  1,
  0,
  0,
  0,
  0,
  0,
  1,
  1,
  1,
  1,
  0,
  1,
  1,
  0,
  1,
  1,
  0,
  0,
  0,
  0,
  0,
  1,
  0,
  0,
  1,
  0,
  1,
  1,
  0,
  1,
  1,
  0,
  0,
  0,
  0,
  0,
  1,
  0,
  0,
  0,
  0,
  1,
  1,
  0,
  1,
  1,
  1,
  1,
  1,
  1,
  0,
  1,
  0,
  1,
  1,
  0,
  1,
  1,
  0,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  0,
  1,
  1,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  4,
  0,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  1,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  3,
  1,
  1,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  1,
  0,
  1,
  1,
  1,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  1,
  1,
  1,
  0,
  1,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  1,
  0,
  0,
  1,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  1,
  1,
  0,
  1,
  0,
  0,
  1,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  1,
  1,
  1,
  0,
  0,
  1,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  1,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  1,
  1,
  1,
  1,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  1,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  1,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  1,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  1,
  1,
  1,
  1,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  1,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  4,
  0]
x=0
y=0
for i in range(0,len(s)):
    print(s[i],end=' ')
    x+=1
    if(x==15):
        x=0
        print()
        y+=1
    if(y==15):
        y=0
        print("________________________")

跑出来过,你就直接写脚本(反正我是人工操作哈哈)

得到字符串

然后MD5加密就行


import hashlib
def md5_encrypt(input_string):
    md5 = hashlib.md5()
    md5.update(input_string.encode('utf-8'))
    return md5.hexdigest()

string='ddsssddddsssdssdddddsssddddsssaassssdddsddssddwddssssssdddssssdddss'
print(md5_encrypt(string))

这两个代码片段的主要差异在于 `if` 条件的判断逻辑部分,具体如下: ### 第一个 `if` 语句: ```c if ((reverse_bytes_long(version_254) < reverse_bytes_long(pfwhead->Version_prv)) || ((version_prv == pfwhead->Version_prv) && ((reverse_bytes_long(version_254) < reverse_bytes_long(pfwhead->Version_254)) || (version_306 < pfwhead->Version_306))) || (reverse_bytes_long(version_254) == BRIDGE_VER)) ``` **判断逻辑说明:** 1. `reverse_bytes_long(version_254) < reverse_bytes_long(pfwhead->Version_prv)` 判断 `version_254` 是否小于 `pfwhead->Version_prv`(反转后的比较)。 2. 如果 `version_prv == pfwhead->Version_prv`,则进一步判断: - `reverse_bytes_long(version_254) < reverse_bytes_long(pfwhead->Version_254)` 或者 - `version_306 < pfwhead->Version_306` 3. 最后判断 `reverse_bytes_long(version_254) == BRIDGE_VER` ### 第二个 `if` 语句: ```c if ((reverse_bytes_long(version_prv) < reverse_bytes_long(pfwhead->Version_prv)) || ((version_prv == pfwhead->Version_prv) && ((reverse_bytes_long(version_254) < reverse_bytes_long(pfwhead->Version_254)) || (version_306 < pfwhead->Version_306))) || (reverse_bytes_long(version_254) == BRIDGE_VER)) ``` **判断逻辑说明:** 1. `reverse_bytes_long(version_prv) < reverse_bytes_long(pfwhead->Version_prv)` 判断 `version_prv` 是否小于 `pfwhead->Version_prv`(反转后的比较)。 2. 如果 `version_prv == pfwhead->Version_prv`,则进一步判断: - `reverse_bytes_long(version_254) < reverse_bytes_long(pfwhead->Version_254)` 或者 - `version_306 < pfwhead->Version_306` 3. 最后判断 `reverse_bytes_long(version_254) == BRIDGE_VER` ### 差异总结: 1. **第一个条件不同:** - 第一个 `if` 判断的是 `reverse_bytes_long(version_254)` 是否小于 `reverse_bytes_long(pfwhead->Version_prv)`。 - 第二个 `if` 判断的是 `reverse_bytes_long(version_prv)` 是否小于 `reverse_bytes_long(pfwhead->Version_prv)`。 2. **其余条件相同:** - 两个 `if` 的第二部分和第三部分逻辑完全一致。 ### 结论: 两个 `if` 语句的判断逻辑在第一个条件上有显著差异,这会导致在某些情况下触发条件的结果不同。第一个 `if` 更关注 `version_254` 和 `Version_prv` 的关系,而第二个 `if` 更关注 `version_prv` 和 `Version_prv` 的关系。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

name_name123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值