[安洵杯 2019]crackMe

直接就退出程序了

找到关键函数了,好像用到了 hook

还有一个

嘿嘿,看着就是像 base64 只是 补‘=’改成了‘ ! ’

交叉引用啊,翻到一个应该是最后比较函数

1UTAOIkpyOSWGv/mOYFY4R!!

那一坨对 a1数组的操作没看懂

先总结一下就是 有一个大小写转换,类base64,两两交换位置,1,2,3

先解码得到乱码,估计就是后面两个先,123,132,312,321应该就这四种情况

试了两个没搞出来,烦 0_0 

靠,是对base表进行了大小写转换

看wp感觉自己分析的还是有点问题

这是main函数报红处汇编,扒到一个函数

都是在对字节的操作

就是 a2字节序改变-->v5[0-3] , 对a1异或-->v5[4-35],最后 v5[32-35]取字节-->a3

v5[i] = v5[i+4]^sub_411760(v5[i+1]^v5[i+2]^v5[i+3]^(key+4*i))

 en , y 是 用户输入 ,知道 y , z 就可以求出 x 

那就对 y z 进行交叉引用

对 x   

没有与输入的操作,可以直接动调获取

Handler_0第9行,这里注册了一个UEH函数,看看

在Windows编程中,UEH(Unhandled Exception Handler)通常指未处理异常处理器,处理程序在应用程序发生未处理的异常时执行特定的操作。在Windows中,可以使用 SetUnhandledExceptionFilter 函数来设置未处理异常的处理程序,可以帮助你在未处理的异常发生时更好地调试和维护应用程序。

额,别人的是这样的

(v3 >> (6 * (3 - k))) & 0x3F

(6*(3-k))计算位移量  ,

(v3>>x)&0x3f  -->偏移后结果只取其二进制的低6位

v3 >> (6 * (3 - 1)) = v3 >> 12
v3 = 0x12345678
0x12345678 >> 12 = 0x00012345
0x00012345 & 0x3F = 0x05  // 二进制: 00000101

对Table进行凯撒偏移24位

UEH这个函数返回时eip被修改为sub_121136,去看看,发现了最初比较函数

其实还没完,Hadler_0(对x交叉引用找到的)是如何被调用的,对其交叉引用

是注册了一个VEH函数来调用的

在Windows操作系统中,VEH(Vectored Exception Handling)是一种高级的异常处理机制,允许应用程序注册和管理异常处理程序。VEH提供了一种机制,可以在异常处理的各个阶段(包括未处理异常阶段)插入自定义处理程序。

再后面的 wp 就更有点懵逼了

继续往上面翻,找到了这个

int __cdecl sub_1227B0(int a1, char *String2, int a3)
{DWORD LastError; // eaxDWORD flOldProtect[3]; // [esp+D0h] [ebp-90h] BYREFint (__stdcall *v6[3])(int, int, int, int); // [esp+DCh] [ebp-84h] BYREFLPCVOID lpAddress; // [esp+E8h] [ebp-78h]struct _MEMORY_BASIC_INFORMATION Buffer; // [esp+F4h] [ebp-6Ch] BYREFLPVOID lpBaseAddress; // [esp+118h] [ebp-48h]int v10; // [esp+124h] [ebp-3Ch]char *String1; // [esp+130h] [ebp-30h]int i; // [esp+13Ch] [ebp-24h]int v13; // [esp+148h] [ebp-18h]int v14; // [esp+154h] [ebp-Ch]v14 = a1;v13 = a1 + *(_DWORD *)(a1 + 60) + 24;for ( i = *(_DWORD *)(v13 + 104) + a1; i; i += 20 ){String1 = (char *)GetModuleHandleW(0) + *(_DWORD *)(i + 12);if ( !stricmp(String1, String2) )break;}if ( !i )return 0;v10 = *(_DWORD *)(i + 16) + a1;if ( !v10 )return 0;while ( 1 ){if ( !*(_DWORD *)v10 )return 0;lpBaseAddress = (LPVOID)v10;if ( *(_DWORD *)v10 == a3 )break;v10 += 4;}lpAddress = (LPCVOID)(v10 >> 12 << 12);VirtualQuery(lpAddress, &Buffer, 0x3E8u);VirtualProtect((LPVOID)lpAddress, Buffer.RegionSize, 0x40u, &Buffer.Protect);v6[0] = sub_121023;if ( WriteProcessMemory((HANDLE)0xFFFFFFFF, lpBaseAddress, v6, 4u, 0) ){VirtualProtect(Buffer.BaseAddress, Buffer.RegionSize, Buffer.Protect, flOldProtect);return 1;}else{LastError = GetLastError();printf("%d\n", LastError);return 0;}
}

