xor一般指异或。异或,英文为exclusive OR,缩写成xor异或(eor)是一个数学运算符。
题目地址:https://buuoj.cn/challenges#xor
用IDA载入,寻找main函数,F5打开伪C代码:
int __cdecl main(int argc, const char **argv, const char **envp)
{
char *v3; // rsi
int result; // eax
signed int i; // [rsp+2Ch] [rbp-124h]
char v6[264]; // [rsp+40h] [rbp-110h]
__int64 v7; // [rsp+148h] [rbp-8h]
memset(v6, 0, 0x100uLL);
v3 = (char *)256;
printf("Input your flag:\n", 0LL);
get_line(v6, 256LL);
if ( strlen(v6) != 33 ) // flag长度为33
goto LABEL_12;
for ( i = 1; i < 33; ++i )
v6[i] ^= v6[i - 1]; // 从输入的第二位开始,将其与前一位异或
v3 = global;
if ( !strncmp(v6, global, 0x21uLL) ) //比较V6与global段处存放前32位是否相同
printf("Success", v3);// 如果相同输出flag
else
LABEL_12:
printf("Failed", v3);
result = __stack_chk_guard;
if ( __stack_chk_guard == v7 )
result = 0;
return result;
}
用户输入一个长度为33的字符串,字符串中的字符分别和前一个字符异或(对应得ASCII码)后和变量global的前0x21个字符比对。逻辑并不复杂,提取global的值:
导出数据(edit——》export data)shift+E:
unsigned char ida_chars[] =
{
0x66, 0x0A, 0x6B, 0x0C, 0x77, 0x26, 0x4F, 0x2E, 0x40, 0x11,
0x78, 0x0D, 0x5A, 0x3B, 0x55, 0x11, 0x70, 0x19, 0x46, 0x1F,
0x76, 0x22, 0x4D, 0x23, 0x44, 0x0E, 0x67, 0x06, 0x68, 0x0F,
0x47, 0x32, 0x4F, 0x00
};
编写脚本:
list1=[0x66, 0x0A, 0x6B, 0x0C, 0x77, 0x26, 0x4F, 0x2E, 0x40, 0x11,
0x78, 0x0D, 0x5A, 0x3B, 0x55, 0x11, 0x70, 0x19, 0x46, 0x1F,
0x76, 0x22, 0x4D, 0x23, 0x44, 0x0E, 0x67, 0x06, 0x68, 0x0F,
0x47, 0x32, 0x4F, 0x00]
#print(list1) # 会自动变成十进制
flag=chr(list1[0]) # f 第一个‘f’没有被处理,但是也是flag的一部分。
i=1
while True:
if i<len(list1):
flag += chr(list1[i]^list1[i-1]) //从输入的第二位开始,将其与前一位异或
i+=1
else:
break
print(flag)
得到flag:flag{QianQiuWanDai_YiTongJiangHu}
千秋万代_一统江湖 ㄟ( ▔, ▔ )ㄏ