[BUUCTF]REVERSE——[BJDCTF2020]easy

[BJDCTF2020]easy

附件

  1. 例行检查,无壳,32位程序
    在这里插入图片描述

  2. 32位ida载入,main函数和字符串理都没有找到有关flag的提示
    在这里插入图片描述

  3. 根据main函数的提示,有关flag的函数应该被藏起来了,在左边的函数列表里一个一个查看,看到quess的函数长得有的像
    在这里插入图片描述
    给了10个数据,每两个数据进行一次变换,变换后长度为50,之后应该是对处理好后的数据进行按位判断,是1输出‘*’,否则输出‘ 空格 ’,估计对处理后的数据转换成了2进制

  4. 32行到46行的处理数据里有些函数看不大懂,百度后发现是宏定义
    在这里插入图片描述

  5. 所以我们这边对数据的操作是每两个数据为一组,分别取出他们的高字节(前16位)和低字节(后16位)去组成一个新的数,高低位分别为32字节,新的数的高字节是每组的第二个数的高字节+低字节,新数的低字节是每组第一个数的高字节+低字节,注意最后生成的数据的长度是50
    拿一组数据说明一下
    在这里插入图片描述
    所以得到的新数的二进制是10001001001111110001111111111110100111111000110001
    依次类推可以算出其他4组数据的结果,最后得到的5组数据是

10001001001111110001111111111110100111111000110001
10001010101000010010001000010010100100001000111001
11111111111000011100001000010011111111001000110101
10001100011000010110001000010000100100001000110011
10001100011111110001111110010000100100001111110001
  1. 最后按位比较一下,是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}

原文地址:https://www.cnblogs.com/xlrp/p/14273640.html