CTFre-V&NCTF2020-strangeCpp

https://buuoj.cn/challenges#[V&N2020%20%E5%85%AC%E5%BC%80%E8%B5%9B]strangeCpp

 

先使用一下exe,发现是貌似检测系统环境变量的程序

CTFre-V&NCTF2020-strangeCpp_第1张图片

然后放入ida,定位一下他这个程序的主函数

CTFre-V&NCTF2020-strangeCpp_第2张图片

CTFre-V&NCTF2020-strangeCpp_第3张图片

可以看到引用了很多字符串,看一下他引用的字符串的位置:

CTFre-V&NCTF2020-strangeCpp_第4张图片

然后有一个细节值得我们注意,那就是byte_140021008这段字符串被跳过去了,被一个很可疑的函数sub_140013580引用,我们跟踪进去看一下

CTFre-V&NCTF2020-strangeCpp_第5张图片

其实根据第一个截图,就是主函数的截图,我们知道dword_140021190变量是一个与CPU数目有关的东西,但是其实不重要,重要的是,我们要让putchar这个实现,就是要让if这个判断能进入,也就是找到一个合适的dword_140021190变量的值,然后通过sub_140011384那个函数,让result=607052314

sub_140011384函数:

CTFre-V&NCTF2020-strangeCpp_第6张图片

通过以上条件,写注册机:

byte_140021008 = [0x26, 0x2C, 0x21, 0x27, 0x3B, 0x0D, 4, 0x75, 0x68, 0x34, 0x28,0x25, 0x0E, 0x35, 0x2D, 0x69, 0x3D]
result=0
result_end=0

for dword_140021190 in range(14549743):
    result=(((dword_140021190<<8)^(dword_140021190>>12))*291)&0xFFFFFFFF
    if(result==607052314):
        result_end=dword_140021190
        break
print("theNum:%d"%dword_140021190)
flag=""
for i in range(0,len(byte_140021008)):
    flag=flag+chr((result_end^byte_140021008[i])&0xFF)
print(flag)

然后得到输出:

theNum:123456

flag{MD5(theNum)}

当dword_140021190=123456的时候,if条件能进入,得到flag是MD5(theNum)

顾名思义,我们要让123456进行MD5编码,然后得到最后的flag:

flag{e10adc3949ba59abbe56e057f20f883e}

 

你可能感兴趣的:(逆向,CTF,加密与解密)