re题(49)BUUCTF-crackMe
BUUCTF在线评测
int wmain()
{FILE *v0; // eaxFILE *v1; // eaxchar v3; // [esp+3h] [ebp-405h]char v4[256]; // [esp+4h] [ebp-404h] BYREFchar Format[256]; // [esp+104h] [ebp-304h] BYREFchar v6[256]; // [esp+204h] [ebp-204h] BYREFchar v7[256]; // [esp+304h] [ebp-104h] BYREFprintf("Come one! Crack Me~~~\n");memset(v7, 0, sizeof(v7)); // 把v7数组重置为0memset(v6, 0, sizeof(v6)); // 把v6数组重置为0while ( 1 ){do{do // 输入用户名{printf("user(6-16 letters or numbers):");scanf("%s", v7);v0 = (FILE *)sub_4024BE();fflush(v0);}while ( !(unsigned __int8)sub_401000(v7) );printf("password(6-16 letters or numbers):");// 输入密码scanf("%s", v6);v1 = (FILE *)sub_4024BE();fflush(v1);}while ( !(unsigned __int8)sub_401000(v6) );sub_401090(v7); // 处理用户名memset(Format, 0, sizeof(Format));memset(v4, 0, sizeof(v4));v3 = ((int (__cdecl *)(char *, char *))loc_4011A0)(Format, v4);if ( (unsigned __int8)sub_401830(v7, v6) ) // 关键:处理用户名和密码{if ( v3 )break;}printf(v4);}printf(Format);return 0;
}
bool __cdecl sub_401830(int a1, const char *a2)
{int v3; // [esp+18h] [ebp-22Ch]int v4; // [esp+1Ch] [ebp-228h]int v5; // [esp+28h] [ebp-21Ch]unsigned int v6; // [esp+30h] [ebp-214h]char v7; // [esp+36h] [ebp-20Eh]char v8; // [esp+37h] [ebp-20Dh]char v9; // [esp+38h] [ebp-20Ch]unsigned __int8 v10; // [esp+39h] [ebp-20Bh]unsigned __int8 v11; // [esp+3Ah] [ebp-20Ah]char v12; // [esp+3Bh] [ebp-209h]int v13; // [esp+3Ch] [ebp-208h] BYREFchar v14; // [esp+40h] [ebp-204h] BYREFchar v15[255]; // [esp+41h] [ebp-203h] BYREFchar v16[256]; // [esp+140h] [ebp-104h] BYREFv4 = 0;v5 = 0;v11 = 0;v10 = 0;memset(v16, 0, sizeof(v16)); // 重置v15v14 = 0;memset(v15, 0, sizeof(v15)); // 重置v16,定义的变量就这两个数组,肯定用来加密密码v9 = 0;v6 = 0;v3 = 0;while ( v6 < strlen(a2) ){if ( isdigit(a2[v6]) ) // 检查字符是否是十进制数字{v8 = a2[v6] - 48; // 把字符变成整数类型}else if ( isxdigit(a2[v6]) ) // 看一个字符是否是十六进制数字{if ( *((_DWORD *)NtCurrentPeb()->ProcessHeap + 3) != 2 )// 这里是反调试操作,如果处于调试状态就会执行if里的赋值操作a2[v6] = 34;v8 = (a2[v6] | 0x20) - 87; // 把字符型变成整形十六进制形式}else{v8 = ((a2[v6] | 0x20) - 97) % 6 + 10; // 其他小写处理后,%6+10}__rdtsc(); // __rdtsc 指令被连续使用两次,但并没有对其返回值进行存储或使用,这种情况可能是为了引入一些延迟,或者是代码在开发过程中用于性能测试__rdtsc();v9 = v8 + 16 * v9; // 作用是把密码中每两个字符转换成整形十六进制存放在v15中if ( !((int)(v6 + 1) % 2) ){v15[v3++ - 1] = v9; // 这个while是生成v15数组,因为整个while只有这里有v15v9 = 0;}++v6;}while ( v5 < 8 ){v10 += byte_416050[++v11];v12 = byte_416050[v11];v7 = byte_416050[v10];byte_416050[v10] = v12;byte_416050[v11] = v7;if ( (NtCurrentPeb()->NtGlobalFlag & 0x70) != 0 )// 同样是反调试v12 = v10 + v11;v16[v5] = byte_416050[(unsigned __int8)(v7 + v12)] ^ v15[v4 - 1];// byte数组和密码经过处理得到的v15数组异或,再赋值给v16数组,意思是v16是加密后的密码if ( (unsigned __int8)*(_DWORD *)&NtCurrentPeb()->BeingDebugged )// 同样反调试{v10 = -83;v11 = 43;}sub_401710(v16, a1, v5++); // 只有这里用到了用户名数组,其他地方都是处理密码,而用户名我们知道,所以不用管v4 = v5;if ( v5 >= (unsigned int)(&v15[strlen(&v14)] - v15) )v4 = 0;}v13 = 0;sub_401470(v16, &v13); // 从这个函数里我们可以知道v16数组的数据return v13 == 0xAB94;
}
所以只要找到byte数组的值就可以了,而byte数组是动态分配的,所以需要动态调试(用OD或者ida本地调试都可以)
那么如何用动态调试找byte数组呢?
首先看ida这个位置的汇编代码
可以看到这个关键的异或操作,而异或操作上面有两个mov操作,ecx里存的就是我们要的byte数组,看看它的地址是00401B3E
这个文件的OEP(入口)是00401000,我们算出xor操作偏移值是00401B3E-00401000=B3E
打开OD,我这里入口是000E1000,可以算出xor操作的地址是000E1000+B3E=000E1B3E
在xor这里右键--断点--切换就下好断点了,如果直接执行我们是得不到正确的byte数组的,因为遗漏了反调试操作,我们需要把if语句里的内容nop掉(不进行任何操作的指令)
用找xor指令位置同样的方法找到三个反调试操作
第一个反调试的位置已经找到,我们把选中的指令nop掉
点用nop填充
填充完是这个效果
其他两个反调试同样操作
nop掉后点运行,或F9快捷方式
输入用户名密码
红框里我们可以看到ecx的值,按F9继续可以得到byte的数据
byte_416050 的值为0x2A, 0xD7, 0x92, 0xE9, 0x53, 0xE2, 0xC4, 0xCD
写个脚本
#include <bits/stdc++.h>
using namespace std;
int a[] = {0x2A, 0xD7, 0x92, 0xE9, 0x53, 0xE2, 0xC4, 0xCD};
string s = "dbappsec";
int main() {for (int i = 0; i < 8; i++) {int num = (int)s[i]; int ans = num ^ (int)a[i]; //异或回去得到原密码cout << hex << ans;}return 0;
}
最后进行 md5 加密,取 32 位小写,得到 flag
flag{d2be2981b84f2a905669995873d6a36c}
相关文章:
re题(49)BUUCTF-crackMe
BUUCTF在线评测 int wmain() {FILE *v0; // eaxFILE *v1; // eaxchar v3; // [esp3h] [ebp-405h]char v4[256]; // [esp4h] [ebp-404h] BYREFchar Format[256]; // [esp104h] [ebp-304h] BYREFchar v6[256]; // [esp204h] [ebp-204h] BYREFchar v7[256]; // [esp304h] [ebp-10…...
Python中的单例模式:深入探索元类与装饰器实现
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 单例模式(Singleton Pattern)是设计模式中的一种重要模式,确保一个类在整个应用中只有一个实例,并且提供全局访问点。Python语言作为一…...
深入解析 Babylon.js 中的 TransformNode.lookAt 方法
在 3D 开发中,控制对象朝向是一个基础但关键的需求。Babylon.js 作为一款强大的 Web3D 引擎,提供了 TransformNode.lookAt 方法来实现这一功能。本文将全面解析这个方法的使用技巧、参数含义以及常见应用场景。 方法基础 TransformNode.lookAt 的基本签…...
SpringCloud组件——Gateway
一.网关 1.问题提出 我们通过Eureka,Nacos解决了服务注册,服务发现的问题,使用SpringCloud LoadBalance解决了负载均衡的问题,使用OpenFeign解决了远程调用的问题。 但是当前所有微服务的接口都是直接对外暴露的,可…...
Boost 库安装 (windows 11)
Boost 库安装 (windows 11 1 下载2 生成3 使用 1 下载 下载地址:https://www.boost.org/ 有的时候会需要历史版本下载: https://www.boost.org/users/history/ 2 生成 1、解压后点击 bootstrap.bat,会生成可执行程序b2.exe 2、双击运行b2.…...
lmms-eval--微调实战笔记
lmms-eval--大模型调用平台,方便新手上手大模型微调 lmms-eval的更多用法,没有mathversehttps://github.com/EleutherAI/lm-evaluation-harness.git 单卡运行,模型gpt-j-6B,数据集hellaswag git clone --depth 1 https://github.com/Eleuthe…...
序列密码算法ShanLooog512设计原理详解
序列密码算法ShanLooog512设计原理详解 ShanLooog512(闪龙512)为序列密码算法,内部状态为512比特,密钥长度为128或256比特,轮函数为FFFFFFFF,循环轮数为24轮,输出密钥流为512比特的状态。与Salsa20类似,内…...
Matplotlib可视化基础
1. 折线图 matplotlib.pyplot.plot() # 主要参数: x,y -- 接收array,表示X轴和Y轴对应的数据,无默认 color -- 接收特定string,指定线条的颜色,默认为None linestyle -- 接收特定string,指定线条的类型…...
Linux 内核网络协议栈中的关键数据结构:inet_skb_parm 与 ip_options
在 Linux 内核的网络协议栈中,数据包的高效处理依赖于一系列精心设计的数据结构。这些结构体不仅需要存储网络数据的元信息,还需支持复杂的协议逻辑(如路由、分片、安全策略等)。本文聚焦两个核心结构体 struct inet_skb_parm 和 struct ip_options,解析它们的设计原理、功…...
oracle 数据库查询指定用户下每个表占用空间的大小,倒序显示
oracle 查询指定用户下每个表占用空间的大小,倒序显示 使用场景:数据分析;导出医院正式库到开发环境时,查询出占用表空间高的业务表、导出时排除该表 在Oracle数据库中,要查询指定用户下每个表占用空间的大小并以倒序…...
Missashe考研日记-day29
Missashe考研日记-day29 1 专业课408 学习时间:3h学习内容: 今天先是把虚拟存储剩余的课听完了,然后就是做课后选择题,57道,已经接受了OS课后题尤其多的事实了。解决并且理解完习题之后就开始预习文件管理的内容&…...
【AI】【MCP】搭建私人王炸MCP自动化工作流
目录 一、什么是MCP 二、MCP大集合 三、准备工作 3.1 安装node.js 3.2 安装vscode 3.3 安装cline插件 3.3.1 安装 3.3.2 配置Cline 四、配置MCP服务 4.1 Search-mcp服务 4.2 playwright-mcp 服务 前言:梦想组合,轻松办公,告别手动&a…...
多元函数微分之传统方法和全微分法
一、传统方法 使用链式法则,先对中间变量(如 u,v)求偏导,再乘以中间变量对最终变量(如 x,y)的偏导。 二、全微分法 基于全微分形式不变性,直接对 zf(u,v) 求全微分 dz,再代入 du 和…...
新手SEO基础优化全解析
内容概要 对于刚接触SEO的新手而言,系统化理解优化逻辑是避免无效操作的关键。本文将从基础概念入手,逐步拆解搜索引擎排名的影响要素,围绕关键词分析、技术优化、内容策略三大核心模块,提供可落地的操作框架。通过结合工具使用说…...
MATLAB退火算法和遗传算法解决旅行商问题
模拟退火算法和遗传算法都是常用于解决旅行商问题(TSP)的优化算法,它们在原理、搜索方式、收敛速度和适用场景等方面存在一些区别: 原理 模拟退火算法:模拟退火算法的灵感来源于固体退火原理。固体在加热后缓慢冷却时…...
喜马拉雅卖身腾讯音乐:在线音频独立时代的终结
坦白说,这条消息一出来,喜马拉雅被卖掉不太奇怪,但是腾讯音乐会收购,还是有点意外。 喜马拉雅之前一度被称为中国版Audible平台,在过去几年里,活生生地把一手好牌打得稀烂。如今走到“卖身”这一步,既是无奈,也是必然。 简单回顾一下背景: 2012年,喜马拉雅成立,一…...
简单理解https与http
都是超文本传输协议,一个安全一个不安全,名字长的安全,名字短的不安全。 安全与不安全是居于什么分别的? 通过加密 http无加密。 httpshttp SSL/TSL(加密)来保障数据安全。加密传输 身份验证 SSL/TLS…...
打造即插即用的企业级云原生平台——KubeSphere 4.1 扩展组件在生产环境的价值全解
目录 打造即插即用的企业级云原生平台——KubeSphere 4.1 扩展组件在生产环境的价值全解 1. 可观测体系:WhizardTelemetry 全家桶 2. 平台与多集群治理 3. CI/CD 与交付效率 4. 网络与流量入口 5. 安全与合规 6. 存储与数据保护 7. 平台集成优势 结语 打造…...
配置扩展ACL
1.扩展ACL简介: 扩展ACL可以更精确地控制基于源IP地址、目标IP地址、协议类型和端口号的流量。 2.配置背景: 为了实现公司内部只能使用FTP服务器传输文件并关闭其他所有服务和端口的需求,可以通过配置访问控制列表(ACL…...
根据用户出生日期计算年龄
public static int calculateAgeFromDate(Date birthDate) { // 将 Date 转换为 LocalDate(默认时区) LocalDate birthLocalDate birthDate.toInstant() .atZone(ZoneId.systemDefault()) .toLocalDate(); // 获取当前日期LocalDate currentDate Local…...
测试基础笔记第十五天
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、集合1.集合的定义二、使用集合列表去重 导包二、函数1.函数介绍2.定义函数3.调用函数4.函数实现登录案例5.函数的返回值 三、模块和包1.模块的概念(Module)2.模…...
【专题四】前缀和(3)
📝前言说明: 本专栏主要记录本人的基础算法学习以及LeetCode刷题记录,按专题划分每题主要记录:(1)本人解法 本人屎山代码;(2)优质解法 优质代码;ÿ…...
STM32 USB配置详解
STM32 USB配置详解 一、USB基础概念 1.1 USB简介 USB (Universal Serial Bus) 是一种用于计算机与外部设备连接的串行总线标准,具有热插拔、即插即用等特点。STM32微控制器内置了多种USB接口,可实现各类USB应用。 1.2 USB速度等级 Low Speed (LS): …...
2025年Mapbox零基础入门教程(1)地图初始化
什么是mapbox? mapbox是一个地图框架,不仅提供前端渲染能力,还具备后端服务接口能力。 相较于openlayers,它可构建二维和三维地图,并支持优化导航路线和位置查询等功能。 开发中使用mapbox需引入库文件并设置token&…...
课外知识:你需要了解的Python类对象里面的__getattr__方法
你需要了解的Python类对象中的__getattr__方法 一、__getattr__基础概念 1. 方法定义 def __getattr__(self, name: str) -> Any:"""当访问不存在的属性时触发"""2. 核心特性 动态属性处理:拦截未定义的属性访问按需触发&…...
openGauss新特性 | DataKit支持PostgreSQL到openGauss的迁移能力
Postgresql-\>openGauss迁移工具debezium-connector-postgres 可获得性 本特性自openGauss 7.0.0-RC1版本开始引入。 特性简介 debezium-connector-postgres工具是一个基于Java语言的Postgresql到openGauss的复制工具。该工具提供了初始全量数据及对象(视图、…...
【前端】跟进新趋势- PWA WebAssembly
不定期更新及补充实战。建议关注收藏点赞。 目录 PWA(渐进式 Web 应用,Progressive Web App)WebAssembly(WASM) PWA(渐进式 Web 应用,Progressive Web App) PWA 是一种提升 Web 应用…...
C++学习:六个月从基础到就业——模板编程:SFINAE原则
C学习:六个月从基础到就业——模板编程:SFINAE原则 本文是我C学习之旅系列的第三十六篇技术文章,也是第二阶段"C进阶特性"的第十四篇,主要介绍C模板编程中的SFINAE原则。查看完整系列目录了解更多内容。 目录 C学习之…...
完美解决.NET Framework 4.0 中 System.Drawing 库不支持 WebP 格式的图像处理
如果你想在 .NET Framework 4.0 中使用 ImageMagick 处理图片,可以通过 Magick.NET 库来实现。Magick.NET 是 ImageMagick 的 .NET 封装,可以用来读取、写入、编辑图像。 以下是如何使用 Magick.NET 来处理图像并提取图像的宽度和高度。 步骤ÿ…...
网络基础概念:从菜鸟到入门
前言:快递小哥的故事 想象一下你要给朋友寄个礼物,这个过程其实和网络通信非常相似: 1. 你需要知道朋友的”地址“(IP地址) 2. 要注明是送到他家大门还是物业代收(端口号) 3. 要选择快递公司并…...
优先队列和单调队列(双端队列实现的)
这里写自定义目录标题 一、优先队列与单调队列二、优先队列2.1 概念2.2 增删查 判空2.3 示例代码 三、双端队列四、单调队列4.1 单调递增队列4.2 单调递减队列 一、优先队列与单调队列 二、优先队列 2.1 概念 一种特殊的队列,它与普通队列的主要区别在于元素的出…...
设计模式(状态模式)
概述 在实际的软件开发中,状态模式并不是很常用,但是在能够用到的场景里,它可以发挥很大的作用。从这一点上来看,它有点像我们之前讲到的组合模式。 状态模式一般用来实现状态机,而状态机常用在游戏、工作流引擎等系统…...
安卓基础(get和set)
在 Java 中,get 和 set 方法是面向对象编程中 封装(Encapsulation) 的核心实现,用于安全地访问和修改类的私有字段(private 成员变量)。它们的核心作用是 控制对数据的访问,…...
机器人灵巧操作新突破,力感知技术让机械手更精准
在机器人的发展历程中,让机器人实现灵活操作一直是科研人员努力攻克的难题。 我们这篇文章给大家带来一份新的工作:DexForce 链接:[2501.10356] DexForce: Extracting Force-informed Actions from Kinesthetic Demonstrations for Dextero…...
八大排序——直接插入排序/希尔排序
八大排序——直接插入排序/希尔排序 目录 一、直接插入排序 二、希尔排序 一、直接插入排序 每一趟从待排序序列中取第一个值,将其插入到已排序好的序列中,对已排序好的序列,从右到左依次和待插入值比较,如果大于则向后挪&…...
8、HTTPD服务--ab压力测试
一、ab压力测试 # ab ‐c 100 ‐n 1000 http://vedio.linux.com/index.html 2 This is ApacheBench, Version 2.3 <$Revision: 1430300 $> 3 Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ 4 Licensed to The Apache Software Foundation,…...
node.js 实战——mongoDB
MongoDB MongoDB 简介 MongoDB 是一种基于文档型 (document-oriented) 的 NoSQL 数据库,使用类 JSON 的 BSON 格式存储数据,自然支持复杂数据结构。它特别适合需要快速变化、大量数据处理和高应用扩展性的场景。 MongoDB 特性: 无法表、无…...
C语言学习路线
以下是一份综合多个优质资源的C语言学习路线规划,结合2025年最新技术趋势和工程实践需求,分为三个阶段系统推进: 一、入门阶段(1-2个月) 目标:掌握基础语法,能编写简单程序ÿ…...
飞凌嵌入式T527核心板获得【OpenHarmony生态产品兼容性证书】
近日,飞凌嵌入式FET527-C核心板通过OpenHarmony 4.1 Release版本兼容测评,获得【OpenHarmony生态产品兼容性证书】。 飞凌嵌入式FET527-C核心板搭载全志T527系列全国产高性能处理器,集成8个ARM Cortex-A55核心,并内置RISC-V核和DS…...
Mioty|采用报文分割(Telegram Splitting)以提高抗干扰能力的无线通信技术
1、什么是Mioty 在物联网(IoT)快速发展的背景下,低功耗广域网(LPWAN)技术成为连接海量设备的关键。LPWAN具有低功耗、低成本、广覆盖和强抗干扰能力等特点,使其特别适用于大规模、远距离、低数据速率的IoT…...
WPF 程序监控硬件设备状态变化的实现方案
以下是一个完整的 C# WPF 程序实现方案,用于监控硬件设备状态变化(基于设备 SDK API)。我们将分步骤实现,包含状态轮询、事件通知、UI 绑定和错误处理。 1. 项目结构设计 HardwareMonitor/ ├── Models/ # 数据模…...
利用Python打印有符号十进制数的二进制原码、反码、补码
有时候手动计算有符号十进制数的二进制原码、反码、补码是一件挺麻烦的事情。 下面是一个段Python 代码,它可以接收一个 16 位有符号十进制数的输入,然后输出其对应的二进制原码、反码和补码: def decimal_to_binary(decimal_num):# 检查输入…...
STM32裸机编程架构与思路
STM32作为广泛应用的微控制器系列,其强大的功能和灵活的编程方式使其成为嵌入式系统开发的优选。裸机编程(bare-metal programming)指的是在没有操作系统支持的情况下,直接对硬件进行编程。这种方式虽然较为底层,但能够…...
Eureka 深度解析:从原理到部署的全场景实践
一、Eureka 核心原理与架构设计 1. 核心定位与组件模型 Eureka 是 Netflix 开源的服务发现(Service Discovery)组件,作为 Spring Cloud 微服务体系的核心基础设施,其核心目标是解决分布式系统中服务实例动态管理与跨服务通信解耦…...
有哪些和PPT自动生成有关的MCP项目?
随着AI技术的快速发展, Model Context Protocol(MCP) 作为一种连接大型语言模型(LLMs)与外部工具的开放协议,正在重塑自动化办公领域。在PPT自动生成场景中,MCP通过标准化接口实现了AI模型与设计工具、数据源的无缝整合。以下从技术框架、项目案例、应用场景三个维度展开…...
经典数仓架构深度解析与演进:从离线处理到新型架构对比
经典数仓架构深度解析与演进:从离线处理到新型架构对比 在数据驱动决策的时代,经典数仓作为企业数据管理与分析的核心基础设施,承载着从数据存储到价值挖掘的重要使命。本文将深入剖析经典数仓的架构、数据处理流程、主流架构模式及其对比&a…...
[Python开发] 如何用 VSCode 编写和管理 Python 项目(从 PyCharm 转向)
在 Python 开发领域,PyCharm 一直是广受欢迎的 IDE,但其远程开发功能(如远程 SSH 调试)仅在付费版中提供。为了适应服务器部署需求,很多开发者开始将目光转向更加轻量、灵活且免费扩展能力强的 VSCode。本篇文章将详细介绍,从 PyCharm 转向 VSCode 后,如何高效搭建和管理…...
系统架构-架构评估
质量属性 性能 指系统的响应能力 指标:响应时间、吞吐量等。 设计策略:优先级队列、增加计算资源、减少计算开销、引入并发机制、采用资源调度 可靠性 在意外或错误使用的情况下维持软件系统的功能特性 指标:MTTF、MTBF、MTTR 设计策…...
使用 MQTT - C 访问 IoTDA 平台:一个完整的嵌入式示例
引言 在物联网(IoT)开发领域,设备与平台之间的通信至关重要。MQTT 作为一种轻量级的消息传输协议,因其高效、可靠的特性,在物联网场景中得到了广泛应用。华为的 IoTDA(IoT Device Access)平台为…...
Leetcode594.最长和谐子序列
目录 题目算法标签: 滑动窗口, 哈希表思路滑动窗口代码哈希表代码 题目 594. 最长和谐子序列 算法标签: 滑动窗口, 哈希表 思路 先将数组进行排序, 检查两个相邻的但是不相等的数字的差值是否是 1 1 1, 如果是 1 1 1更新答案 滑动窗口代码 #include <algorithm> #i…...