[BJDCTF2020]easy
-
例行检查,无壳,32位程序
-
32位ida载入,main函数和字符串理都没有找到有关flag的提示
-
根据main函数的提示,有关flag的函数应该被藏起来了,在左边的函数列表里一个一个查看,看到quess的函数长得有的像
给了10个数据,每两个数据进行一次变换,变换后长度为50,之后应该是对处理好后的数据进行按位判断,是1输出‘*’,否则输出‘ 空格 ’,估计对处理后的数据转换成了2进制 -
32行到46行的处理数据里有些函数看不大懂,百度后发现是宏定义
-
所以我们这边对数据的操作是每两个数据为一组,分别取出他们的高字节(前16位)和低字节(后16位)去组成一个新的数,高低位分别为32字节,新的数的高字节是每组的第二个数的高字节+低字节,新数的低字节是每组第一个数的高字节+低字节,注意最后生成的数据的长度是50
拿一组数据说明一下
所以得到的新数的二进制是10001001001111110001111111111110100111111000110001
依次类推可以算出其他4组数据的结果,最后得到的5组数据是
10001001001111110001111111111110100111111000110001
10001010101000010010001000010010100100001000111001
11111111111000011100001000010011111111001000110101
10001100011000010110001000010000100100001000110011
10001100011111110001111110010000100100001111110001
- 最后按位比较一下,是1输入‘*’,否则输出空格,每输出5个字符输出一个空格
exp
a='1000100100111111000111111111111010011111100011000110001010101000010010001000010010100100001000111001111111111110000111000010000100111111110010001101011000110001100001011000100001000010010000100011001110001100011111110001111110010000100100001111110001'
for i in range(250):
if a[i]=='1':
print ('*',end="")
else:
print (' ',end="")
if (i+1)%5==0:
print (' ',end="")
if (i+1)%50==0:
print ('
',end="")
输出字符HACKIT4FUN
拿去尝试一下发现是flag
flag{HACKIT4FUN}