Splendid_MineCraft

题目标题就已经暗示这题是SMC了(self-modifying code)。

工具:exeinfo,x32dbg和IDA7.0

先丢进exeinfo里查看相关信息:

用IDA打开:

根据可以字符串“Wrong!\n”直接锁定sub_401080为main函数。

int sub_401080()
{
char *v0; // eax
char *v1; // eax
char *v2; // ST28_4
signed int i; // [esp+14h] [ebp-54h]
int v5; // [esp+20h] [ebp-48h]
char Str1; // [esp+24h] [ebp-44h]
char v7; // [esp+3Dh] [ebp-2Bh]
int v8; // [esp+44h] [ebp-24h]
__int16 v9; // [esp+48h] [ebp-20h]
char v10[4]; // [esp+4Ch] [ebp-1Ch]
__int16 v11; // [esp+50h] [ebp-18h]
int v12; // [esp+54h] [ebp-14h]
__int16 v13; // [esp+58h] [ebp-10h]
int v14; // [esp+5Ch] [ebp-Ch]
__int16 v15; // [esp+60h] [ebp-8h] sub_401020((const char *)&unk_404118, (unsigned int)"Welcome to ACTF_Splendid_MineCraft!");
sub_401050((const char *)&unk_40411C, (unsigned int)&Str1);
if ( strlen(&Str1) == 26 )
{
if ( !strncmp(&Str1, "ACTF{", 5u) && v7 == 125 )
{
v7 = 0;
v0 = strtok(&Str1, "_");
v12 = *(_DWORD *)(v0 + 5);
v13 = *(_WORD *)(v0 + 9);
v14 = *(_DWORD *)(v0 + 5);
v15 = *(_WORD *)(v0 + 9);
v1 = strtok(0, "_");
v8 = *(_DWORD *)v1;
v9 = *((_WORD *)v1 + 2);
v2 = strtok(0, "_");
*(_DWORD *)v10 = *(_DWORD *)v2;
v11 = *((_WORD *)v2 + 2);
dword_403354 = (int)dword_4051D8;
if ( ((int (__cdecl *)(int *))dword_4051D8[0])(&v12) )
{
v5 = SBYTE2(v14) ^ SHIBYTE(v15) ^ (char)v14 ^ SHIBYTE(v14) ^ SBYTE1(v14) ^ (char)v15;
for ( i = 256; i < 496; ++i )
byte_405018[i] ^= v5;
JUMPOUT(__CS__, &byte_405018[256]);
}
sub_401020("Wrong\n");
}
else
{
sub_401020("Wrong\n");
}
}
else
{
sub_401020("Wrong\n");
}
return 0;
}

由三个strtok函数可知,flag{}里的内容应该是被_分成了三个部分,根据输入长度猜测每个部分应该是6字节长(这三个部分我们分别称为flag_sec1,flag_sec2和flag_sec3)。

flag_sec1

因为是SMC基本上确定是要动态调试的,所以大致了解一下main函数的结构,就丢进x32dbg里开始调试。

先搜索字符串,直接进入main函数:

到call CB1050时调试会卡住,说明程序此时正在等待输入,于是我们可以得到:

先随便输入一个flag:ACTF{123456_ABCDEF_abcdef}

我们向下浏览会发现有三个strtok()函数,如图

正好与IDA反编译的结果相吻合,所以这三个函数后面应该是对flag内容的比较。

在最后一个strtok()函数后面打个断点,直接跳过中间的内容,然后进行单步调试,直到进入这个call。

进入call后会发现很多奇怪的指令,这才进入到我们这篇WP真正的主题:SMC

一步一步F7调试,会发现随着如下循环的进行,奇怪的汇编指令也会被改变:

跳过SMC循环继续调试,会发现又有一个大循环:

经过一遍又一遍的调试,会发现里面的三条关键指令:

异或和求和的过程中并没有用到我们的输入,结果都储存到ss:[ebp+eax-20]里,直接运行完follow in dump:

这就是上面循环得到的结果。

阅读循环可知:00CB5332的cmp edx,ecx就是比较用户输入和flag的过程。

flag_sec1 = yOu0y*

flag_sec2

这段也是SMC,修改后面jmp EAX里面的代码。

重新调试,输入flag_sec1正确的字符串继续调试。没啥好说的,知道调试到jmp eax:

一进去就遇到个循环,但是这个循环非常诡异,因为中间有多余代码,其实不断的调试就会发现,中间的多余代码是会被修改的!这其实就是SMC,但是本该是数据却被x32dbg识别成了代码而已,通过

右键->Analysis->Treat from section as byte就可以将其转化为数据了,如下图:

这个循环只是把用户输入的flag_sec2保存到了这个区域里(ABCDEF对应着41-46)。

后面有个循环:

(一边F7一边查看dump窗口。不好意思没看出来有啥用,估计是烟雾弹)

其实就是EAX[flag_sec2[i]^(0x83+i)] == EAX[EDI+166]

flag_sec2 = knowo3

flag_sec3

题目里直接明文strcmp,

flag_sec3 = 5mcsM<

