buuctf 逆向 findkey wp

首先看看怎么个事

点开也就这样了,没有输入的点,感觉和之前的 “刮开有奖” 有一点点相像

winmain长这个样子

看到消息循环了,下一步肯定就是找回调函数了

乍一看还没有,函数一个个点进去看发现sub_401023(hInstance),一直点进去看,一直到遇到这个

这就是注册窗口的过程,可以看到回调函数是 sub_401014

 但是点进去发现JUMPOUT,那肯定要尝试修复一波

 

非常简单,甚至没有花指令,直接创建函数即可

修复好后长这样

LRESULT __stdcall sub_401640(HWND hWndParent, UINT Msg, WPARAM wParam, LPARAM lParam)
{int v5; // eaxsize_t v6; // eaxDWORD v7; // eaxint v8; // eaxint v9; // eaxint v10; // [esp+4Ch] [ebp-400h]UINT v11; // [esp+50h] [ebp-3FCh]CHAR v12[256]; // [esp+54h] [ebp-3F8h] BYREFchar v13[7]; // [esp+154h] [ebp-2F8h] BYREF__int16 v14; // [esp+15Bh] [ebp-2F1h]char v15; // [esp+15Dh] [ebp-2EFh]char Str[253]; // [esp+160h] [ebp-2ECh] BYREF__int16 v17; // [esp+25Dh] [ebp-1EFh]char v18; // [esp+25Fh] [ebp-1EDh]CHAR v19[256]; // [esp+260h] [ebp-1ECh] BYREFCHAR String[4]; // [esp+360h] [ebp-ECh] BYREFint v21; // [esp+364h] [ebp-E8h]__int16 v22; // [esp+368h] [ebp-E4h]CHAR Text[32]; // [esp+36Ch] [ebp-E0h] BYREFstruct tagRECT Rect; // [esp+38Ch] [ebp-C0h] BYREFCHAR Buffer[100]; // [esp+39Ch] [ebp-B0h] BYREFHDC hdc; // [esp+400h] [ebp-4Ch]struct tagPAINTSTRUCT Paint; // [esp+404h] [ebp-48h] BYREFint v28; // [esp+444h] [ebp-8h]int v29; // [esp+448h] [ebp-4h]LoadStringA(hInstance, 0x6Au, Buffer, 100);v11 = Msg;if ( Msg > 0x111 ){if ( v11 == 517 ){if ( strlen((const char *)String1) > 6 )ExitProcess(0);if ( strlen((const char *)String1) ){memset(v19, 0, sizeof(v19));v6 = strlen((const char *)String1);memcpy(v19, String1, v6);v7 = strlen((const char *)String1);sub_40101E(String1, v7, (LPSTR)String1);strcpy(Str, "0kk`d1a`55k222k2a776jbfgd`06cjjb");memset(&Str[33], 0, 0xDCu);v17 = 0;v18 = 0;strcpy(v13, "SS");*(_DWORD *)&v13[3] = 0;v14 = 0;v15 = 0;v8 = strlen(Str);sub_401005(v13, (int)Str, v8);if ( _strcmpi((const char *)String1, Str) ){SetWindowTextA(hWndParent, "flag{}");MessageBoxA(hWndParent, "Are you kidding me?", "^_^", 0);ExitProcess(0);}memcpy(v12, &unk_423030, 0x32u);v9 = strlen(v12);sub_401005(v19, (int)v12, v9);MessageBoxA(hWndParent, v12, 0, 0x32u);}++dword_428D54;}else{if ( v11 != 520 )return DefWindowProcA(hWndParent, Msg, wParam, lParam);if ( dword_428D54 == 16 ){strcpy(String, "ctf");v21 = 0;v22 = 0;SetWindowTextA(hWndParent, String);strcpy(Text, "Are you kidding me?");MessageBoxA(hWndParent, Text, Buffer, 0);}++dword_428D54;}}else{switch ( v11 ){case 0x111u:v29 = (unsigned __int16)wParam;v28 = HIWORD(wParam);v10 = (unsigned __int16)wParam;if ( (unsigned __int16)wParam == 104 ){DialogBoxParamA(hInstance, (LPCSTR)0x67, hWndParent, (DLGPROC)DialogFunc, 0);}else{if ( v10 != 105 )return DefWindowProcA(hWndParent, Msg, wParam, lParam);DestroyWindow(hWndParent);}break;case 2u:PostQuitMessage(0);break;case 0xFu:hdc = BeginPaint(hWndParent, &Paint);GetClientRect(hWndParent, &Rect);v5 = strlen(Buffer);DrawTextA(hdc, Buffer, v5, &Rect, 1u);EndPaint(hWndParent, &Paint);break;default:return DefWindowProcA(hWndParent, Msg, wParam, lParam);}}return 0;
}

分析一波,大致逻辑是,当消息编号大于0x111时

右键会校验String(实际上是没有地方给我们输入String的,需要我们手动的去改String的值)。如果String值校验不对, ++dword_428D54;

