【CTF Reverse】XCTF GFSJ1101 Mine- Writeup(反编译+动态调试+Base58编码)

Mine-

运气怎么这么差?


原理

Base58

Base58是用于比特币(Bitcoin)中使用的一种独特的编码方式,主要用于产生Bitcoin的钱包地址。

相比Base64,Base58不使用数字"0",字母大写"O",字母大写"I",和字母小写"l",以及"+“和”/"符号。

比特币的Base58字母表:

123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz

工具

  • Base58编码/解码:http://www.atoolbox.net/Tool.php?Id=932
  • Base58在线编码、Base58解码、在线Base58check编码、Base58check解码:http://web.chacuo.net/charsetbase58

解法

一个扫雷游戏,输入坐标翻开,坐标用空格隔开。

没走两步就爆了。

拉进 DIE 分析。无壳。

导入 IDA。

按 F5 反编译。

int __fastcall main(int argc, const char **argv, const char **envp)
{unsigned int v3; // eaxstd::ostream *v4; // raxstd::ostream *v5; // rax_BYTE *v6; // raxstd::istream *v7; // raxstd::ostream *v8; // raxstd::ostream *v9; // raxstd::ostream *v10; // raxstd::ostream *v11; // raxint v13; // [rsp+28h] [rbp-58h]int v14; // [rsp+2Ch] [rbp-54h]int v15; // [rsp+30h] [rbp-50h]unsigned int v16; // [rsp+34h] [rbp-4Ch]unsigned int v17; // [rsp+38h] [rbp-48h]int v18; // [rsp+3Ch] [rbp-44h]int v19; // [rsp+40h] [rbp-40h]int i3; // [rsp+44h] [rbp-3Ch]int i2; // [rsp+48h] [rbp-38h]int i1; // [rsp+4Ch] [rbp-34h]int nn; // [rsp+50h] [rbp-30h]int i4; // [rsp+54h] [rbp-2Ch]int mm; // [rsp+58h] [rbp-28h]int kk; // [rsp+5Ch] [rbp-24h]int jj; // [rsp+60h] [rbp-20h]int ii; // [rsp+64h] [rbp-1Ch]int n; // [rsp+68h] [rbp-18h]int m; // [rsp+6Ch] [rbp-14h]int k; // [rsp+70h] [rbp-10h]int v32; // [rsp+74h] [rbp-Ch]int j; // [rsp+78h] [rbp-8h]int i; // [rsp+7Ch] [rbp-4h]_main();memset(grid, 0, 0x190ui64);memset(randMark, 0, sizeof(randMark));memset(vis, 0, sizeof(vis));for ( i = 0; i <= 9; ++i ){for ( j = 0; j <= 9; ++j )showUs[100 * i + j] = 42;}v3 = time(0i64);srand(v3);v32 = 0;do{v19 = rand() % 10;v18 = rand() % 10;if ( randMark[100 * v19 + v18] != 1 ){randMark[100 * v19 + v18] = 1;++v32;}}while ( v32 != mine_sum );res = 0;for ( k = 0; k <= 9; ++k ){for ( m = 0; m <= 9; ++m ){if ( randMark[100 * k + m] )grid[10 * k + m] = -1;}}for ( n = 0; n <= 9; ++n ){for ( ii = 0; ii <= 9; ++ii ){if ( grid[10 * n + ii] != -1 ){for ( jj = 0; jj <= 7; ++jj ){v17 = *((_DWORD *)&dir + 2 * jj) + n;v16 = dword_475044[2 * jj] + ii;if ( v17 <= 9 && v16 <= 9 && grid[10 * v17 + v16] == -1 )++grid[10 * n + ii];}}}}for ( kk = 0; kk <= 9; ++kk ){for ( mm = 0; mm <= 9; ++mm ){v4 = (std::ostream *)std::operator<<<std::char_traits<char>>(refptr__ZSt4cout,(unsigned int)showUs[100 * kk + mm]);std::operator<<<std::char_traits<char>>(v4, " ");}refptr__ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_(refptr__ZSt4cout);}
LABEL_40:v5 = (std::ostream *)std::operator<<<std::char_traits<char>>(refptr__ZSt4cout, asc_48B002);refptr__ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_(v5);while ( 100 - mine_sum != res ){v7 = (std::istream *)std::istream::operator>>(refptr__ZSt3cin);std::istream::operator>>(v7);if ( grid[10 * v14 + v13] == -1 ){v8 = (std::ostream *)std::operator<<<std::char_traits<char>>(refptr__ZSt4cout, asc_48B01D);refptr__ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_(v8);goto LABEL_67;}if ( !vis[100 * v14 + v13] && grid[10 * v14 + v13] > 0 ){++res;vis[100 * v14 + v13] = 1;showUs[100 * v14 + v13] = LOBYTE(grid[10 * v14 + v13]) + 48;system("cls");for ( nn = 0; nn <= 9; ++nn ){for ( i1 = 0; i1 <= 9; ++i1 ){v9 = (std::ostream *)std::operator<<<std::char_traits<char>>(refptr__ZSt4cout,(unsigned int)showUs[100 * nn + i1]);std::operator<<<std::char_traits<char>>(v9, " ");}refptr__ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_(refptr__ZSt4cout);}goto LABEL_40;}if ( !vis[100 * v14 + v13] && !grid[10 * v14 + v13] ){bfs(v14, v13);system("cls");for ( i2 = 0; i2 <= 9; ++i2 ){for ( i3 = 0; i3 <= 9; ++i3 ){v10 = (std::ostream *)std::operator<<<std::char_traits<char>>(refptr__ZSt4cout,(unsigned int)showUs[100 * i2 + i3]);std::operator<<<std::char_traits<char>>(v10, " ");}refptr__ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_(refptr__ZSt4cout);}v11 = (std::ostream *)std::operator<<<std::char_traits<char>>(refptr__ZSt4cout, asc_48B002);refptr__ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_(v11);}}v15 = std::string::length((std::string *)&ans);for ( i4 = 0; i4 < v15; ++i4 ){v6 = (_BYTE *)std::string::operator[](&ans, i4);std::operator<<<std::char_traits<char>>(refptr__ZSt4cout, (unsigned int)(char)((v15 - i4) ^ *v6));}refptr__ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_(refptr__ZSt4cout);
LABEL_67:system("pause");return 0;
}