综上:flag{yOu0y*_knowo3_5mcsM<}

buuoj[ACTF_Junior_2020]Splendid_MineCraft WriteUp的更多相关文章

  1. 2016第七季极客大挑战Writeup

    第一次接触CTF,只会做杂项和一点点Web题--因为时间比较仓促,写的比较简略.以后再写下工具使用什么的. 纯新手,啥都不会.处于瑟瑟发抖的状态. 一.MISC 1.签到题 直接填入题目所给的SYC{ ...

  2. ISCC2016 WriteUp

    日期: 2016-05-01~ 注:隔了好久才发布这篇文章,还有两道Pwn的题没放,过一阵子放上.刚开始做这个题,后来恰巧赶上校内CTF比赛,就把重心放在了那个上面. 这是第一次做类似于CTF的题,在 ...

  3. 参加 Tokyo Westerns / MMA CTF 2nd 2016 经验与感悟 TWCTF 2016 WriteUp

    洒家近期参加了 Tokyo Westerns / MMA CTF 2nd 2016(TWCTF) 比赛,不得不说国际赛的玩法比国内赛更有玩头,有的题给洒家一种一看就知道怎么做,但是做出来还需要洒家拍一 ...

  4. 爱春秋之戏说春秋 Writeup

    爱春秋之戏说春秋 Writeup 第一关 图穷匕见 这一关关键是给了一个图片,将图片下载到本地后,打开以及查看属性均无任何发现,尝试把图片转换为.txt格式.在文本的最后发现这样一串有规律的代码: 形 ...

  5. 《安全智库》:48H急速夺旗大战通关writeup(通关策略)

    作者:ByStudent   题目名字 题目分值 地址 MallBuilder2 350 mall.anquanbao.com.cn MallBuilder1 200 mall.anquanbao.c ...

  6. iscc2016 pwn部分writeup

    一.pwn1 简单的32位栈溢出,定位溢出点后即可写exp gdb-peda$ r Starting program: /usr/iscc/pwn1 C'mon pwn me : AAA%AAsAAB ...

  7. We Chall-Training: Encodings I -Writeup

    MarkdownPad Document html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,ab ...

  8. We Chall-Encodings: URL -Writeup

    MarkdownPad Document html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,ab ...

  9. We Chall-Training: ASCII—Writeup

    MarkdownPad Document html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,ab ...

随机推荐

  1. netty字符串流分包

    @Override protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf in, List<Obj ...

  2. chrome插件: yapi 接口TypeScript代码生成器

    前言 2020-09-12 天气晴,蓝天白云,微风,甚好. 前端Jser一枚,在公司的电脑前,浏览器打开着yapi的接口文档,那密密麻麻的接口数据,要一个一个的去敲打成为TypeScript的inte ...

  3. .NET Core加解密实战系列之——使用BouncyCastle制作p12(.pfx)数字证书

    简介 加解密现状,编写此系列文章的背景: 需要考虑系统环境兼容性问题(Linux.Windows) 语言互通问题(如C#.Java等)(加解密本质上没有语言之分,所以原则上不存在互通性问题) 网上资料 ...

  4. Processing 网格(棋盘格)无限偏移纹理动画

    过火 再度出击!这次我们要玩得更火一点---把静帧变动画.没错,将棋盘格动起来!看一下效果: 这是一个经典的无限偏移动画,在很多2d横版射击游戏中都会采用的技术.如何在Processing中实现,有两 ...

  5. 故意使用free掉的内存的一个实验( 常量区/栈)

    故意使用free掉的内存的一个实验 考虑一下两种声明 struct stuff{ char home[10]; int num; char name[10]; }; struct stuff{ cha ...

  6. 【网络协议】TCP/IP:数据链路层

    物理层负责把计算机中的0.1数字信号转换为具体传输媒介的物理信号(电压的高低.电波的强弱.光的闪灭) 数据链路层协议定义了(通过通信介质互连的设备间的)数据传输规范 (常见的通信介质有同轴电缆.双绞线 ...

  7. Layman 使用ffmpeg-php扩展库实现视频截图(默认图)

    这几天做项目,其中一个需求是用户上传视频文件到服务器,然后服务器自动截取该视频的一帧作为该视频对应的缩略图,服务器端语言采用php编写,找了半天资料,发现ffmpeg-php可以满足该需求,所以下面简 ...

  8. arduino中驱动 步进电机

    参考:https://www.arduino.cn/thread-75936-1-1.html 知识点:    步进电机是一种将电脉冲转化为角位移的执行机构.通俗一点讲:当步进驱动器接收到一个脉冲信号 ...

  9. Jmeter5.3源码编译

    下载源码 https://jmeter.apache.org/download_jmeter.cgi 配置网络环境(重要) 下载 Proxifier 配置上网条件 导入Idea 通过 Idea 的 O ...

  10. DX12龙书 00 - 环境配置:通过 Visual Studio 2019 运行示例项目

    0x00 安装 Visual Studio 2019 安装 Visual Studio 2019 以及相关组件. 注:安装组件时带的 Windows 10 SDK 可以在 Individual com ...