其他大于0x111的消息也会使得 ++dword_428D54;到十六次后会触发messagebox(没啥用)

然后就是一些基本控件的指令了。所见即所得就不说了

我们主要观察的代码是这段

if ( Msg > 0x111 )
if ( Msg > 0x111 ){if ( v11 == 517 ){if ( strlen((const char *)String1) > 6 )ExitProcess(0);if ( strlen((const char *)String1) ){memset(v19, 0, sizeof(v19));v6 = strlen((const char *)String1);memcpy(v19, String1, v6);v7 = strlen((const char *)String1);sub_40101E(String1, v7, (LPSTR)String1);strcpy(Str, "0kk`d1a`55k222k2a776jbfgd`06cjjb");memset(&Str[33], 0, 0xDCu);v17 = 0;v18 = 0;strcpy(v13, "SS");*(_DWORD *)&v13[3] = 0;v14 = 0;v15 = 0;v8 = strlen(Str);sub_401005(v13, (int)Str, v8);if ( _strcmpi((const char *)String1, Str) ){SetWindowTextA(hWndParent, "flag{}");MessageBoxA(hWndParent, "Are you kidding me?", "^_^", 0);ExitProcess(0);}memcpy(v12, &unk_423030, 0x32u);v9 = strlen(v12);sub_401005(v19, (int)v12, v9);MessageBoxA(hWndParent, v12, 0, 0x32u);}++dword_428D54;}

 String1会进入一个哈希加密

int __cdecl sub_4013A0(BYTE *pbData, DWORD dwDataLen, LPSTR lpString1)
{DWORD i; // [esp+4Ch] [ebp-24h]CHAR String2[4]; // [esp+50h] [ebp-20h] BYREFBYTE v6[16]; // [esp+54h] [ebp-1Ch] BYREFDWORD pdwDataLen; // [esp+64h] [ebp-Ch] BYREFHCRYPTHASH phHash; // [esp+68h] [ebp-8h] BYREFHCRYPTPROV phProv; // [esp+6Ch] [ebp-4h] BYREFif ( !CryptAcquireContextA(&phProv, 0, 0, 1u, 0xF0000000) )return 0;if ( CryptCreateHash(phProv, 0x8003u, 0, 0, &phHash) ){if ( CryptHashData(phHash, pbData, dwDataLen, 0) ){CryptGetHashParam(phHash, 2u, v6, &pdwDataLen, 0);*lpString1 = 0;for ( i = 0; i < pdwDataLen; ++i ){wsprintfA(String2, "%02X", v6[i]);lstrcatA(lpString1, String2);}CryptDestroyHash(phHash);CryptReleaseContext(phProv, 0);return 1;}else{CryptDestroyHash(phHash);CryptReleaseContext(phProv, 0);return 0;}}else{CryptReleaseContext(phProv, 0);return 0;}
}

加密完后去和Str比较,若相等,则输出flag

CryptCreateHash 函数的参数包括:

  • hProv:加密服务提供者的句柄。

  • Algid:指定要使用的哈希算法的 ALG_ID 值。

  • hKey:如果哈希算法是带密钥的,则传入密钥的句柄;否则为0。

  • dwFlags:标志位,通常为0。

  • phHash:指向新创建的哈希对象句柄的指针。

CryptHashData 函数的参数包括:

  • hHash:哈希对象的句柄。

  • pbData:指向要进行哈希处理的数据的指针。

  • dwDataLen:要进行哈希处理的数据的长度。

  • dwFlags:标志位,通常为0。

CryptGetHashParam 函数的参数包括:

  • hHash:哈希对象的句柄。

  • dwParam:指定要获取的哈希参数。

  • pbData:指向存储参数数据的缓冲区的指针。

  • pdwDataLen:指向存储参数数据长度的变量的指针。

  • dwFlags:标志位,通常为0。

[in] dwParam

查询类型。 此参数可以设置为以下查询之一。

展开表

含义
HP_ALGID哈希算法一个ALG_ID,指示创建哈希对象时指定的算法。 有关哈希算法的列表,请参阅 CryptCreateHash。
HP_HASHSIZE哈希值大小指示哈希值中的字节数的 DWORD 值。 此值将因哈希算法而异。 应用程序必须在HP_HASHVAL值之前检索此值,以便分配正确的内存量。
HP_HASHVAL哈希值hHash 指定的哈希对象的哈希值或消息哈希。 此值基于前面通过 CryptHashData 和 CryptHashSessionKey 函数提供给哈希对象的数据生成。CryptGetHashParam 函数完成哈希。 调用 CryptGetHashParam 后,无法向哈希添加更多数据。 对 CryptHashData 或 CryptHashSessionKey 的其他调用失败。 使用哈希完成应用程序后,应调用 CryptDestroyHash 来销毁哈希对象。

HP_ALGID 的值是 0x0001,HP_HASHSIZE 的值是 0x0004,HP_HASHVAL 的值是 0x0002

把Str拖出来,找个在线MD5网站解码 其实哈希是不能解码的,但是可以用穷举,先正向加密,和密文对比

 

再次启动动态调试,将String1改为 123321 即可

 

解决

flag{n0_Zu0_b0_die}  

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

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

相关文章

RK3399平台入门到精通系列讲解(实验篇)IO 多路复用实验之poll实验

🚀返回总目录 文章目录 一、IO 多路复用:poll介绍二、实验源码2.1、Makefile2.2、poll 实验驱动2.3、poll 驱动测试应用程序一、IO 多路复用:poll介绍 IO 多路复用是一种同步的 IO 模型。IO 多路复用可以实现一个进程监视多个文件描述符。 一旦某个文件描述符准备就绪,就通…

几种读nii图像方法的轴序比较

读 .nii / .nii.gz 图像并转成 numpy 可用 medpy.io、nibabel、itk、SimpleITK 几种方法&#xff0c;然而几种方法读出来的轴序有出入&#xff0c;本篇比较此几种方法。 Datum 所用数据来自 verse&#xff0c;经 iTomxy/data/verse/preprocess.py 预处理&#xff0c;朝向和轴…

【普中开发板】基于51单片机的篮球计分器液晶LCD1602显示( proteus仿真+程序+设计报告+讲解视频)

基于普中开发板51单片机的篮球计分器液晶LCD1602显示 1.主要功能&#xff1a;讲解视频&#xff1a;2.仿真3. 程序代码4. 设计报告5. 设计资料内容清单&&下载链接资料下载链接&#xff08;可点击&#xff09;&#xff1a; 基于51单片机的篮球计分器液晶LCD1602显示 ( pr…

不使用Pycharm专业版也可以创建Django项目

何为django? Django 是一个开源的高级Web应用程序框架,用于使用 Python 构建强大、可扩展和安全的 Web 应用程序。它遵循了 MVC(Model-View-Controller)的设计模式,并提供了一套丰富的工具和库,帮助开发人员更快速、更高效地构建 Web 应用程序。 实现细节 1.安装Pytho…

交换机03_基本配置

一、思科设备的命令行基础 1、进入设备的命令行界面 设备支持命令行 去查看设备上的接口&#xff0c;是否有console口需要有console线 右击此电脑设备管理器需要通过超级终端软件进行连接&#xff0c;如putt、secret CRT、xshell等软件 &#xff08;1&#xff09;思科模拟器…

居然在Web上就可以体验下苹果电脑的操作系统啦?

发现一款宝藏项目 MacOS &#xff0c;在Web上打造一款原汁原味的 MacOS系统&#xff0c;不同于以外的仿操作系统的web应用&#xff0c;该应用底层基于 HTML5的 FileSystem 和 IndexedDB 构建了文件系统&#xff0c;理论上可以基于这套系统实现任何的上层应用。作者还制定了可以…

D50|单调栈

739.每日温度 初始思路&#xff1a; 暴力解法但是会超时。 class Solution {public int[] dailyTemperatures(int[] temperatures) {int[] answer new int[temperatures.length];for(int i 0;i<temperatures.length;i){for(int j i;j<temperatures.length;j){if(te…

VMWare安装Ubuntu

1.下载地址&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/22.04/ 此处记录一些重要的截图&#xff0c;主要是按照史上最全最新Ubuntu20.04安装教程&#xff08;图文&#xff09;进行 安装完成之后&#xff0c;进行清华源配置&#xff0c;参考&#xff1…

二维码门牌管理系统:让生活更便捷

文章目录 前言一、数字化管理解决多居住地管理难题二、多功能服务提升生活便利性三、加强小区安全保障 前言 在现代社会的快节奏生活中&#xff0c;管理多个居住地成为许多人的现实。而频繁切换不同小区可能给人们的生活带来不便。二维码门牌管理系统应运而生&#xff0c;通过…

chromium在中文用户名下无法编译的问题

新电脑没有太注意&#xff0c;起用户名的时候用了中文。 在编译chromium104的代码时&#xff0c;因为环境变量有中文导致编译失败&#xff1a; 因为我的电脑默认是使用gbk编码&#xff0c;而不是utf-8编码。 这个问题有三种解决办法&#xff1a; &#xff08;一&#xff09;把…

三段式电流保护与自动重合闸MATLAB仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 前加速、后加速的区别&#xff1a; 前加速是保护装置不判别是永久性故障还是瞬时故障&#xff0c;直接跳闸&#xff0c;然后经重合闸装置来纠正&#xff1b;后加速是保护装置是先判别故障类型有选择性跳闸 …

【智慧地球】星图地球 | 星图地球超算数据工场

当前空天信息处理涉及并发并行的大量计算问题&#xff0c;需要高性能计算、智能计算联合调度&#xff0c;以此来实现多算力融合&#xff1b;而我国算力产业规模快速增长&#xff0c;超算算力资源正需要以任务驱动来统筹。 基于此&#xff0c;中科星图与郑州中心展开紧密合作&a…