buuoj[ACTF_Junior_2020]Splendid_MineCraft WriteUp
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的更多相关文章
- 2016第七季极客大挑战Writeup
第一次接触CTF,只会做杂项和一点点Web题--因为时间比较仓促,写的比较简略.以后再写下工具使用什么的. 纯新手,啥都不会.处于瑟瑟发抖的状态. 一.MISC 1.签到题 直接填入题目所给的SYC{ ...
- ISCC2016 WriteUp
日期: 2016-05-01~ 注:隔了好久才发布这篇文章,还有两道Pwn的题没放,过一阵子放上.刚开始做这个题,后来恰巧赶上校内CTF比赛,就把重心放在了那个上面. 这是第一次做类似于CTF的题,在 ...
- 参加 Tokyo Westerns / MMA CTF 2nd 2016 经验与感悟 TWCTF 2016 WriteUp
洒家近期参加了 Tokyo Westerns / MMA CTF 2nd 2016(TWCTF) 比赛,不得不说国际赛的玩法比国内赛更有玩头,有的题给洒家一种一看就知道怎么做,但是做出来还需要洒家拍一 ...
- 爱春秋之戏说春秋 Writeup
爱春秋之戏说春秋 Writeup 第一关 图穷匕见 这一关关键是给了一个图片,将图片下载到本地后,打开以及查看属性均无任何发现,尝试把图片转换为.txt格式.在文本的最后发现这样一串有规律的代码: 形 ...
- 《安全智库》:48H急速夺旗大战通关writeup(通关策略)
作者:ByStudent 题目名字 题目分值 地址 MallBuilder2 350 mall.anquanbao.com.cn MallBuilder1 200 mall.anquanbao.c ...
- iscc2016 pwn部分writeup
一.pwn1 简单的32位栈溢出,定位溢出点后即可写exp gdb-peda$ r Starting program: /usr/iscc/pwn1 C'mon pwn me : AAA%AAsAAB ...
- 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 ...
- 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 ...
- 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 ...
随机推荐
- Oracle学习(十三)优化专题
一.查询频繁,数据量大 索引 使用时机:表中经常查询的字段可以考虑添加索引. 联合索引:若能确认多个条件会同时使用时,可以将这几个条件作为联合索引. 单列索引:若条件查询时,这几个条件不是同时用到的话 ...
- shiro 退出过滤器 logout ---退出清除HTTPSession数据
重写LogouFilter类 import org.apache.shiro.web.filter.authc.LogoutFilter; public class ShiroLogoutFilter ...
- 从 LRU Cache 带你看面试的本质
前言 大家好,这里是<齐姐聊算法>系列之 LRU 问题. 在讲这道题之前,我想先聊聊「技术面试究竟是在考什么」这个问题. 技术面试究竟在考什么 在人人都知道刷题的今天,面试官也都知道大家会 ...
- C语言专项错题集
2020-08-10 记录 #1 1 struct student{ 2 int num; 3 int age; 4 }; 5 struct student stu[3]={{6001,20},{60 ...
- tomcat在windows下安装
1.下载地址:https://tomcat.apache.org/download-90.cgi Binary是编译好的,可以直接使用的版本: tar.gz,解压即可用: Source是源代码版本,需 ...
- 《Duubo系列》-Dubbo服务暴露过程
我今天来就带大家看看 Dubbo 服务暴露过程,这个过程在 Dubbo 中其实是很核心的过程之一,关乎到你的 Provider 如何能被 Consumer 得知并调用. 今天还是会进行源码解析,毕竟我 ...
- jquery全选,全不选,反选
前台 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.o ...
- 《SpringCloudDubbo开发日记》(一)Nacos连官方文档都没写好
背景 现在的微服务框架一般分dubbo和springcloud两套服务治理体系,dubbo是基于zookeeper为注册中心,springcloud是基于eureka作为注册中心. 但是现在eurek ...
- P4715 【深基16.例1】淘汰赛
P4715 [深基16.例1]淘汰赛 题目描述 有 2^n(n≤7) 个国家参加世界杯决赛圈且进入淘汰赛环节.我经知道各个国家的能力值,且都不相等.能力值高的国家和能力值低的国家踢比赛时高者获胜.1 ...
- CF877E Danil and a Part-time Job
题目大意: link 有一棵 n 个点的树,根结点为 1 号点,每个点的权值都是 1 或 0 共有 m 次操作,操作分为两种 get 询问一个点 x 的子树里有多少个 1 pow 将一个点 x 的子树 ...