没看到有字符串常量。

按 Shift + F12 打开 Strings 窗口,发现中文字符串。

追踪其位置。发现这个字符数组的标识符为 asc_48B002。

回到 main 函数,搜索 asc_48B002 找到这行。推测这段是 C++ 的 cout。

      v11 = (std::ostream *)std::operator<<<std::char_traits<char>>(refptr__ZSt4cout, asc_48B002);

这段找到变量 ans,可能是 flag。

  v15 = std::string::length((std::string *)&ans);for ( i4 = 0; i4 < v15; ++i4 ){v6 = (_BYTE *)std::string::operator[](&ans, i4);std::operator<<<std::char_traits<char>>(refptr__ZSt4cout, (unsigned int)(char)((v15 - i4) ^ *v6));}refptr__ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_(refptr__ZSt4cout);

但是 ans 里面没有内容。

分析反编译伪代码可知,ans 在 while 循环结束后输出。找到 while 循环位置为 401ED2。

用 x64dbg 打开,Ctrl + G 跳转到 0000000000401ED2。

用 NOP 填充,跳出 while 循环。

运行程序,直接输出一段编码,应该是 ans。

7ii3VecVgof3r6ssiP2g7E3HqwqhM

提交 flag,错误。

可能是 base64 编码,用 base64 解码器解码,解码失败。

用 base58 解码器解码,解码失败。

看了大佬的 Writeup。因为有些解码器 base58 字母表的大写字母在小写字母前面:

123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz

另一些解码器 base58 字母表的大写字母在小写字母后面:

123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ

ans 采用的是大写字母在前面的字母表。换了另一个解码器,解码成功,得到 flag。

Flag

flag{h4pp4-M1n3-G4m3}

PS

我的理解是,标题可能一语双关。根据有道词典的解释:

minepron.
我的;<英,非正式>我的家
n.
矿,矿井;地雷,水雷;宝库,源泉;<>炸药坑道
v.
采(煤等矿物);布雷,用雷炸毁(车辆);寻找(某事物中)蕴含的价值;在(地下)挖洞(或坑道);挖掘(数据);挖矿(获取加密货币的勘探方式)

