[BUUCTF]REVERSE——[BJDCTF2020]easy
阅读原文时间:2023年07月09日阅读:1

[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

  6. 最后按位比较一下,是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 ('\n',end="")


输出字符HACKIT4FUN
拿去尝试一下发现是flag
flag{HACKIT4FUN}

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章