!strncmp(v6, global, 0x21uLL)

其函数声明为int strncmp ( const char * str1, const char * str2, size_t n );

功能是把 str1 和 str2 进行比较,最多比较前 n 个字节

若str1与str2的前n个字符相同,则返回0;若s1大于s2,则返回大于0的值;若s1 小于s2,则返回小于0的值

——————————————————————————

先使用PEID查看发现无壳,再拖进IDA查看strings和伪代码

buuctf xor_ico

 

 flag长度为33,重点语句是v6[i] ^= v6[i - 1];,和global比较

进入global得到(数一下正好33个字符和数字)

buuctf xor_ico_02

 

 用py写个脚本

————————————————————————————————————

方式一:

 1 s=['f',0xA,'k',0xC,'w','&','O','.','@',0x11,'x',0xD,'Z',';','U',0x11,'p',0x19,
 2    'F',0x1F,'v','"','M','#','D',0xE,'g',6,'h',0xF,'G','2','O',0]
 3 flag=s[0]
 4 for i in range(1,len(s)):
 5     if(isinstance(s[i],int)):
 6         s[i]=chr(s[i])
 7 
 8 for i in range(1,len(s)):
 9     flag+=chr(ord(s[i])^ord(s[i-1]))
10 
11 print(flag)

ord() 函数是 chr() 函数(对于8位的ASCII字符串)或 unichr() 函数(对于Unicode对象)的配对函数,它以一个字符(长度为1的字符串)作为参数,返回对应的 ASCII 数值,或者 Unicode 数值,

如果所给的 Unicode 字符超出了你的 Python 定义范围,则会引发一个 TypeError 的异常。

方式二:

buuctf xor_字符串_03

 

 选择后shift+E

buuctf xor_字符串_04

 

 

1 s=[0x66, 0x0A, 0x6B, 0x0C, 0x77, 0x26, 0x4F, 0x2E, 0x40, 0x11,
2   0x78, 0x0D, 0x5A, 0x3B, 0x55, 0x11, 0x70, 0x19, 0x46, 0x1F,
3   0x76, 0x22, 0x4D, 0x23, 0x44, 0x0E, 0x67, 0x06, 0x68, 0x0F,
4   0x47, 0x32, 0x4F, 0x00]
5 flag=chr(s[0])
6 for i in range(1,len(s)):
7     flag+=chr(s[i]^s[i-1])
8 
9 print(flag)

得到flag,提交正确