mine 有地雷的意思,指扫雷游戏,又有挖矿的意思,暗示了比特币钱包地址所使用的 base58 编码。

参考资料

  • https://dict.youdao.com/result?word=mine&lang=en

声明

本博客上发布的所有关于网络攻防技术的文章,仅用于教育和研究目的。所有涉及到的实验操作都在虚拟机或者专门设计的靶机上进行,并且严格遵守了相关法律法规

博主坚决反对任何形式的非法黑客行为,包括但不限于未经授权的访问、攻击或破坏他人的计算机系统。博主强烈建议每位读者在学习网络攻防技术时,必须遵守法律法规不得用于任何非法目的。对于因使用这些技术而导致的任何后果,博主不承担任何责任

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

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

相关文章

想要监控电脑?这十款电脑监控软件推荐!

在选择电脑监控软件时&#xff0c;重要的是要明确你的监控目的&#xff0c;并确保所选软件符合法律法规和道德标准。以下是我为你推荐的十款电脑监控软件&#xff0c;它们各自具有不同的特点和功能&#xff0c;适用于不同的场景和需求&#xff1a; 1.安企神&#xff1a; 作为…

从混乱到清晰!借助Kimi掌握螺旋型论文结构的秘诀!

AIPaperGPT&#xff0c;论文写作神器~ https://www.aipapergpt.com/ 写学术论文有时会让人感到头疼&#xff0c;特别是在组织结构和理清思路时&#xff0c;往往觉得无从下手。 其实&#xff0c;找到合适的结构不仅能帮你清晰地表达研究成果&#xff0c;还能让你的论文更有说…

数据建模无法满足复杂业务需求?别慌,数据开发平台可以完美互补!

前言 数据可视化建模无论是对于企业的数字化转型&#xff0c;还是对数据资源的价值开发来说&#xff0c;都是至关重要的工具&#xff0c;小兵在前文《数据可视化建模平台介绍》。中有详细介绍过他的能力&#xff0c;包括面向多源异构的企业数据&#xff0c;为企业提供数据集成…

PCL 读取txt格式点云并可视化

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇总&#xff08;长期更新&#xff09; 一、概述 1.1原理 TXT格式的点云文…

4.5 pandas 实战 分析抖音播放数据(1)

