SHCTF2023 山河CTF Reverse方向[Week1]全WP 详解

文章目录

  • [WEEK1]ez_asm
  • [WEEK1]easy_re
  • [WEEK1]seed
  • [WEEK1]signin
  • [WEEK1]easy_math
  • [WEEK1]ez_apk

[WEEK1]ez_asm

在这里插入图片描述
从上往下读,第一处是xor 1Eh,第二处是sub 0Ah;逆向一下先加0A后异或1E
写个EXP

data = "nhuo[M`7mc7uhc$7midgbTf`7`$7%#ubf7 ci5Y"
result = ''for char in data:xor_value = (ord(char)+0x0A) ^ 0x1Eresult += chr(xor_value)print(result.encode('utf-8').decode('unicode_escape'))

flag{It_is_als0_impor@nt_t0_13arn_4sm!}

[WEEK1]easy_re

在这里插入图片描述
对输入的Str做一个for循环处理,再与des比较
取出des中的数据,逆向一下;

# 已知的des数组
des = [ 0x66, 0xC6, 0x16, 0x76, 0xB7, 0x45, 0x27, 0x97, 0xF5, 0x47,0x03, 0xF5, 0x37, 0x03, 0xC6, 0x67, 0x33, 0xF5, 0x47, 0x86,0x56, 0xF5, 0x26, 0x96, 0xE6, 0x16, 0x27, 0x97, 0xF5, 0x07,0x27, 0x03, 0x26, 0xC6, 0x33, 0xD6, 0xD7]# 创建一个空列表来存储计算得到的Str
Str = []# 逆向计算Str
for value in des:# 首先计算右移4位,然后按位或上16倍的值Str_value = (value >> 4) | (16 * value)# 将计算得到的值添加到Str列表中Str.append(hex(Str_value))# 打印计算得到的Str
print(Str)
Str=['0x666', '0xc6c', '0x161', '0x767', '0xb7b', '0x454', '0x272', '0x979', '0xf5f', '0x474', '0x30', '0xf5f', '0x373', '0x30', '0xc6c', '0x676', '0x333', '0xf5f', '0x474', '0x868', '0x565', '0xf5f', '0x262', '0x969', '0xe6e', '0x161', '0x272', '0x979', '0xf5f', '0x70', '0x272', '0x30', '0x262', '0xc6c', '0x333', '0xd6d', '0xd7d']

再做一下处理,因为这里可以发现66是f,6c是l,61是a;这样就可以推测取俩位是flag

# 提取每个元素的后两位字符(十六进制字符)
enflag= [s[-2:] for s in Str]
# 转换每个十六进制字符为ASCII字符
flag = [chr(int(hex_str, 16)) for hex_str in enflag]# 使用join()方法将ASCII字符合并成一个字符串
result = ''.join(flag)# 打印合并后的字符串
print(result)

flag{Try_t0_s0lv3_the_binary_pr0bl3m}

[WEEK1]seed

在这里插入图片描述
查壳 64bit无壳 用ida64打开
在这里插入图片描述
逻辑很清晰,随机数生成存到v5里面,与输入的v6依次异或,然后和des比较;逆向一下就是用des里面的数据和随机数异或就可以了;都知道,rand()实际上是伪随机数,这里我们用动态调试就可以看到。
在这里插入图片描述
随便下个断点,只要在rand后就好,这里就是了。

enc = [0x26, 0x45, 0x49, 0x8E, 0xB9, 0x43, 0xCD, 0x9B, 0xFA, 0x0C]
des = [64, 41, 40, 233, 194, 4, 164, 237, 159, 83, 95, 117, 60, 209, 205, 43, 168, 196, 137, 105, 21, 33, 22, 239, 215,39, 146, 223, 202, 83, 95, 42, 60, 209, 206, 3, 163, 239, 165, 120, 22, 26, 45, 225, 196]# 创建一个空列表来存储计算得到的ASCII字符
result = []for i in range(len(des)):result.append(chr(des[i] ^ enc[i % 10]))  # 使用chr()将整数转为ASCII字符# 使用join()方法将ASCII字符合并成一个字符串
output = ''.join(result)# 打印合并后的ASCII字符串
print(output)
# flag{Give_y0u_the_se3d_and_D0_you_w@nt_t0_do}

[WEEK1]signin

在这里插入图片描述
在这里插入图片描述
ida打开后 flag{flag1sinarray}

[WEEK1]easy_math

py文件打开

在这里插入图片描述
源代码的解释一下:将输入的长度为42的flag分为长度为7的六个十六进制;这六个十六进制满足下列条件;这里可以用Z3约束求解得出六个数,再转换成ascii就🆗了;

