-
-
[原创]网鼎杯2020 joker 烦人精题
-
发表于:
2020-5-10 21:28
5941
-
gcc编译,无壳:
看一下程序结构:
程序有函数分析错误,堆栈的原因,我就没改它了,因为汇编也简单,上手就撸:
第一个关键块:
4017DD就是一个字符串拷贝函数,动态可见,然后4017EB是第一个无用函数,看一下:
a1就是输入的flag,简单操作之后到4017F9函数判断:
byte_4030C0是硬编码字符,大概逆一下得到虚假flag:
byte_4030c0=[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(23):
if i &1:
byte_4030c0[i]+=i
else:
byte_4030c0[i]^=i
for i in range(23):
flag+=chr(byte_4030c0[i])
print(flag)
flag{fak3_alw35_sp_me!!
肯定是不对的,然后下面这块吸引我的注意:
有smc操作,而且代码中确实有很多没有解释的byte,解密函数很简单,写idc也行,我直接动态调试:
虚假函数nop掉:
这就是刚刚的fake函数,nop掉就行:
下面就是自解密函数:
解密位置是401500,断在182D,然后过掉看结果:
之后就是调用这块代码了:
跟进去,单步可以看得到懂逻辑的:
大概意思就是输入的位数,和hahahaha_do_you_find_me?这个字符串异或之后,等于3040位置的硬编码值
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)