[MRCTF2020]EasyCpp

前言

前言这玩意真好用,比写文件类型好多了😐

C++ STL库写的所以代码看着都比较长,不过带着gpt分析也不是太麻烦,昨天的蓝桥国赛比这难,果然菜鸡不配打算法比赛

主函数分析

分析了,一下加密内容主要位于lamba匿名函数中和depart函数

匿名函数我理解的是函数名为lamba,参数数量任意的函数
在这里插入图片描述

前面这部分主要是为了如果输入的是正确的的flag便于后面输出字符串,加密过程中并不会用到,结尾处可以看到输入的整数都被进行了压栈处理
在这里插入图片描述
中间对basic_string函数分析出了点错误,因为unk不知道数据类型,但应该是大小或者初始值一类的东西

第一个lamba

在这里插入图片描述
主要进行xor操作

depart

在这里插入图片描述
说实话我没看懂分解原理,话说应该也没有可以求质数的公式,应该是用的暴力循环

质因数分解的过程如下:

起始质数为2。
20可以整除2,所以2是20的一个质因数。
商为10,继续对10进行质因数分解。
10可以整除2,所以2是10的一个质因数。
商为5,继续对5进行质因数分解。
5本身就是一个质数,所以5是5的质因数。
商为1,分解结束。
将质因数2、2、5按照从小到大排列,得到20的质因数分解结果为2 * 2 * 5。
第二个lamba

在这里插入图片描述
使用std::replace函数对字符串a2进行多次字符替换操作,将指定字符替换为相应的替换字符。

  • 替换字符’O’替换为’0’。
  • 替换字符’l’替换为’1’。
  • 替换字符’z’替换为’2’。
  • 替换字符’E’替换为’3’。
  • 替换字符’A’替换为’4’。
  • 替换字符’s’替换为’5’。
  • 替换字符’G’替换为’6’。
  • 替换字符’T’替换为’7’。
  • 替换字符’B’替换为’8’。
  • 替换字符’q’替换为’9’。
  • 替换字符’='替换为空格字符。
第三个lamba

在这里插入图片描述
可以看到一个比较函数,说明结果在ans里面,直接看不到值,需要动调。。呸,交叉引用也可以定位到,每次是真不想动调linux的文件,问题贼多
在这里插入图片描述

wp

所以将这些字符串转回去,然后每个字符串相乘后异或1

import hashlib
st1 = ["=zqE=z=z=z", "=lzzE", "=ll=T=s=s=E", "=zATT", "=s=s=s=E=E=E", "=EOll=E", "=lE=T=E=E=E", "=EsE=s=z", "=AT=lE=ll"]


def replace_chars(str):
    str = str.replace("O", "0")
    str = str.replace("l", "1")
    str = str.replace("z", "2")
    str = str.replace("E", "3")
    str = str.replace("A", "4")
    str = str.replace("s", "5")
    str = str.replace("G", "6")
    str = str.replace("T", "7")
    str = str.replace("B", "8")
    str = str.replace("q", "9")
    str = str.replace("=", " ")
    return str


temp = ""
for i in range(len(st1)):
    flag = 1
    out = replace_chars(st1[i]).split(" ")[1:]
    print(out)
    for j in out:
        flag *= int(j)
    print(hex(flag))
    flag ^= 1
    temp += str(flag)
print(temp)
m =hashlib.md5()
m.update(temp.encode('utf-8'))
print("flag{",end="")
print(m.hexdigest().upper(),end="")
print("}")

flag{4367FB5F42C6E46B2AF79BF409FB84D3}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值