【buuctf】每日4到(reverse)

新年快乐

开局直接放到IDA里头直接按f5查看伪代码,结果看到被保护了什么的

 估计是套壳了吧,用exeinfo pe看两眼,果然

 直接用kali自带的upx脱壳吧(我也没找到啥可以白嫖的脱壳软件)

 脱出来它好像直接把它原来有壳版本的给换了,直接拖到主机,然后再搞到IDA分析吧

直接看_main函数了(有main就看,没main另外说)

 flag直接是HappyNewYear!了,不是很难

xor

这个感觉有点像写算法小练习,把文件投进IDA里头,在main函数里头按f5看伪代码,最终目的是要我们输入的字符串要和global比较相等就是flag了,strncmp()=0就是两个字符串相等,详细可以看我之前写的文章

【buuctf】 每日四到(reverse)

我们先看一下global变量吧,双击查看变量来源

这段命令总的来说就是变量_global获取aFKWOXZUPFVMDGH的地址,因此我们可以看看aFKWOXZUPFVMDGH里头是什么,双击进入

发现一段字符串,引住按shift+e输出

得到了我们的ascii字符数组

 接着分析下v5这个变量

v5是我们待输入的字符串,然后会被一段循环给处理

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

也就是将字符串的每一位的本位字符与前一位字符进行异或操作

这里有个关键的知识:

异或操作a^b就是如果a=1,b=0或a=0,b=1为真,其余为假

0^0=0;

1^1=0

0^1=1;

1^0=1;

(简单通俗点举个例子就是:

一个人的性别要不是男要不是女(不考虑沃尔玛购物袋),设事件a为男人,事件b为女人,那么当a=1,b=1就相当于这个人是男也是女,那肯定是假的啊,由此就是a^b=0)

并且异或操作满足交换律和结合律

 有了快引用里头的前提知识,我们可以推导下原字符串的字符,设原来的字符为x

x^v5[i-1]=v5[i]

x^v5[i-1]^v5[i-1]=v5[i]^v5[i-1]

x^(v5[i-1]^v5[i-1])=v5[i]^v5[i-1]

x^0=v5[i]^v5[i-1]

又因为x^0=x

因此x=v5[i]^v5[i-1]

由此我们得到的数组和公式,写程序解出flag

 reverse3

和之前一样,IDA打开代码

详细看一下吧

for ( i = 0; i < 100; ++i )
  {
    if ( (unsigned int)i >= 0x64 )
      sub_411154();
    Destination[i] = 0;
  }
//这段循环应该是对Destination初始化吧
  sub_41132F("please enter the flag:", v9);

  sub_411375("%20s", (char)Str);//输入Str

  v3 = j_strlen(Str);//得到Str字符串长度

  v4 = (const char *)sub_4110BE(Str, v3, v16);//不认识这个函数,估计是自定义的,下文再详细说说

  strncpy(Destination, v4, 0x28u);//复制字符串将v4赋给Destination

  ((void (*)(void))sub_411127)();//不认识,好像不重要

  v13 = j_strlen(Destination);//得到Destination的字符串长度

  for ( j = 0; j < v13; ++j )
    Destination[j] += j;
    //对字符串每一位加上它的键值

  v5 = j_strlen(Destination);//得到Destination的字符串长度

  strncmp(Destination, Str2, v5);//直接比较了,对了就是flag
  if ( ((int (*)(void))sub_411127)() )
    sub_41132F("wrong flag!\n", v10);
  else
    sub_41132F("rigth flag!\n", v10);

 先看看Str2

 Str2就是 e3nifIH9b_C@n@dH

然后再看一下sub_4110BE这个函数吧,也是双击

再对sub_411AB0双击

看不懂,最后查了一下是base64编码的函数(我废)

 所以总的来说就是我们输入的字符串先经过base64加密,然后每位加键值,然后再和Str2相比,一样就是flag,可以写程序了

然后base64解密

helloword

下载下来是个apk,这时要用androidkill直接破解了,我是从下面大佬这下的

AndroidKiller

直接在里头打开就行了 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值