对里面调用的函数进行符号还原,前面就是找到 user32.dll 对应的 IMAGE_IMPORT_DESCRIPTOR 结构体地址,然后找到 MessageBoxW 对应的 IMAGE_THUNK_DATA 结构体地址,用VirtualProtect修改页属性为可写,用WriteProcessMemory将IMAGE_THUNK_DATA字段覆写为sub_121023函数地址

总结一下,典型的IAT hook,将MessageBoxW的IAT地址替换为了sub_411023的函数地址,该函数完成了VEH的注册

还没完,继续分析这个IAT hook函数是被谁调用的,引用回溯到了rdata这里,往上翻翻

就是sub_121e40继续往上

这个地方被tmainCRTStartup调用了 ?

就是上面那个调用是在tmainCRTStartup里应该

看看tmainCRTStartUp函数,32行这里initterm_e调用了rdata区域里保存的函数,对全局/静态C++类的构造函数进行了初始化

// write access to const memory has been detected, the output may be wrong!
int __tmainCRTStartup()
{int v1; // [esp+18h] [ebp-24h]signed __int32 v2; // [esp+1Ch] [ebp-20h]signed __int32 v3; // [esp+20h] [ebp-1Ch]v2 = *(_DWORD *)(j__NtCurrentTeb() + 4);v1 = 0;while ( 1 ){v3 = _InterlockedCompareExchange(dword_12A6EC, v2, 0);if ( !v3 )break;if ( v3 == v2 ){v1 = 1;break;}}if ( dword_12A6FC == 1 ){j__amsg_exit(31);goto LABEL_13;}if ( dword_12A6FC ){dword_12A2DC = 1;goto LABEL_13;}dword_12A6FC = 1;if ( !j__initterm_e((_PIFV *)&First, (_PIFV *)&Last) ){
LABEL_13:if ( dword_12A6FC == 1 ){j__initterm((_PVFV *)&dword_127000, (_PVFV *)&dword_127208);dword_12A6FC = 2;}if ( dword_12A6FC != 2&& CrtDbgReportW(2,L"f:\\dd\\vctools\\crt\\crtw32\\dllstuff\\crtexe.c",553,0,L"%s",L"__native_startup_state == __initialized") == 1 ){__debugbreak();}if ( !v1 )_InterlockedExchange(dword_12A6EC, 0);if ( dword_12A714 ){if ( j___IsNonwritableInCurrentImage(&dword_12A714) )dword_12A714(0, 2, 0);}CrtSetCheckCount(1);_initenv = envp;main(argc, (const char **)argv, (const char **)envp);}return 255;
}

en, 从结果一步步推导原因,这就很 reverse

上面的分析是根据结果查找原因,倒着推回去的比较乱,下面再梳理总结下

异常处理的注册

  • 程序初始化时,调用链为start->tmainCRTStartUp->initterm_e->IAT hook,修改MessageBoxW函数的IAT表,在主函数中调用MessageBoxW,实际调用的是注册VEH的函数,并对base64编码表进行了变换
  • 在main函数中对SEH进行了注册
  • 在VEH handler中对UEH进行了注册

异常处理的回调

  • 需要知道一个知识点,Windows 用户态异常发生先找调试器,没有再找 VEH,VEH 处理不了再找 SEH, SEH 还处理不了找 UEF

  • main函数中触发内存写异常,本程序各级异常处理的返回状态都是未完成处理,会继续往下级调异常处理函数,所以本程序的调用顺序为VEH->SEH->UEH

  • VEH中对sm4的box进行了初始化

  • SEH中对input进行sm4加密,获得output

  • UEH中对output进行变种的base64加密,获得Str1,并且和变换过的固定字符串Str2进行比较

总之,题目的算法分析和还原很简单,麻烦的是这些算法没有集中在main中,而是分散到了各个异常处理函数里面,跳来跳去的对分析造成了干扰,不过只要足够有耐心,不断向上查找引用,还是能分析完的

https://www.cnblogs.com/z5onk0/p/17506136.html

嗯,也是一道经典的 hook 题了,很多相关知识需要学学。

 被误导了,不是凯撒

