buuoj-V&N2020公开赛-re

解题过程

  1. 拉到exeinfo中查看信息

  1. 扔到 IDA64 中去,[shift + F12] 查看所有字符串

  2. 跟过去看看其引用函数

  3. 看见上面有一堆putchar(),看看其到底输出了怎样的数据?因为这里其他的东西并没有看出什么用

  4. 从上图发现有两部分数据,一部分是刚刚的输出welcome,另一部分不知道干嘛用的,跟过去看看

  5. 看到了比较有逻辑的函数了,先是调用sub_140011384()来获取result,然后判断result==607052314并且限制dword_140021190<=1459743

  6. 那我们去看看sub_140011384里面到底做了什么

  7. 深入两层我看到了这个函数,从这个函数可以看出来,它对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
  1. 得到这个数后,用这个数来与byte_140021008[]数组中的每个数进行异或得到结果字符串
flag = ''
for i in range(0, len(data)):
    flag += chr((m ^ data[i]) & 0xff)
print(flag)
  1. 发现这个结果串是: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,并不能从中看出其他的东西,那么我们突然看到要输出的数据中,又夹杂了一些无关数据,而且这个数据看起来十分的正常,并不怪异,那我们是否应该去看看这部分数据到底是用来干啥的呢?

posted @ 2021-02-10 19:36  bunner  阅读(80)  评论(0编辑  收藏  举报