其他分享
首页 > 其他分享> > BUUCTF xor

BUUCTF xor

作者:互联网

  1. 利用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;
}
  1. 代码分析
    首先通过第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

  1. 编写脚本
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)
  1. 得到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