import base64
import sm4
table="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
# base表大小写转换
new_table=''
for char in table:tmp=ord(char)if 97<=tmp<=122:new_table+=chr(tmp-32)elif 65<=tmp<=90:new_table+=chr(tmp+32)else:new_table+=char
# base表 %24
table+='='
test=new_table
new_table=new_table[24:]+new_table[:24]+'!'
def kaisha(enc):str=''for char in enc:tmp=ord(char)if 97<=tmp<=122:if tmp+24<=122:str+=chr(tmp+24)else:str+=chr(tmp+24-122+97)elif 65<=tmp<=90:if tmp+24<=90:str+=chr(tmp+24)else:str+=chr(tmp+24-90+65)else:str+=charreturn str
print(new_table)
print(kaisha(test)+'!')str2="1UTAOIkpyOSWGv/mOYFY4R!!"
# 字符串两两交换
str2_swap=''
for i in range(0,len(str2)-1,2):str2_swap+=str2[i+1]+str2[i]# base64解密
b64str=''
for str in str2_swap:b64str+=table[new_table.find(str)]
enflag=base64.b64decode(b64str)# sm4 解密
key=sm4.SM4Key(b"where_are_u_now?")
flag=key.decrypt(enflag)
print(flag)

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

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

相关文章

SpringBoot搭建Eureka注册中心

系列文章目录 文章目录 系列文章目录前言前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 1、Spring-Cloud Euraka介绍 Spring-Cloud Euraka是Spring Cloud集合中一…

Convolutional Occupancy Networks【ECCV2020】

论文&#xff1a;https://arxiv.org/pdf/2003.04618 代码&#xff1a;GitHub - autonomousvision/convolutional_occupancy_networks: [ECCV20] Convolutional Occupancy Networks 图 1&#xff1a;卷积占据网络。传统的隐式模型 (a) 由于其全连接网络结构&#xff0c;表现能力…

继承初级入门复习

注意&#xff1a;保护和私有在类中没有区别&#xff0c;但是在继承中有区别&#xff0c;private在继承的子类不可见&#xff0c;protect在继承的子类可见 记忆方法&#xff1a;先看基类的修饰符是private&#xff0c;那都是不可见的。如果不是&#xff0c;那就用继承的修饰和基…

gstreamer Windows常见问题汇总

需要先安装gstreamer , 再编译opencv。https://gstreamer.freedesktop.org/download/&#xff0c;都需要安装。 OpenCV Error: Unspecified error (The function is not implemented. Rebuild the library with Windows, GTK 2.x or Carbon support. If you are on Ubuntu or D…

肌肤暗沉与胶原蛋白:解锁透亮肌肤的秘密

&#x1f338;亲爱的小仙女们&#xff0c;今天我们来聊聊肌肤暗沉与胶原蛋白之间的神秘联系。你是不是也曾为肌肤的暗沉而烦恼&#xff1f;其实&#xff0c;很多时候&#xff0c;肌肤的暗沉不仅仅是外部因素造成的&#xff0c;更与肌肤内部的胶原蛋白含量密切相关。&#x1f31…

系统架构师-考试-基础题-错题集锦1

系统架构师-考试-基础题-错题集锦 1.当一台服务器出现故障时将业务迁移到另外一台物理服务器上&#xff0c;保障了业务的连续性。 2.面向对象&#xff1a; 实体类&#xff0c;边界类&#xff0c;控制类 3.RUP&#xff1a;UP&#xff0c;统一过程&#xff0c;以架构为中心&am…

LeetCode700二叉搜索树中的搜索

题目描述 给定二叉搜索树&#xff08;BST&#xff09;的根节点 root 和一个整数值 val。你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在&#xff0c;则返回 null 。 解析 最基本的二叉搜索树的应用&#xff0c;递归或者while循环都可以…

分布式数据库HBase入门指南

目录 概述 HBase 的主要特点包括: HBase 的典型应用场景包括: 访问接口 1. Java API: 2. REST API: 3. Thrift API: 4. 其他访问接口: HBase 数据模型 概述 该模型具有以下特点&#xff1a; 1. 面向列: 2. 多维: 3. 稀疏: 数据存储: 数据访问: HBase 的数据模型…

炼丹学习笔记2---ubuntu2004运行3D Gaussian Splatting记录

前言 主要想看看前沿效果&#xff0c;看看跟激光slam出来效果差多少。折腾过程中&#xff0c;务必 根据本地的cuda版本号&#xff0c;安装对应的torch相关东西。 1、拉仓库 git clone https://github.com/graphdeco-inria/gaussian-splatting.git2、创建环境并激活 conda c…

MySQL详细安装、配置过程,多图,详解