Z3约束不懂得骨骼一下;学习;

exp:

from z3 import *v = Real('v')
w = Real('w')
x = Real('x')
y = Real('y')
z = Real('z')
c = Real('c')
s = Solver()s.add(593*v + 997*w + 811*x + 258*y + 829*z + 532*c == 0x5b8e0aef71d34ff43)
s.add(605*v + 686*w + 328*x + 602*y + 695*z + 576*c == 0x551a262360964ef7f)
s.add(373*v + 512*w + 449*x + 756*y + 448*z + 580*c == 0x49d158a5657d6931c)
s.add(560*v + 635*w + 422*x + 971*y + 855*z + 597*c == 0x625568d5abbabf4f3)
s.add(717*v + 507*w + 388*x + 925*y + 324*z + 524*c == 0x50ee0c025e70e3c23)
s.add(312*v + 368*w + 884*x + 518*y + 495*z + 414*c == 0x40e735f8aa2815f65)
result = []
if s.check() == sat:result = s.model()
print(result)
# 这里输出得result顺序不对所以修改了一下,得到下面得enc
enc = [28829613228248624, 26827458353261422, 13642136288051316, 29378135513658469, 32192963475959391, 30791965425607037]
enc1 = []
flag = []
for i in range(6):enc1.append(hex(enc[i])[2:])for j in range(0,14,2):flag.append(enc1[i][j:j+2])print(flag)
print("".join([chr(int(hex_str,16))for hex_str in flag]))
# flag{N0_One_kn0ws_m@th_B3tter_Th@n_me!!!!}

[WEEK1]ez_apk

在这里插入图片描述

用JEB(其他apk反编译工具应该也可以)打开,先看MainActivity,
在这里插入图片描述
这里获取我们的输入,也就是input_1控件的内容,然后用“encrypt.encode”方法对其进行编码,将结果存储进s中,最后和字符串“ ”比较,相等就输出flag正确;

在这里插入图片描述
看到上面有一个字符串,留意一下;下面就是encode。encode中还调用了一个divmod来将256进制转化为58进制的数,这里encode和divmod就是一个base58编码的过程;

还有一种判断方法,base58的特征:相比Base64,Base58不使用数字"0",字母大写"O",字母大写"I",和字母小写"l",以及"+“和”/"符号,最主要的是后面不会出现’=’。观察一下可以发现,无论是码表还是编码后的内容都没有这些特征值,这样也可以判断Base58编码;

在这里插入图片描述

编码网站:cyberchef

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java JVM垃圾回收确定垃圾的两种方式,GC Root

文章目录 前言一、如何确定是垃圾?引用计数法根可达路径法 二、GC Root1、以下可作为GC Root对象2、判断可回收:GC Root不可达3、真正宣告对象死亡需经过两次标记过程(重要) 前言 对于Java两种确定对象为可回收的两种方式&#x…

2023年中国特种运输现状及市场格局分析[图]

