攻防世界逆向——key

用ida打开程序,可以看到main函数,调用了一个子函数
在这里插入图片描述
点进去子函数,然后按F5,可以看到有100多行的代码。看到这里无从下手。我们先定位关键的字符串。把代码往下拉可以看到有"Congrats you got it!"的字符串。
在这里插入图片描述从这里往会看,可以看到要进入这里有一个分支语句
在这里插入图片描述
sub_4020C0是一个关键函数,我们来看看函数的每个参数分别是什么。

  1. 点击v44,亮黄的地方可以看到
    在这里插入图片描述
    我们进入这个函数,会发现根本无法下手,我们可以先放弃
  2. v12,v45,v48可以发现没有什么实际的意义
  3. 然后来看一下v13,memory将值赋给了v13,所以v13就相当于memory,所以来看一下memory,有两个地方用到了memory
    在这里插入图片描述现在看一下memory里面存着什么
    在这里插入图片描述
    在这里插入图片描述
    v50里面存的内容
    在这里插入图片描述
    进去看一下sub_4021E0这个函数是做什么的。
    在这里插入图片描述
    如果继续看每个子函数会发现很难分析得清楚,所以我们现在换种思路用动态调试的方法观察这个会发生什么,直接用Ida动态调试。在sub_4021E0前面设置断点。可以发现只是将值赋给v41,这只是一个赋值函数。
    现在我们还有一个问题没有解决v44是什么?
    我们可以打开Strings window看到
    这个路径我们好像从来都没有用到,点击交叉引用看一下。
    他是在sub_402550中被用到,在结合sub_401620的代码可以看到它里面调用了sub_402550,所以v44就是一个从文件夹读出的内容。
    最后看一下sub_4020C0
  v5 = a3;
  if ( this[4] < a3 )
    v5 = this[4];
  if ( this[5] >= 0x10u )
    this = (_DWORD *)*this;
  v6 = a5;
  if ( v5 < a5 )
    v6 = v5;
  if ( v6 )
  {
    v7 = a4;
    v9 = v6 < 4;
    v8 = v6 - 4;
    if ( v9 )
    {
LABEL_11:
      if ( v8 == -4 )
        goto LABEL_20;
    }
    else
    {
      while ( *this == *(_DWORD *)v7 )
      {
        ++this;
        v7 += 4;
        v9 = v8 < 4;
        v8 -= 4;
        if ( v9 )
          goto LABEL_11;
      }
    }
    v9 = *(_BYTE *)this < *(_BYTE *)v7;
    if ( *(_BYTE *)this != *(_BYTE *)v7
      || v8 != -3
      && ((v10 = *((_BYTE *)this + 1), v9 = v10 < *(_BYTE *)(v7 + 1), v10 != *(_BYTE *)(v7 + 1))
       || v8 != -2
       && ((v11 = *((_BYTE *)this + 2), v9 = v11 < *(_BYTE *)(v7 + 2), v11 != *(_BYTE *)(v7 + 2))
        || v8 != -1 && (v12 = *((_BYTE *)this + 3), v9 = v12 < *(_BYTE *)(v7 + 3), v12 != *(_BYTE *)(v7 + 3)))) )
    {
      result = -v9 | 1;
      goto LABEL_21;
    }
LABEL_20:
    result = 0;
LABEL_21:
    if ( result )
      return result;
  }
  if ( v5 >= a5 )
    result = v5 != a5;
  else
    result = -1;
  return result;

可以分析出是判断相不相等的问题。
综上就可以写出脚本得到flag

str1 = "themidathemidathemida"
str2 = ">----++++....<<<<."
 
key =""
flag=""
for i in range(18):
	key += chr((ord(str1[i]) ^ ord(str2[i]))+22)
for i in key:
	flag+=chr(ord(i)+9)
 
 
print(flag)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值