NSSCTF-[深育杯 2021]Press

news/2024/5/19 22:26:03 标签: ctf, re, vm

下载链接:下载

载入IDA,查看内容

首先进入一个函数进行初始化,进入查看

re>unsigned __int64 sub_4007B6() { int v1; // [rsp+8h] [rbp-48h] int i; // [rsp+Ch] [rbp-44h] char src[56]; // [rsp+10h] [rbp-40h] BYREF unsigned __int64 v4; // [rsp+48h] [rbp-8h] v4 = __readfsqword(0x28u); memset(tmp, 0, sizeof(tmp)); memset(s, 0, sizeof(s)); memset(flag, 0, sizeof(flag)); memset(enflag, 0, 0xC8uLL); v2 = 0; xiaobiao = 0; // index dword_602268 = 0; f_index = 0; strcpy(src, "++++++++++[->++++++++++++++++<],[->-<]>>[-]+++++<*++.<"); strcpy(s, src); v1 = 0; for ( i = 0; i <= 199; ++i ) { if ( s[i] == '[' ) { data[i] = ++v1; } else if ( s[i] == ']' ) { data[i] = v1--; } else { data[i] = 0; } } return __readfsqword(0x28u) ^ v4; }re>

开辟了tmp,s,flag,enflag空间,然后给一些值赋值初始化为0,s为"++++++++++[->++++++++++++++++<],[->-<]>>[-]+++++<*++.<",然后进行for循环,从循环中分析可以知道当遍历到'['或者']'的时候就会为1,其余情况为0,然后依次赋值给data数组。返回主函数继续观察。

然后读取flag文件把内容读取到flag中进入while循环,其中有一个sub_40094B()函数跟进:

这里面就类似一个虚拟机操作,看到switch条件就是遍历s这个字符串'++++++++++[->++++++++++++++++<],[->-<]>>[-]+++++<*++.<',先跟着流程走一遍。

第一次循环:

首先是10个'+',所以tmp[0]==10,然后是'[',但是tmp[0]是10不为0,所以不会进入循环,接着是‘-’,tmp[0]变为9,然后是‘>’,移动到tmp[1],然后是16个‘+’,tmp[1]==16。然后是‘<’号又移动到tmp[0]位置,然后是一个重点遇到‘]’号会进入到循环里面,这个for循环操作是不断j--,一直到data[xiaobiao + j] != data[xiaobiao],我们观看data数据可以知道这个条件不成立就是向前遍历到‘[’。即'xiabiao+j'是前面那一个'['位置,经过这个for循环xiabiao被修改变为‘xiaobiao + j - 1’,return的时候又自增1,所以经过这个for循环又遍历到前面的那个‘[’位置(每次遇到‘]’的时候都会回到前面的那个'['位置开始再一次遍历,直到tmp[v2]==0进入循环才停止)。

因为最开始tmp[0]==10,每一次tmp[1]都会加16,所以这次循环当tmp[0]==0时tmp[1]==10*16。然后就会进入到case '['里的循环修改下标为']'位置,然后return的时候下标自增+1就会从']'后的那个符合开始。

第二次循环:[->-<]

遇到',',即把读取的flag内容存放到tmp[0]中,然后遇到‘[’,此时tmp[v2]存放的是flag内容的第一个字符肯定不是0不会进入循环,然后tmp[0]-1,右移到tmp[1]然后减1,然后左移到tmp[0],遇到']',回到前面的'['处如果不是0就一直循环往复直到tmp[0]==0,所以当tmp[0]==0的时候tmp[1]==160-flag[0],进入到了‘case [’的循环体里面就会跳到'>>[-]+++++<*++.<',进入第三次循环。

第三次循环:>>[-]+++++<*++.<

经过两次'>>'会来到tmp[2],然后遇到'[',因为tmp[2]刚开始是0所以直接进入到循环体里面来到'+'号,经过5个加号tmp[2]==5,然后遇到'<'来到tmp[1]处,遇到'*'运算乘法操作tmp[1] *= tmp[2],tmp[1]==(160-flag[0])*5+2,然后遇到'.'号会把运算结果放入到enflag数组中,然后最后左移到tmp[0]再次经过如上操作直到读取完所有的flag内容放在enflag数组当中。

这里需要注意当遍历完成一次s=‘++++++++++[->++++++++++++++++<],[->-<]>>[-]+++++<*++.<’操作后tmp[1]==0,tmp[1]等于你刚刚求出来的那个flag内容,tmp[2]不是0,但是第二次循环遇到[-]时候tmp[2]会被清零。

知道上面这些就可以写代码了:

re>out=[0x60, 0xE1, 0x2F, 0x05, 0x79, 0x80, 0x5E, 0xE1, 0xC5, 0x57, 0x8B, 0xCC, 0x5C, 0x9A, 0x67, 0x26, 0x1E, 0x19, 0xAF, 0x93, 0x3F, 0x09, 0xE2, 0x97, 0x99, 0x7B, 0x86, 0xC1, 0x25, 0x87, 0xD6, 0x0C, 0xDD, 0xCF, 0x2A, 0xF5, 0x65, 0x0E, 0x73, 0x59, 0x1D, 0x5F, 0xA4, 0xF4, 0x65, 0x68, 0xD1, 0x3D, 0xD2, 0x98, 0x5D, 0xFE, 0x5B, 0xEF, 0x5B, 0xCC] flag="" b=0 for i in range(len(out)): b+=160 for j in range(127): if (((b-j)*5+2)&0xff==out[i]): flag+=chr(j) b=out[i] break import base64 print(base64.b64decode(flag)) re>

p.z师傅也写了一个z3求法,学习一下:SangFor(深育杯)-Reverse(逆向) Press Write up_水番正文的博客-CSDN博客

re>from z3 import * enflag = [0x60, 0xE1, 0x2F, 0x05, 0x79, 0x80, 0x5E, 0xE1, 0xC5, 0x57, 0x8B, 0xCC, 0x5C, 0x9A, 0x67, 0x26, 0x1E, 0x19, 0xAF, 0x93, 0x3F, 0x09, 0xE2, 0x97, 0x99, 0x7B, 0x86, 0xC1, 0x25, 0x87, 0xD6, 0x0C, 0xDD, 0xCF, 0x2A, 0xF5, 0x65, 0x0E, 0x73, 0x59, 0x1D, 0x5F, 0xA4, 0xF4, 0x65, 0x68, 0xD1, 0x3D, 0xD2, 0x98, 0x5D, 0xFE, 0x5B, 0xEF, 0x5B, 0xCC] input = [BitVec('input[%d]' % i, 8) for i in range(56)] #yyj = BitVec('yyj', 8) s = Solver() s.add( ((160 - input[0]) * 5 + 2) == enflag[0] ) #第一台液压机 for i in range(1, 56): #之后的液压机 s.add( (((160 + enflag[i - 1]) - input[i]) * 5 + 2) == enflag[i] ) if sat == s.check(): ans = s.model() flag = "" for i in range(56): flag += chr(ans[input[i]].as_long()) #as_long()转成整数 print(flag)re>

reeSkill">

http://www.niftyadmin.cn/n/324831.html

相关文章

图解 SQL 执行顺序,清晰明了

这是一条标准的查询语句: 这是我们实际上SQL执行顺序&#xff1a; 我们先执行from,join来确定表之间的连接关系&#xff0c;得到初步的数据 where对数据进行普通的初步的筛选 group by 分组 各组分别执行having中的普通筛选或者聚合函数筛选。 然后把再根据我们要的数据进行…

云渲染是什么?云渲染和传统渲染农场有什么区别?

云渲染是什么&#xff1f;云渲染和传统渲染农场有什么区别&#xff1f; 今天云渲染小编就来和大家说一说云渲染以及它和传统渲染农场的区别。 一、什么是云渲染&#xff1f;云渲染什么意思&#xff1f; 首先云渲染云渲染是一种依托于云计算的云端服务&#xff0c;用户将本地…

伪类和伪元素的区别?

前言 伪类和伪元素是CSS中的两种特殊方式&#xff0c;可以对HTML元素添加一些不同于普通选择器样式的显示效果。它们的实现方法类似&#xff0c;但其意义和使用方式有所不同。 伪类&#xff08;Pseudo Class&#xff09;&#xff1a; 是在 CSS3 中引入的&#xff0c;用于描述…

SQL server 纵横报表查询

select warehouseid AS 仓库, case when Udf2 SAP THEN SAP WHEN Udf2 SNC THEN SNC ELSE 手工创建 end AS 创建来源 ,COUNT(isnull(UDF2,手工创建)) AS 数量 from DOC_Appointment_Header dah where convert(varchar(10),AddTime,120) > 2022-09-01 --and warehousei…

lambda常见使用方法

文章目录 前言介绍遍历排序过滤映射归纳分组实现接口线程判空流水线总结 前言 之前在携程实习&#xff0c;遇到了lambda表达式&#xff0c;最近逛b站&#xff0c;刚好看到了。顺手整理一下。参考链接 介绍 lambda是一种提高生产力的一种书写代码的方式。代码中有很多的箭头&…

【计算机视觉】如何利用 CLIP 做简单的人脸任务?(含源代码)

文章目录 一、数据集介绍二、源代码 结果三、代码逐行解读 一、数据集介绍 CELEBA 数据集&#xff08;CelebFaces Attributes Dataset&#xff09;是一个大规模的人脸图像数据集&#xff0c;旨在用于训练和评估人脸相关的计算机视觉模型。该数据集由众多名人的脸部图像组成&a…

Docker Swarm集群管理

秋风阁(https://focus-wind.com/) 文章目录 基本概念Swarm节点任务与服务 集群管理端口配置创建集群加入集群查看集群退出集群 节点设置节点标签设置节点信息查询 服务管理部署服务查看服务服务日志查看服务重启 Docker Swarm官方文档 Docker Swarm是Docker引擎原生内置的容器…

如何解决浏览器跨域问题?

浏览器判断是跨域请求会在请求头上添加origin&#xff0c;表示这个请求来源哪里。比如&#xff1a; Plaintext GET / HTTP/1.1 Origin: http://localhost:8601服务器收到请求判断这个Origin是否允许跨域&#xff0c;如果允许则在响应头中说明允许该来源的跨域请求&#xff0c;…