新手ctf逆向-----[V&N2020 公开赛]strangeCpp WP
#前言
第一篇文章纪念一下,学习逆向已有大半年了,但因疫情影响,本身能力还是很垃圾,写写博客,一是为了在刷题之余放松一下,二是前人栽树后人乘凉,自己看了不少的WP,也为后来者留下一些糟粕仅供参考,这是今天做的一道题,确实如名字所示中间有点奇怪。
找函数
找了一手函数列表没有main函数所以没办法shift+f12查一下关键词
仿佛直接看见了flag,实际并不是,空欢喜一场,但点进去貌似是主函数
但其实仔细看下来并没有flag函数,只是个戏弄你的函数,但是在点开27到33行这几行的数据段的时候,发现在下面有一串奇怪的字符,嗯,肯定有东西,往上找调用它的函数
分析分析
就这个函数,看到putchar函数里面有刚刚看见的字符串,嗯,有flag那味儿了。。。。。。
从尾开始搞起,打印的肯定是flag了,就是dword_140021190这一段和刚刚找到的字符串逐个异或,然后就是找dword_140021190这一段是啥了
继续往上看,sub_140011384这个函数对它肯定做了什么事情,点进去瞅瞅
逻辑也很清楚,有dword_140021190最开始的值进行了位移、乘法得到了dword_140021190最终的这个值,但是我们并不知道最开始的值是啥,回到最开始的函数找线索,
第21行有对dword_140021190进行限制,那我们就可以写脚本了,在那个范围内一点一点试就完了
写脚本
for v8 in range(14549743):
v7= (((v8 << 8) ^ (v8 >> 12))*291)&0xFFFFFFFF
if (v7 == 607052314):
print (v8)
break
enc = [0x26, 0x2C, 0x21, 0x27, 0x3B, 0x0D, 4, 0x75, 0x68, 0x34, 0x28,
0x25, 0x0E, 0x35, 0x2D, 0x69, 0x3D]
flag=""
for i in enc:
flag +=chr((v8^i)&0xFF)
print(flag)
v8=123456,被我写的垃圾代码打印的东西盖住了
代码还是非常简单的,但是那个3行的0xFFFFFFFF,11行的0xFF是我写这道题学到的东西。刚开始我并没有写这俩与运算,但是确实,没有这俩与运算,根本跑不出来。我百思不得其解,最后没办法了,问吧!
学长说是因为v8和flag溢出了,必须对变量进行限制,0xFFFFFFF是最大32个字节,0xFF是最大8个字节,学到了学到了,以后写脚本得注意注意。。。。。。
出FLAG!!!!
把123456在线md5解密一下就出来了
flag{e10adc3949ba59abbe56e057f20f883e}``