本文适合centos7环境下安装mysql&#xff0c;在安装和卸载过程中&#xff0c;都在root用户下完成。文章目录 清理环境获取mysql官方yum源安装mysql yum源安装mysql服务安装报错解决办法验证是否安装完成启动mysql服务登录服务方法一&#xff1a;方法二&#xff1a;方法三&#…

数据意外删除?安卓手机数据恢复教程来帮你解救

手机不仅仅是一个通讯工具&#xff0c;更是我们记录生活、工作、学习等各种信息的重要载体&#xff0c;无论是拍照、录音、录像&#xff0c;还是文字记录&#xff0c;手机都能轻松完成。可有时候我们会不小心删除一些重要的数据&#xff0c;这时候我们该怎么办呢&#xff1f;别…

Modbus-RTU/TCP规约 | 报文解析 | 组织报文与解析报文(C++)

文章目录 一、MODBUS规约1.MODBUS-RTU规约2.MODBUS-TCP规约 二、报文解析1.MODBUS-RTU报文帧解析2.MODBUS-TCP报文帧解析 三、C代码实现组织报文与解析报文 一、MODBUS规约 Modbus规约是一种广泛使用的串行通信协议&#xff08;应用层报文传输协议&#xff09;&#xff0c;用于…

鲲泰新闻丨第七届数字中国建设峰会正式启幕,神州鲲泰携手天翼云共筑智算云生态

2024年5月23日&#xff0c;由国家发展改革委、国家数据局、国家网信办、科技部、国务院国资委、福建省人民政府共同主办的“第七届数字中国建设峰会”在福建省福州市海峡国际会展中心盛大开幕。 数字中国建设峰会是展示数字中国建设成就的盛会&#xff0c;本次峰会以“释放数据…

【MYSQL】分数排名

表: Scores ---------------------- | Column Name | Type | ---------------------- | id | int | | score | decimal | ---------------------- id 是该表的主键&#xff08;有不同值的列&#xff09;。 该表的每一行都包含了一场比赛的分数。Score 是…

草图大师2024怎么保存低版本呢?插件怎么写?

草图大师是一款流行的绘图和设计软件&#xff0c;为了向后兼容&#xff0c;保存低版本文件时&#xff0c;可以采取以下步骤&#xff1a; su模型库 1.另存为旧版本格式&#xff1a; 在保存文件时&#xff0c;草图大师通常会提供一个选项&#xff0c;让你选择要保存的文件格式和…

智简云携手云器Lakehouse打造一体化大数据平台,释放数据价值

导读 本篇分享的是智简云使用云器Lakehouse升级数据平台的实践总结。 智简云&#xff0c;是一家拥有十余年历史的科技公司&#xff0c;专注于企业服务领域&#xff0c;开发了两款核心产品&#xff1a;基于PASS平台的客户关系管理&#xff08;CRM&#xff09;系统和为中小型用…

Go微服务——go-micro v4安装使用

安装go-micro 打开cmd窗口&#xff0c;执行以下命令 go install github.com/go-micro/cli/cmd/go-microlatest测试是否成功安装 go-micro -v创建服务 go-micro new service helloworldwindows 安装make 安装地址 https://gnuwin32.sourceforge.net/packages/make.htm 配置…

springboot集成达梦数据库8,用springboot+mtbatisplus查询值为空

springboot集成达梦数据库8&#xff0c;用springbootmtbatisplus查询值为空 背景&#xff1a;springboot集成达梦数据库8&#xff0c;用springbootmtbatisplus查询值为空&#xff0c;但是在DB管理工具中是可以查询到数据的。 原因及解决方法&#xff1a;执行添加语句后&#xf…

《MySQL怎样运行的》—InnoDB数据页结构

在上一篇文章中我们讲了&#xff0c;InnoDB的数据页是InnoDB管理存储空间的基本单位&#xff0c;一个页的大小基本为16kb 那你有没有疑问&#xff0c;就是说这个InnoDB的数据页的结构是什么样的&#xff0c;还有他这些结构分别有那些功能~接下来我们一一讲解 数据页的总览结构…

Linux笔记之命令行JSON处理器jq

Linux笔记之命令行JSON处理器jq code review! 文章目录 Linux笔记之命令行JSON处理器jq1.安装2.jq 基本用法3.例程3.1. 示例JSON文件3.2. 读取特定字段3.3. 管道过滤器&#xff08;Pipe Filters&#xff09;3.4. 映射过滤器&#xff08;Map Filters&#xff09;3.5. 条件过滤…