buu_[FlareOn4]IgniteMe

记一次失误

这一题没有什么难点

扫一下

IDA打开

需要注意的函数有三个

第一个是sub_4010f0()

输入到Buffer让后传给数组byte_403078

第二个函数sub_401050()

int sub_401050()
{
  int v1; // [esp+0h] [ebp-Ch]
  int i; // [esp+4h] [ebp-8h]
  unsigned int j; // [esp+4h] [ebp-8h]
  char v4; // [esp+Bh] [ebp-1h]

  v1 = sub_401020(byte_403078);    //数组长度
  v4 = sub_401000();       
  for ( i = v1 - 1; i >= 0; --i )
  {
    byte_403180[i] = v4 ^ byte_403078[i];
    v4 = byte_403078[i];
  }
  for ( j = 0; j < 0x27; ++j )//比对最终结果
  {
    if ( byte_403180[j] != (unsigned __int8)byte_403000[j] )
      return 0;
  }
  return 1;
}

那么就差函数sub_401000()

进入看看

鼠标放到这里可以看到这是int型,四个字节32位

_ROL4_通常是一个自定义的循环左移函数(假设它是按位循环左移操作)。将整数-2147024896转换为二进制(假设是 32 位整数),-2147024896的二进制表示为10000000000000000000000000000000。

循环左移 4 位后,得到的二进制数为00000000000000000000000000010000,转换为十进制后结果为16

再次左移1位,结果为4

上面这些是问ai的

其实还有一种方法,就是动态调试

之后就是我寄掉的地方

数组从后往前,运算结果存入byte_403180(同样从后往前存),对咱们的输入进行前一个字节异或h后一个字节(首次异或 4)

输入: a b c d e

结果:  a^b b^c c^d d^e e^4 因为这里数组byte_403078没有发生变动

我想当然的以为是:

a^b^c^d^e^4         b^c^d^e^4         c^d^e^4         d^e^4         e^4 以为数组变动了,写的很多题目都是这样

所以将脚本写成了

data = [
   13,  38,  73,  69,  42,  23, 120,  68,  43, 108,
   93,  94,  69,  18,  47,  23,  43,  68, 111, 110,
   86,   9,  95,  69,  71, 115,  38,  10,  13,  19,
   23,  72,  66,   1,  64,  77,  12,   2, 105,   4]
print(len(data))
flag = []
for i in range(len(data)-1):
    v4 = data[i+1]
    flag.append(data[i] ^ v4)
print(flag)

正确的应该是

data = [
   13,  38,  73,  69,  42,  23, 120,  68,  43, 108,
   93,  94,  69,  18,  47,  23,  43,  68, 111, 110,
   86,   9,  95,  69,  71, 115,  38,  10,  13,  19,
   23,  72,  66,   1,  64,  77,  12,   2, 105]
flag = ""
v4 = 4
for i in range(len(data)-1, -1, -1):
    data[i] = data[i] ^ v4
    v4 = data[i]
for i in range(len(data)):
    flag += chr(data[i])
print(flag)

结果需要从后往前计算,以为从前往后算需要与正确输入进行异或,而这是我们还不知到输入的是什么,所以需要从后往前一项一项的还原

结果:

Ry0uH0t3n0ugHt0_1gn1t3@flare-on.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值