逆向刷题——BUUCTF(持续更新。。。)

逆向刷题——BUUCTF

Xor

==拓展:==xor是一种加密常用的运算符,用来比较两者是否不同,相同返回0,不同返回1。这样的话,假定有一条message和一串密钥key,以二进制的形式进行异或操作得到加密文本cipherText,而加密文本如若不通过key进行逆运算,将几乎无法得到message。这种加密方式可简化为如下公式:

message ^ key = cipherText
cipher ^ key=message.

下载附件查其壳和位数发现无壳且是64位

用64位的IDA打开,选中主函数main,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];		/*这里进行了异或操作,将v6进行了加密,原v6就message(flag),global
    						  就是cipherText,而key就是字符串v6[i-1].
    						*/
  v3 = global;
  if ( !strncmp(v6, global, 0x21uLL) )		
    printf("Success", v3);//从这里可以看出,其判断条件就是本题的关键,跟进v3,与global有关,再跟进
    //
  else
LABEL_12:
    printf("Failed", v3);
  result = __stack_chk_guard;
  if ( __stack_chk_guard == v7 )
    result = 0;
  return result;
}

经过分析写出程序:

#include<stdio.h>
int main(){
	char xor[]={'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'};
	int i;
	for(i=32;i--;i>0){
		xor[i]^=xor[i-1]; 
		/*
		Xor‘^’异或运算符,一种常用的加密运算符,用来比较两者是否不同,相同则返回0,不同返回1
		例如:1001^1010=0011
		而这种加密一般可通过逆运算得到原来的字符串
		例如:0011^1010=1001
		即想知道被加密的原文本只要知道加密结果和key就能处理得到源文本 
		*/
	}
	printf("%s",xor);
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值