!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和伪代码
flag长度为33,重点语句是v6[i] ^= v6[i - 1];,和global比较
进入global得到(数一下正好33个字符和数字)
用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 的异常。
方式二:
选择后shift+E
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,提交正确