buuoj-V&N2020公开赛-re
解题过程
- 拉到exeinfo中查看信息
-
扔到 IDA64 中去,[shift + F12] 查看所有字符串
-
跟过去看看其引用函数
-
看见上面有一堆
putchar()
,看看其到底输出了怎样的数据?因为这里其他的东西并没有看出什么用
-
从上图发现有两部分数据,一部分是刚刚的输出
welcome
,另一部分不知道干嘛用的,跟过去看看
-
看到了比较有逻辑的函数了,先是调用
sub_140011384()
来获取result,然后判断result==607052314
并且限制dword_140021190<=1459743
-
那我们去看看
sub_140011384
里面到底做了什么
-
深入两层我看到了这个函数,从这个函数可以看出来,它对
a1
进行了移位又取异或得到result返回,根据上面的判断,可以写出脚本。通过枚举a1
来确定哪个数满足这个条件
m = 0
for i in range(0, 14549744):
x = (i >> 12) ^ (i << 8)
if (x * 291) % (1 << 32) == 607052314:
print(i)
m = i
break
- 得到这个数后,用这个数来与
byte_140021008[]
数组中的每个数进行异或得到结果字符串
flag = ''
for i in range(0, len(data)):
flag += chr((m ^ data[i]) & 0xff)
print(flag)
- 发现这个结果串是:
flag{MD5(theNum)}
,于是使用md5对得到的数进行哈希
data = [0x26, 0x2C, 0x21, 0x27, 0x3B, 0x0D, 0x4, 0x75, 0x68, 0x34, 0x28, 0x25, 0x0E, 0x35, 0x2D, 0x69, 0x3D]
print(len(data))
m = 0
for i in range(0, 14549744):
x = (i >> 12) ^ (i << 8)
if (x * 291) % (1 << 32) == 607052314:
print(i)
m = i
break
flag = ''
for i in range(0, len(data)):
flag += chr((m ^ data[i]) & 0xff)
print(flag)
import hashlib
print(hashlib.md5('123456'.encode('utf8')).hexdigest())
notice:在用python处理上述问题时,我们需要注意在IDA中,那里面的语句都强制类型转化了,而在python中没有这个限制,并不存在溢出这种东西,所以为了防止溢出,我们需要加一些限制,例如上述的
(x * 291) % (1 << 32)
以及(m ^ data[i]) & 0xff
总结
这道题难就难在第5步,我没有办法直接看出来我们要的东西就在另外一部分数据中。但是当时的情况下,我们已经看出来,之前的函数只是输出了welcome,并不能从中看出其他的东西,那么我们突然看到要输出的数据中,又夹杂了一些无关数据,而且这个数据看起来十分的正常,并不怪异,那我们是否应该去看看这部分数据到底是用来干啥的呢?