特种运输是使用特殊车辆、方案,将特种货物转移至需求地的过程。相对于常规货物,特种货物在本身特性(危险品、鲜活货物)、价值(贵重物品)、体积(超大货物)、重量(超重货物…

概念解析 | 动态非线性系统 VS 非线性系统 VS 线性系统

KaTeX parse error: \newcommand{\blue} attempting to redefine \blue; use \renewcommand 注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:动态非线性系统 VS 非线性系统 VS 线性系统。 概念解析 | 动态非线性系统 VS 非线性…

腾讯云国际-如何使用对象存储COS在 CKafka 控制台创建数据异步拉取任务?腾讯云代充

操作场景 Datahub 支持接入各种数据源产生的不同类型的数据,统一管理,再分发给下游的离线/在线处理平台,构建清晰的数据通道。 本文以 COS 数据为例介绍如何在 CKafka 控制台创建数据异步拉取任务,并对任务进行修改配置&#xf…

睿思BI实现3D地图飞线图

在3D地图上实现飞线图,效果如下: 演示地址https://www.ruisitech.com/rsbi-ultimate/#/bigscreen/ShareView?token5e52c81d5fc44eada37f5ec38cbb5bf2 睿思BI基于webgl技术开发,作为基础图表的补充,包含一些展示形态新颖或展示效果…

ArcGIS Maps SDK for JS:隐藏地图边框

文章目录 1 问题描述2 解决方案 1 问题描述 近期,将ArcGIS Api for JS v4.16更新到了ArcGIS Maps SDK for JS v4.27,原本去除地图的css代码失效了。 v4.26及以前版本 ,需要用.esri-view-surface--inset-outline:focus::after 控制边框属性。…

Springmvc 讲解(1)

文章目录 前言一、SpringMvc1、简介2、核心组件和调用流程2.1 涉及组件的理解 3、小案例快速体验3.1场景需求3.1.1 导入依赖3.1.2 controller声明3.1.3 核心配置类3.1.4 环境搭建3.1.6 配置tomcat3.1.7 测试 二、SpringMvc 接收参数1.路径设置注解2、param接收参数四种类型2.1 …

什么是 CNN? 卷积神经网络? 怎么用 CNN 进行分类?(2)

参考视频:https://www.youtube.com/watch?vE5Z7FQp7AQQ&listPLuhqtP7jdD8CD6rOWy20INGM44kULvrHu 视频4:CNN 中 stride 的概念 如上图,stride 其实就是 ”步伐“ 的概念。 默认情况下,滑动窗口一次移动一步。而当 stride …

增强常见问题解答搜索引擎:在 Elasticsearch 中利用 KNN 的力量

在快速准确的信息检索至关重要的时代,开发强大的搜索引擎至关重要。 随着大型语言模型和信息检索架构(如 RAG)的出现,在现代软件系统中利用文本表示(向量/嵌入)和向量数据库已变得越来越流行。 在本文中&am…

PCL setCameraPosition 参数讲解

setCameraPosition 的原型如下void setCameraPosition (double pos_x, double pos_y, double pos_z,double view_x, double view_y, double view_z,double up_x, double up_y, double up_z, int viewport 0);pos_x pos_y pos_z为相机所在的位置view_x view_y view_z 是焦点所…

3D RPG Course | Core 学习日记二:PolyBrush / Pro Builder构建场景

前言 我们这次将要学习的是使用PolyBrush和Pro Buillder构建精美的游戏场景。 PolyBrush 在Package Manager中导入的时候要注意,将Shader Examples(URP)也一起导入,不然PolyBrush对URP渲染的素材进行操作时会出现问题。 导入完成之后在Tools里将…

什么是Immutable.js?它的作用是什么?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

医学手术麻醉临床信息系统源码

手术麻醉临床信息系统遵循“以病人为中心、服务于临床”的宗旨,使医护人员从繁琐的病历书写中解放出来,集中精力关注病人的诊疗,将更多的时间用于分析、诊断。以服务围术期临床业务工作的开展为核心,为医护人员、业务管理人员、院…

吴恩达《机器学习》2-5->2-7:梯度下降算法与理解

一、梯度下降算法 梯度下降算法的目标是通过反复迭代来更新模型参数,以便最小化代价函数。代价函数通常用于衡量模型的性能,我们希望找到使代价函数最小的参数值。这个过程通常分为以下几个步骤: 初始化参数: 随机或设定初始参数…

不定长顺序表3

六.判空函数 刚刚忘记参数判断了 七.查找函数——在顺序表PS中 查找第一个key值,找到返回key值的下标,没有找到返回-1 不管能否扩容,查找都是在有效数据内部查找,所以可以把定长顺序表的查找Search函数搬过来 测试也跟定长的一样…

MyBatis-Plus 实战教程三 拓展插件

文章目录 扩展功能代码生成安装插件使用 静态工具逻辑删除通用枚举定义枚举配置枚举处理器测试 JSON类型处理器定义实体使用类型处理器 仓库地址 扩展功能 代码生成 在使用MybatisPlus以后,基础的Mapper、Service、PO代码相对固定,重复编写也比较麻烦。…

openpnp - src - 配置文件载入过程的初步分析

文章目录 openpnp - src - 配置文件载入过程的初步分析概述笔记自己编译用的git版本报错截图问题1 - 怎么在调试状态下, 定位到抛异常的第一现场?结合单步调试找到的现场, 来分析报错的原因openpnp配置文件读取的流程END openpnp - src - 配置文件载入过程的初步分析 概述 从…

工厂模式(Factory)

简单工厂模式 简单工厂模式又叫静态工厂模式,顾名思义,它是用来实例化目标类的静态类。下面我主要通过一个简单的实例说明简单工厂及其优点。 工厂方法模式 工厂方法模式和简单工厂模式在结构上的不同是很明显的。工厂方法模式的核心是一个抽象工厂类…

npm : 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。

1 bug描述 使用vscode执行npm run dev指令时出现 “npm : 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次 “ 的错误提示,原因是系统里没有安装n…

【机器学习】loss损失讨论

大纲 验证集loss上升,准确率也上升(即将overfitting?)训练集loss一定为要为0吗 Q1. 验证集loss上升,准确率也上升 随着置信度的增加,一小部分点的预测结果是错误的(log lik 给出了指数级的惩…