BUUCTF[GWCTF 2019]xxor学习笔记

总体结构:

首先找到main函数,结构很清晰

前半段是输入和初始化

后半段开始着手加密

最后给出相应的输出

 

逐步分析:

首先在liunx中运行程序(注意要使用64位版本的liunx系统,后缀是AMD64的那种)

由题目给的这些字串可以得知,我们要输入六个数据来玩一个猜数游戏

这六个数据仔细分析就会发现就是v6,v6的每个元素占据4个字节

 

然后跟踪v6的行踪,仔细分析与v6有关的加密代码

这里dword_601078是取了每个v6元素四个字节中的后两个字节中的值,dword_60107c则是取了每个v6元素四个字节中前两个字节的值(详细去看hidword和lodword的定义)

 

这里解释一下为什么dword——601078那一条语句没有lodword函数却依然和有lodword函数的结果相同,这是由于dword_601078这个变量只能存储2个字节的数据,因此在读取v6[j]时只能读取其前两个字节,那么效果其实就跟lodword一样了。

 

深入到sub_400686中

 

先观察最下面这一段:

 

v3的值赋值到a1地址处,v4的值赋值到a1头部之后的元素上,考虑到a1其实是dword_601078,a1的一个元素大小为4字节,那么a1[1]所指向的地址不就是dword_60107c吗?这样这段代码的意义就明了了,对输入的数据两个两个一组进行异或加密。

 

再看最后的判断:

其实就是要让刚刚异或加密出来的结果符合if中给出的v7各个元素的值。

一些值是等式给出来的,解个简单的方程就知道v7各个元素的值了。

得到各个元素的值后,由结果通过逆算法推输入,就可以得到正确答案了(要注意耐心写脚本,这个工作挺繁琐的)

记得最后把输入的数字变成字符才能得到flag

Flag为flag{re_is_great!}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值