BUUCTF-[安洵杯 2019]crackMe1

news2024/12/27 6:45:51

题目下载:下载

这道题涉及到SM4加密和变表base64。

SM4简单了解:SM4算法过程_不是小白才怪的博客-CSDN博客_sm4算法

先运行一下程序,

发现有一个Messagebox,并且内容是hooked。

载入IDA,使用IDA的插件Findcrypt查看有没有什么加密算法。加密算法一般都是关键,在做题前可以养成这个习惯。

 发现有Base64和SM4,跟进base64:

发现对base64表进行了大小写互换,然后调用了MessageBoxA函数(这个再上面执行程序的时候出现过) 。

MessageBox指的是显示一个模态对话框,其中包含一个系统图标、 一组按钮和一个简短的特定于应用程序消息,如状态或错误的信息。消息框中返回一个整数值,该值指示用户单击了哪个按钮。

参数:

int MessageBox(
  [in, optional] HWND    hWnd,
  [in, optional] LPCTSTR lpText,
  [in, optional] LPCTSTR lpCaption,
  [in]           UINT    uType
);

第一个参数:hWnd
该参数是一个窗口句柄,指定该对话框的所有者窗口。如果该参数为空(0/NULL),则该对话框不属于任何窗口。

第二个参数:lpText
该参数是一个字符串,指显示在对话框中的内容。

第三个参数:lpCaption
也是是一个字符串,指对话框的标题。如果此参数为空,则默认使用“错误”作为标题

第四个参数:nType
指定显示按钮的数目及形式,使用的图标样式,缺省按钮是什么以及消息框的强制回应等。

然后下面有AddVectoredExceptionHandler()函数

AddVectoredExceptionHandler(First,Handler):注册向量异常处理程序

参数:

第一个参数:First

应调用处理程序的顺序。 如果参数为非零,则处理程序是第一个要调用的处理程序。 如果参数为零,则处理程序是要调用的最后一个处理程序。

第二个参数:Handler

指向要调用的处理程序的指针。

所以就是当messageboxA后发生异常,触发了 AddVectoredExceptionHandler()函数异常处理,调用了Handler。

跟进Handler:
是SM4加密,密钥是“where_are_u_now?”,正好是128比特,符合sm4长度特征。

跟进sub_411172()看一看里面的SM4加密:

回到sm4加密函数处,有个SetUnhandledExceptionFilter()函数

SetUnhandledExceptionFilter():使应用程序能够取代进程的每个线程的顶级异常处理程序。

调用此函数后,如果在未调试的进程中发生异常,并且异常会将其设置为未处理的异常筛选器,该筛选器将调用 lpTopLevelExceptionFilter 参数指定的异常筛选器函数。

所以发生异常会调用TopLevelExceptionFilter,跟进:

 跟进sub_41126C:

将原来的base64的'='补位变成了'!',并且其中还有一个凯撒移位间接变表。

所以整体逻辑:str1即用户输入经过sm4加密,base64表的大小写互换与移位后的base加密结果与str2两两互换相等。

from pysm4 import decrypt, encrypt
import base64
#sm4密钥
key = "where_are_u_now?"
mk=key.encode().hex()
#str2位置互换
str2='1UTAOIkpyOSWGv/mOYFY4R=='
str2_lst=list(str2)                #字符串不能被修改,
for i in range(0,len(str2),2):
    v2=str2_lst[i]
    str2_lst[i]=str2_lst[i+1]
    str2_lst[i+1]=v2
str2=''.join(str2_lst)
#求base64的变表
base64_table='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
base64_table2=''
for i in base64_table:
    if i.isupper():
        base64_table2+=chr(ord(i)+32)
    elif i.islower():
        base64_table2+=chr(ord(i)-32)
    else:
        base64_table2+=i
base64_table3=''
for i in base64_table2:
    base64_table3+=base64_table2[(base64_table2.index(i)+24)%64]
#base解密
biao=str.maketrans(base64_table3,base64_table)
cipher=base64.b64decode(str2.translate(biao).encode('utf-8'))
cipher=cipher.hex()
#sm4解密
cipher= 0x59d095290df2400614f48d276906874e
mk = 0x77686572655f6172655f755f6e6f773f
flag=decrypt(cipher,mk)
print('flag{'+bytes.fromhex(hex(flag)[2:]).decode()+'}')










 

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

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

相关文章

ChatGPT:“抢走你工作的不会是 AI ,而是先掌握 AI 能力的人”

💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! ChatGPT:“抢走你工作的不会是 AI ,而是先掌握 AI 能力的人” ChatGPT:美国OpenAI 研发的聊天机器人程序,人工智能技术…

Springboot启动过程分析

Springboot启动过程分析 SpringBoot的版本是v3.0.2,下面进行详细的分析。 一、SpringBoot启动流程的主干 示例程序入口如下所示: import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApp…

【网络知识】TCP和UDP详解

TCP和UDP 文章目录UDP协议概述TCP协议概述TCP报文段TCP连接的建立两天内完成下面的参考博客😊点此到文末惊喜↩︎ UDP协议 概述 TCP协议 概述 定义 传输控制协议(TCP,Transmission Control Protocol)是一种传输层通信协议&…

Python 之 Pandas DataFrame 数据类型的简介、创建的列操作