课程目标 基于pandas对抖音播放数据做数据分析 数据准备 点此去下载 课程内容 导包 import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns plt.rcParams["font.family"] "SimHei" plt.rcParams["ax…

焦化行业的变革力量:智能巡检机器人

根据相关数据&#xff0c;2024年1-2月份&#xff0c;焦炭产量为8039.5万吨&#xff0c;同比增长2.1%&#xff0c;这表明&#xff0c;我国焦化行业仍是全球最大的焦炭生产国和消费国&#xff0c;其市场规模占据了重要地位。焦化企业主要集中在山西省&#xff0c;其合计焦炭产能约…

c++的decltype关键字

它可以将变量声明为表达式指定的类型

Hash入门

unordered_set void test_unordered_set() {unordered_set<int> us;us.insert(4);us.insert(2);us.insert(1);us.insert(5);us.insert(6);us.insert(2);us.insert(2);//去重unordered_set<int>::iterator it us.begin();while (it ! us.end()){cout << *it…

MyBatis-Plus代码一键生成

官网地址&#xff1a;MyBatis-Plus &#x1f680; 为简化开发而生 开始&#xff1a; 添加依赖&#xff1a; <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.5.7</version&g…

IMS 在线计费 IMS 离线计费

目录 1. IMS 在线计费 1.1 主要内容 1.2 IMS 在线计费架构 ​编辑1.3 IMS 在线计费方案 1.4 IMS 在线计费的关键步骤 1.5 在线计费的基本流程 1.6 IMS Information AVP 2. IMS 离线计费 2.1 IMS 离线计费架构 2.2 IMS 离线计费概述 2.3 什么时候 AS 给 CG 发送 ACR?…

独立站技能树/工具箱1.0 总纲篇丨出海笔记

正所谓要把一件事做到90分很难&#xff0c;但做到60分基本上照着SOP做到位都没问题&#xff0c;如果我们能把每件事都做到60分&#xff0c;那绝对比至少60%的人都强&#xff0c;除非你的对手不讲武德——那就是他很可能看了我这篇文章&#xff0c;不但每方面都超过及格线&#…

油耳拿什么清理比较好?比较推荐哪种可视耳勺

相信很多小伙伴都有挖耳朵方面的困扰&#xff0c;尤其是油性耳朵的人&#xff0c;用棉签掏耳朵时感觉越掏越往里去&#xff0c;而使用普通耳勺又因为材质过硬&#xff0c;在使用过程中容易刮伤耳道。于是市面上出现了可视挖耳勺&#xff0c;让人们可以在看得见的情况下取出耳道…

解决novnc1.2.0不能使用剪切板的问题

1.下载资源文件asciidef.js,在rfb.js中引入 2.修改rfb.js中clipboardPasteFrom方法如下 clipboardPasteFrom(text) {if (this._rfbConnectionState !== connected || this._viewOnly) {return; }if (this._clipboardServerCapabilitiesFormats[extendedClipboardFormatText] &…

MT6765/MT6762(R/D/M)/MT6761(MT8766)安卓核心板参数比较_MTK联发科4G智能模块

联发科Helio P35 MT6765安卓核心板 MediaTek Helio P35 MT6765是智能手机的主流ARM SoC&#xff0c;于2018年末推出。它在两个集群中集成了8个ARM Cortex-A53内核&#xff08;big.LITTLE&#xff09;。四个性能内核的频率高达2.3GHz。集成显卡为PowerVR GE8320&#xff0c;频率…

研发企业的源代码防泄密秘籍:一机两用的沙盒电脑

在数字化时代&#xff0c;数据安全已成为企业最关注的问题之一。尤其是对于研发密集型企业&#xff0c;源代码的安全更是核心资产。SDC沙盒&#xff0c;正是为了应对这一挑战而设计的先进数据防泄密解决方案。 全面保护&#xff0c;从源头开始 SDC沙盒采用独特的代码级安全设…

python线程(python threading模块、python多线程)(守护线程与非守护线程)

文章目录 Python多线程入门1. Python多线程概述2. threading模块基础- Thread 类: 这是一个代表线程的类。可以通过创建Thread类的实例来新建一个线程。- Lock 类: 在多线程环境中&#xff0c;为了防止数据错乱&#xff0c;通常需要用到锁机制。Lock类提供了基本的锁功能&#…

如日中天的AI大模型,也到了发展幻灭期!

近期 Gartner发布了《新兴技术成熟度曲线》&#xff0c;其中生成式 AI &#xff08;GenAI&#xff09; 正式进入到了幻灭期。 2018 年 6 月&#xff0c;OpenAI发布GPT-1模型&#xff0c;生成式AI开始向产品化发展。 到2022年的GPT-3.5发布&#xff0c;并且ChatGPT首次向公众推…

企业微信-前往服务商后台页面对接解决方案

序 我会告诉你在哪里点我会告诉你在哪里配置点下去他只返回auth_code的&#xff0c;我怎么登录 正文 他是在这个位置 是这样&#xff0c;应用授权安装第三方应用后&#xff0c;企业微信&#xff08;管理员角色&#xff09;是可以从pc端企业后台点第三方应用的。 如果我没记…

【qt】一个WPS项目了解qt界面设计的基本套路

项目功能演示: 放心食用!最后有完整代码. 超级详细,期待您的一个点赞❥(^_-) 一览全局: WPS项目目录 一.创建项目二.导入资源三.ui设计四.字号选择框初始化五.滚动条初始化六.添加自定义文本类七.初始化action状态八.新建文档九.打开文件十.保存与另存为十一.打印/打印预览十…

QT设置git仓库

笔者最近想写一个qt的程序&#xff0c;想要把这个代码推送到github上。 前提是电脑已安装了git、QT 以下是设置步骤&#xff1a; 1.设置QT中关于git的配置 打开QT&#xff0c;点击工具-》选项-》版本控制-》填写PATH 这个PATH是你安装git的绝对路径&#xff0c;如果你不记得…