32位无壳
堆栈有问题
先修堆栈在反编译
查看关键函数
对输入的字符串进行了加密
加密之后omg函数中与存储的字符串进行比较
我们先解密这个
提取数据
解密脚本
data=[0x66,0x6b,0x63,0x64,0x7f,0x61,0x67,0x64,0x3b,0x56,0x6b,0x61,0x7b,0x26,0x3b,0x50,0x63,0x5f,0x4d,0x5a,0x71,0x0c,0x37,0x66]
flag=""
for i in range(len(data)):
if(i&1):
flag+=chr(data[i]+i)
else:
flag+=chr(data[i]^i)
print(flag)
flag{fak3_alw35_sp_me!!}
是假flag
这个循环是一个代码自修改(SMC)
就是执行了这一段循环,才能还原出encrypt代码数据
首先encrypt存在堆栈问题
实用OD,断点打在这里
输入刚才的假flag就能成功运行到这里
函数已经解密完成
然后dump文件
重新用IDA打开dump后的文件
重新用IDA加载dump后的文件,进入到了encrypt函数
解密,这个函数只与flag的前19位进行了加密,解密得到flag的前半段
data=[0x0e,0x0d,0x09,0x06,0x13,0x05,0x58,0x56,0x3e,0x06,0x0c,0x3c,0x1f,0x57,0x14,0x6b,0x57,0x59,0x0d]
str="hahahaha_do_you_find_me?"
flag=""
for i in range(len(data)):
flag+=chr(data[i]^ord(str[i]))
print(flag)
flag{d07abccf8a410c
观察最后的finally函数查看最后的部分
我们猜测最后的密文':',是'}'与某个值异或的结果
其他四位也是与这个数异或的得到的
a=ord(':')^ord('}')
str="%tp&:"
flag2=""
flag1="flag{d07abccf8a410c"
for i in range(len(str)):
flag2+=chr(ord(str[i])^a)
print(flag1+flag2)
flag{d07abccf8a410cb37a}