首页 > 其他分享 >BUUCTF [GXYCTF2019]simple CPP

BUUCTF [GXYCTF2019]simple CPP

时间:2024-07-31 18:29:20浏览次数:17  
标签:BUUCTF simple add encode print flag key CPP z3

buu上的一道z3题,记录一下z3奇怪的用法。
首先扔进ida,打开主函数,非常混乱的算法,大概发现两个关键点:

这里应该是对flag进行异或得到v6

而这里的比较应该就是求解flag的关键,可以看出来有四个未知数,求解也是非常简单,z3直接求解即可:

from z3 import *
x,  y,  z,  w = BitVecs("x y z w",  64)
#2 1 0 3
s = Solver()

s.add(x & ~z == 0x11204161012)
s.add(((x & ~y) & z) | x & ((y & z) | y & ~z | ~(y | z)) == 0x8020717153E3013)
s.add((x & ~z) | (y & z) | (x & ~y) | (z & ~y) == 0x3E3A4717373E7F1F)
s.add((0x3E3A4717373E7F1F ^ w) == 0x3E3A4717050F791F)
s.add(((x & ~z) | (y & z) | y & x) == (~z & x | 0xC00020130082C0C) and 1)

if s.check() == unsat:
    print("无解")
else:
    m = s.model()
    for i in m:
        print(f"%s = 0x%x"%(i, m[i].as_long()))

注意这里的y应该是有不唯一解,但在比赛中好像给出了中间部分的结果,所以这里并无大碍

接下来就是看求出来的四个未知数和flag的关系了,这里看到有这么个函数:

可以看到每相隔8位有一个case,如果不满8位则将v17加上w并右移八位。不难猜想,该函数的作用是将encode的前24个字母每8个分成一组,并按序号从小到低拼成一个十六进制数,最后未满8个的字母在一组,然后存进数组里进行刚才的z3运算
因此我们只要按顺序将刚才的x,y,z,w两位两位提取出来即可得到encode的内容。然后encode与key异或即可得到flag。交叉应用key,非常容易发现key的值为i_will_check_is_debug_or_not
因此写出解密脚本:

key = "i_will_check_is_debug_or_not"
enc = [0x3E, 0x3A, 0x46, 0x05, 0x33, 0x28, 0x6F, 0x0D, 0x8C, 0x00, 0x8A, 0x09, 0x78, 0x49, 0x2C, 0xAC, 0x08, 0x02, 0x07, 0x17, 0x15, 0x3E, 0x30, 0x13, 0x32, 0x31, 0x06]
flag = ''
for i in range(len(enc)):
    flag += chr(enc[i] ^ ord(key[i % len(key)]))
print(flag)

得出结果:We1l_D0näeéb' _ólgebra_am_i
将中间的y换成题目给的e!P0or_a即可
flag{We1l_D0ne!P0or_algebra_am_i}

标签:BUUCTF,simple,add,encode,print,flag,key,CPP,z3
From: https://www.cnblogs.com/reverse-chen/p/18335195

相关文章

  • 设计模式 - 简单工厂模式(Simple Factory Pattern)
    设计模式-简单工厂模式(SimpleFactoryPattern)  概要  记忆关键字:工厂类创建对象  定义:通过工厂类创建对象,并且根据传入参数决定具体子类对象的做法,就是简单工厂模式  分析:如果一个类的实例需要在许多地方被创建和初始化,而初始化的代码也比较复杂。此时可以考虑......
  • Bugku:Simple_SSTI_2
    目录1.进入网站查看题目2.开始尝试3.判断引擎模板类型4.构造语句,开始注入5.得到flag1.进入网站查看题目再查看源代码,发现没有什么有用的。根据题目提示SSTI,搜索一下SSTI,了解一下。  SSTI(服务器端模板注入)也是格式化字符串的一个非常好的例子,如今的开发已经形成......
  • [个人理解] llama.cpp之sample策略
    最近有点时间看了几天llama.cpp的code,有几个点,想记录一下,不对的地方,欢迎大家指正。话说本该去年就看,奈何这个领域变的太快,索性积累到今年,当openAI也开始挤牙膏的时候一并看了。Summary-llama是跟chatpgt一样,基于transformer架构的decodeonly的一挂,这一系列的模型擅长文字接......
  • BUUCTF GWCTF2019 re3
    挺有意思的一题,记录一下主要思路为smc解密+AES算法扔进ida后找到主函数:发现函数地址异或,推测为smc,先按d转化为数据,然后直接使用python脚本解密:fromida_bytesimport*ea=0x402219foriinrange(0,224):patch_bytes(ea+i,bytes(ea+i)^0x99)选中按p生成......
  • 06_Calendar类_SimpleDateFormat类_System类
    一、Calendar类Calendar的构造方法是protectedCalendar(),由于修饰符是protected,所以无法直接创建该对象,需要使用Calendar.getInstance();创建。其他方法:代码示例:importjava.util.Calendar;publicclassdemo01{publicstaticvoidmain(String[]args){......
  • vue-simple-uploader 支持分片上传,多文件上传,断点续传等多种功能的文件上传组件
    vue-simple-uploader特性:1、支持文件、多文件、文件夹上传2、支持拖拽文件、文件夹上传3、统一对待文件和文件夹,方便操作管理4、可暂停、继续上传5、错误处理6、支持“快传”,通过文件判断服务端是否已存在从而实现“快传”7、上传队列管理,支持最大并发上传8、分块上传9、......
  • 【科大讯飞笔试题汇总】2024-07-27-科大讯飞秋招提前批(研发岗)-三语言题解(Cpp/Java/
    ......
  • BUUCTF-Exec(Web)
    1.相关知识Ping命令ping命令通常用来作为网络可用性的检查。ping命令可以对一个网络地址发送测试数据包,看该网络地址是否有响应并统计响应时间,以此来测试网络的连通情况和测试网络速度。ping命令执行后会显示一系列Replyfrom或者Requesttimeout这样的结果。前者表示与对方......
  • BUUCTF-Include(Web)
    一、Include11.相关知识PHP://filterphp://filter是php中独有的一种协议,它是一种过滤器,可以作为一个中间流来过滤其他的数据流。通常使用该协议来读取或者写入部分数据,且在读取和写入之前对数据进行一些过滤,例如base64编码处理,rot13处理等。具体详见:https://blog.csdn.net......
  • 自制基于simplefoc大功率驱动板想法的由来,同时欢迎有相同兴趣的F友一起来玩。。。
      前一阵子,偶然在B站上看了一个simplefoc的介绍视频,代码简洁、算法精妙让人佩服,更让人佩服的是:开源!遂!搜索之!不搜不知道一搜吓一跳,发现太OUT了,原来玩这个算法的人这么多,让我这个整天沉浸在帕克、反帕克、Ualpha、Ubeta...的开发攻城狮汗颜。  出于好奇和对知识的无限渴求(冒......