BUUCTF—RE—xor

先用exeinfo分析文件:

64位,ida看伪代码:

 

但是这里有个变量值未知,回到ida找,找道global的地址:

 

 然后找到它的值:

 

 这里找到了一些可见字符,就是global的值,然后编写一个简单的脚本,来反过来异或这串字符:

 

#include<stdio.h>
#include<string.h>
int main()
{
    char flag[]={
    'f',
    0x0a,
    'k',
    0x0c,
    'w',
    '&',
    'O',
    '.',
    '@',
    0x11,
    'x',
    0x0D,
    'Z',
    ';',
    'U',
    0x11,
    'p',
    0x19,
    'F',
    0x1F,
    'v',
    '"',
    'M',
    '#',
    'D',
    0x0e,
    'g',
    6,
    'h',
    0x0F,
    'G',
    '2',
    'O',
    0
    };
    for(int i = 32; i>=1; i--)
    {
        flag[i]^=flag[i-1];
    }
    printf("%s",flag);
    return 0;
}

 

 

最后编译执行就可以得到flag:flag{QianQiuWanDai_YiTongJiangHu}

 

对于异或的补充:

举个栗子:33的二进制是   0010 0001

     44的二进制是   0010 1100

异或就是相同的二进制位为0,不同的为1

那么33^44就是                   0000 1101

那么得到的这个再和33异或一次

                                           0010 1100

就会回到44。

大概就是这么个原理,

多一个栗子:

qwertyuiop^asdfghjkl=Q

那么qwertyuiop^Q=asdfghjkl

       asdfghjkl^Q=qwertyuiop

 

posted @ 2021-12-12 11:12  Luccky  阅读(279)  评论(0编辑  收藏  举报