文章目录一、DataFrame 结构简介二、DataFrame 对象创建1. 使用普通列表创建2. 使用嵌套列表创建3 指定数值元素的数据类型为 float4. 字典嵌套列表创建5. 添加自定义的行标签6. 列表嵌套字典创建 DataFrame 对象7. Series 创建 DataFrame 对象三、DataFrame 列操作1. 选取数据…

【LeetCode】剑指 Offer(5)

目录 写在前面: 题目: 题目的接口: 解题思路1: 代码: 过啦!!! 解题思路2: 代码: 过啦!!! 写在最后:…

臻和科技再冲刺港交所上市:近三年亏损14亿元,有股东提前退出

近日,臻和科技集团有限公司(下称“臻和科技”)再次递交招股书,准备在港交所主板上市。据贝多财经了解,这已经是臻和科技第二次冲刺港交所上市。在此之前,臻和科技曾于2022年9月26日递表,后选择了…

hadoop02【尚硅谷】

HDFS 大数据学习笔记 一、HDFS产出背景及定义 HDFS产生背景 随着数据量越来越大,在一个操作系统存不下所有的数据,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,迫切需要一种系统来管理多台机器上的文件&#x…

python基于vue的酒店预约管理平台系统

当用户在上一步中的房间展示界面中点击了房间的图片或者名称之后系统会根据房间的ID自动的跳转到房间的详情页面中来,在房间的详情页面中可以看到房间的图片房间的价格房间的详细介绍房间的类型等内容,当用户登录之后还可以根据需要进行对房间进行预定&a…

Vulnhub靶场之PYLINGTON: 1

1.信息收集 1.输入arp-scan 192.168.239.0/24,探索存活主机,发现主机192.168.239.172存活。 2.对存活主机进行端口扫描,发现22(SSH)、80(Web)端口。 3.访问80端口,在浏览器上输出:http://192.168.239.172。 4.查看…

工具篇3.5世界热力图

一、定义 世界热力图是一种地图形式,它使用颜色的变化来显示世界各个地区的某种指标(如 GDP、人口、气候等)的分布和密度。通常,世界热力图会使用不同的颜色来表示数据的变化,例如使用蓝色表示低值,红色表…

算法leetcode|37. 解数独(rust重拳出击)

文章目录37. 解数独:样例 1:提示:分析:题解:rustgoccpythonjava37. 解数独: 编写一个程序,通过填充空格来解决数独问题。 数独的解法需 遵循如下规则: 数字 1-9 在每一行只能出现…

如何配置git,使其支持多用户

如何配置git,使其支持多用户? 在多数时候, 我们使用git进行操作时,只需要在本地配置一个用户的ssh key,就可以完成基本的pull/push操作。如果现在我有两个github的账号,并需要在一台电脑中操作其中的repo&…

项目管理工具dhtmlxGantt甘特图入门教程(十):服务器端数据集成(下)

这篇文章给大家讲解如何利用dhtmlxGantt在服务器端集成数据。 dhtmlxGantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表,可满足应用程序的所有需求,是完善的甘特图图表库 DhtmlxGantt正版试用下载(qun 764149912)http…

LVGL WIN32模拟器环境搭建

LVGL WIN32模拟器环境搭建LVGL简介环境搭建IDE 选择模拟器代码下载PC模拟器搭建其他配置项说明LVGL简介 LVGL是一个跨平台、轻量级、易于移植的图形库。因其支持大量特性和其易于裁剪,配置开关众多,且版本升级较快,不同版本之间存在一定的差…

基于springboot+vue的医院信息管理系统

基于springbootvue的医院信息管理系统 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景介…

2、登录界面开发

【任务描述】本任务要求使用线性布局以及TextView、EditText、Button等常见控件完成智慧园区登录界面的开发。1、线性布局(LinearLayout)1.1、LinearLayout概述线性布局(LinearLayout)主要以水平或垂直方式来排列界面中的控件。并…

【C++修炼之路】20.手撕红黑树

每一个不曾起舞的日子都是对生命的辜负 红黑树实现:RBTree 前言一.红黑树的概念及性质1.1 红黑树的概念1.2 红黑树的性质二.红黑树的结构2.1 红黑树节点的定义2.2 红黑树类的封装三.红黑树的插入情况1:只变色情况2:变色单旋情况3:双旋插入的代…

Docker入门和安装教程

一、Docker入门简介 Docker 是一个基于GO语言开发的开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。 容器是完全使用沙箱机制,相互之间不会…

关于如何在 Grafana 绘制 Apache Hudi Metrics 仪表盘的教程

文章目录前言下载 Prometheus下载 PushgatewayPrometheus 集成 PushgatewayPushgateway 后台执行Prometheus 后台执行在Prometheus中配置PushgatewayApache Hudi Metrics中开启 Pushgateway 推送Grafana 安装和启动Grafana 新增 Apache Hudi Metrics 仪表盘添加 Prometheus 数据…

批处理删除指定文件或文件夹

声明:1-2节参考了 https://blog.csdn.net/weixin_43960383/article/details/1243673841. DEL1.1 DEL 的命令参数使用 del 命令能指定文件,Del (erase)[Drive:][Path]FileName指删除指定文件。指定要删除的文件或文件集的位置和名称。语法格式如下&#x…