BUUCTF xor
作者:互联网
- 利用
ida64
打开文件xor,并按F5
进行反编译,得到代码
int __cdecl main(int argc, const char **argv, const char **envp)
{
int i; // [rsp+2Ch] [rbp-124h]
char __b[264]; // [rsp+40h] [rbp-110h] BYREF
memset(__b, 0, 0x100uLL);
printf("Input your flag:\n");
get_line(__b, 256LL);
if ( strlen(__b) != 33 )
goto LABEL_7;
for ( i = 1; i < 33; ++i )
__b[i] ^= __b[i - 1];
if ( !strncmp(__b, global, 0x21uLL) )
printf("Success");
else
LABEL_7:
printf("Failed");
return 0;
}
- 代码分析
首先通过第7,8行可以看出需要输入这个就是我们的flag
第9行我们知道了flag长度为33
第11行的循环,从flag[1]开始,依次与前一位异或
,得到当前位置的值
第13行与global比较,按shift + F12
,查看文件中的可见字符串
点进去看
__cstring:0000000100000F6E aFKWOXZUPFVMDGH db 'f',0Ah ; DATA XREF: __data:_global↓o
__cstring:0000000100000F6E db 'k',0Ch,'w&O.@',11h,'x',0Dh,'Z;U',11h,'p',19h,'F',1Fh,'v"M#D',0Eh,'g'
__cstring:0000000100000F6E db 6,'h',0Fh,'G2O',0
我们知道了global的内容,从后到前异或回来即可得到flag
- 编写脚本
s = ['f',0xA,'k',0xC,'w&O.@',0x11,'x',0xD,'Z;U',0x11,'p',0x19,'F',0x1F,'v"M#D',0xE,'g',0x6,'h',0xF,'G2O',0x0]
for i in range(len(s)):
if(type(s[i])==int):
s[i] = chr(s[i])
s = "".join(s)
res = "f"
for i in range(1,len(s)):
res += chr(ord(s[i]) ^ ord(s[i-1]))
print(res)
- 得到flag
flag{QianQiuWanDai_YiTongJiangHu}
参考链接:
https://www.cnblogs.com/Mayfly-nymph/p/11461575.html
标签:__,BUUCTF,xor,int,global,db,flag,0000000100000F6E 来源: https://www.cnblogs.com/darkcyan/p/16297185.html