记一次失误
这一题没有什么难点
扫一下
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