NSSCTF-[深育杯 2021]Press

news2024/11/28 7:28:45

下载链接:下载

载入IDA,查看内容

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

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;
}

开辟了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]会被清零。

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

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))

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

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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/528713.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【可乐荐书】有趣的矩阵:看得懂又好看的线性代数

本栏目将推荐一些经典的、有趣的、有启发性的书籍&#xff0c;这些书籍涵盖了各个领域&#xff0c;包括文学、历史、哲学、科学、技术等等。相信这些书籍不仅可以让你获得知识&#xff0c;还可以让你感受到阅读的乐趣和魅力。 今天给大家推荐的书籍是&#xff1a;《有趣的矩阵…

【简单DP】CF1420 C1

昨天的CF心态又打崩了 好久没写DP了这道题一发过了 但是大家都会qwq 烦死 Problem - C1 - Codeforces 题意&#xff1a; 给定一个序列&#xff0c;让你找出一个子序列 使得 这个最大&#xff0c;a是子序列 思路&#xff1a; 首先子序列&#xff0c;自然就是DP 然后每个…

品牌活动如何策划,更利于传播?(吸引媒体报道)

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 之前做媒体的时候&#xff0c;参加过无数的媒体活动&#xff0c;现在做媒体传播也给了许多品牌一些建议&#xff0c;有的活动设计的很有趣&#xff0c;有的活动设计的很巧妙&#xff0c;…

响应式设计 MediaQuery和flex

一、MediaQuery(媒体查询)的概念 为不同尺寸的屏幕设定不同的css样式 示例 二、media常用参数 三、媒体查询代码示例 MediaQuery在浏览器中的显示示例 MediaQuery综合案例 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8…

Go语言笔记:使用ssh包作为客户端与SSH服务器交互

文章目录 目的基础说明使用演示单次通讯连续通讯&#xff08;远程终端&#xff09; 总结 目的 Golang中可以使用 golang.org/x/crypto/ssh 包作为SSH客户端或者SSH服务使用。这篇文章将简单记录下作为客户端使用的一些内容。 Package ssh implements an SSH client and server…

QT自定义控件折线图、趋势图。

这里提供两种实现方式&#xff0c;一直自绘的自定义控件&#xff0c;一直三方SDK&#xff08;qcustomplot&#xff09;。 这里主要介绍自绘的&#xff0c;它的优点是结构简单&#xff0c;代码逻辑好修改&#xff0c;容易定制&#xff0c;缺点是功能相对单一。三方的qcustomplot…

循迹模块(应用于小车)

1.1循迹模块使用 TCRT5000传感器的红外发射二极管不断发射红外线 当发射出的红外线没有被反射回来或被反射回来但强度不够大时&#xff0c; 红外接收管一直处于关断状态&#xff0c;此时模块的输出端为高电平&#xff0c;指示二极管一直处于熄灭状态 被检测物体出现在检测范…

C++ | 数组拷贝

C | 数组拷贝 文章目录 C | 数组拷贝数组名数组拷贝1.对应位拷贝2.地址位移赋值3. memcpy内存拷贝4.字符数组拷贝 Reference 数组名 C数组间赋值不能直接通过数组名称 randy sesame进行&#xff0c;因为数组名并不是指针&#xff0c;大部分情况下&#xff0c;编译器会隐式转换…

使用nvm 管理node.js版本的安装过程

一个 nodejs 版本管理工具&#xff01;—— nvm 在项目开发过程中&#xff0c;随着框架的不断更新迭代&#xff0c;对一些环境依赖的版本也有影响&#xff0c;部分的老项目可能需要低版本的 node.js 才能正常使用&#xff0c;而后期新开发的项目可能需要更高的 node.js 版本才…

都说2023是测试员的危机年,却不断有人跳槽拿20K+,为什么?

从 2021 年上旬开始触发的经济危机逐渐蔓延到普通人的生活中&#xff0c;裁员、倒闭、跑路俨然已成为刷爆朋友圈的高频热词。随之而来的是一系列因舆论所牵动的各种焦虑感弥漫在人群中&#xff0c;无论是大公司还是之前处于风口浪尖的明星创业公司&#xff0c;几乎无一幸免。聊…

