BUUCTF xor

题目

下载附件,用IDA-64打开

 然后使用按键F5,查看一下主函数

然后我们来分析一下这个这串代码

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 )
    goto LABEL_12;
  for ( i = 1; i < 33; ++i )
    v6[i] ^= v6[i - 1];
  v3 = global;
  if ( !strncmp(v6, global, 0x21uLL) )
    printf("Success", v3);
  else
LABEL_12:
    printf("Failed", v3);
  result = __stack_chk_guard;
  if ( __stack_chk_guard == v7 )
    result = 0;
  return result;
}

 由下面的代码我们可知,字符串的长度为33位

if ( strlen(v6) != 33 )

由下面的代码我们可知,将输入的字符串从第二位开始,后一位与前一位异或

for ( i = 1; i < 33; ++i )
    v6[i] ^= v6[i - 1];

由下面的代码我们可知,在global存放的字符串是执行过上述算法后得到的字符串

 if ( !strncmp(v6, global, 0x21uLL) ) 

我们双击下图的字符

跳到如下界面后,我们再次双击,下面的字符

 我们就找到了,我们需要去疑惑的字符串了

然后我们用python写个脚本,来a^b=c 等于 a^c=b函数还还原出,flag

str1 = ['f',0x0A,'k',0x0C,'w','&','O','.','@',0x11,'x',0x0D,'Z',';','U',0x11,'p',0x19,'F',0x1F,'v','"','M','#','D',0x0E,'g',6,'h',0x0F,'G','2','O']

f = 'f'

for i in range (1,len(str1)):
    if (isinstance(str1[i],str)):
        if (isinstance(str1[i-1],str)):
            f +=chr(ord(str1[i]) ^ ord(str1[i-1]))
        else:
            f +=chr(ord(str1[i]) ^ str1[i-1])
    else:
        f +=chr(str1[i] ^ ord(str1[i-1]))
print(f)

 

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

仲瑿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值