ANR实战案例3 - 应用在部分低端机ANR优化案例

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 文章目录 系列文章目录前言一、Blocked状态1.案例一2.案例二3.案例三 二、高低端机区分1.WebView预加载 三、…

Flink基础介绍-2 架构

Flink基础介绍-1 概述 二、Flink架构2.1 Flink的设计架构2.2 Flink的运行架构2.3 Flink的系统架构 二、Flink架构 2.1 Flink的设计架构 Flink是一个分层的架构系统&#xff0c;每一层所包含的组件都提供了特定的抽象&#xff0c;用来服务于上层组件&#xff0c;Flink的分层体…

搬家货运系统软件开发功能

生活中要用到搬家的场景很多&#xff0c;租房子、买房子、换房子都要搬家&#xff0c;不管是从时间还是专业性上来说&#xff0c;很多人都更愿意找专业的搬家公司来代为处理&#xff0c;于是市面上出现了各类各样的货运搬家软件&#xff0c;让有需求的用户可以直接在线预约搬家…

Java实现网上人才招聘系统【附源码】

网上人才招聘系统 1、概述 3 2、系统分析 4 2.1、问题定义 4 2.2、可行性研究 4 2.2.1、可行性需求分析 4 2.2.2、数据流分析 5 2.2.3、数据字典 6 2.2.4、程序流程图 6 2.2.4、开发进度计划 6 2.3、需求分析 7 2.3.1、功能需求分析 7 2.3.2、数据需求分析 10 2.3.3、性能需求…

Dozer拷贝DO到VO

DO&#xff1a; data object 查出来的数据 VO&#xff1a; value object 要展示的数据&#xff0c;返回给前端的数据 DO查出来的字段比较多&#xff0c;VO过滤一下返回给前端 工具类Dozer <dependency><groupId>com.github.dozermapper</groupId><arti…

Vue3 router路由跳转传参Json数据,隐藏参数Url不显示跳转内容,使用History 来写,setup语法糖的写法

前言&#xff1a;Vue3中 Router的自2022-8-22 日后不能使用 params传参 —— 可以这么写&#xff0c;但是接收的时候会是空值 —— query可以用但不能用隐藏Url地址内的值&#xff0c;所以我们用History来写 history敲不出来的可以看最下面 这个相当于history模式父级调到子集后…

Linux文本三剑客之~~~awk 详细讲解 与date粗略讲解

目录 一. awk工作原理&#xff1a;1.1命令格式:1.2 awk常见的内建变量(可直接用)如下所示: 二 实验示例2.1 按行输出文本2.2按字段输出文本2.3 通过管道符双引号调用shell命令 date命令 一. awk工作原理&#xff1a; 逐行读取文本&#xff0c;默认以空格或tab键为分隔符进行分…

软件测试月薪2万,需要技术达到什么水平?

最近跟朋友在一起聚会的时候&#xff0c;提了一个问题&#xff0c;说一个软件测试工程师如何能月薪达到二万&#xff0c;技术水平需要达到什么程度&#xff1f;人回答说这只能是大企业或者互联网企业工程师才能拿到。也许是的&#xff0c;小公司或者非互联网企业拿二万的不太可…

网络性能监控(NPM)工具

网络是每个企业的支柱。即使在小型或企业级企业中&#xff0c;网络中断期间的生产力损失也可能导致巨大的损失。网络监控解决方案可帮助您预测潜在的中断并主动解决网络问题。这有助于维护无拥塞网络&#xff0c;使您的业务保持正常运行。这可以在网络监控工具的帮助下实现。网…

spring boot 完整后端接口案例

第一章 会员管理项目父模块搭建 1.1 创建模块mengxuegu-member mengxuegu-member 作为所有工程的父工程&#xff0c;用于管理项目的所有依赖。 1.2 添加pom依赖&#xff0c;pom.xml 文件位于&#xff1a;会员管理系统/03-配套资料/pom文件/member-pom.xml <?xml version&…