GKCTF X DASCTF应急挑战杯-Maple_root-Writeup

参赛队员:

b4tteRy, x0r, f1oat

最终成绩:2285

最终排名:27

总结

经过最近几次类线下的演练,感觉慢慢对CTF有点上手了,这次终于不再爆0了,继续努力

MISC

签到

wireshark打开可知是shell流量,命令结果编码为hex+base64。观察前面几条whoami/ls等命令输出可知每行输出都是倒序输出。



故将cat /f14g|base64的结果每行倒序拼接解码后得到flag的编辑记录,去除双写得到flag。

你知道apng吗

将apng转换为gif后查看,发现部分关键帧内有二维码。









扫描结果顺序拼接得到flag。

银杏岛の奇妙冒险







FireFox Forensics

下载下来解压以后有一个json文件和一个sql存储的db数据库文件,查看db数据库内容是加密的,又根据题目提示本题内容属于登录信息相关,应该是FireFox浏览器所存储的登录信息,在Github上已有相关的解密脚本,直接下载以后将题目给出的两个文件放入相同目录,使用python3 firepwd.py即可成功解密得到flag

excel骚操作

打开看到一行字,根据提示flag隐写在表格中。

依次查看单元格/解压查看数据可发现部分单元格值为1,查看单元格格式可发现格式为;;;,改变格式后正常显示出数字。

设置条件格式,使得所有值为1的单元格黑色填充,并拉伸所有数字范围内单元格至正方形,得到黑色单元格画成的汉信码。



使用中国编码app扫描得到flag。

Reverse

QQQQT

下载后使用PEID扫描是WIN32程序,拖入IDA32分析可看出程序显然是由Qt语言所编写,题目名称也印证了这一点,一开始在IDA的WinMain窗口中多次依照逻辑查找无果,之后又在OD中尝试进行动态调试,在分析出的字符串当中找到了flag相关的关键词已经其上下的文本地址



然后在IDA中根据以上地址找到这些字符串所在的位置,可以得到如下函数

int __thiscall sub_4012F0(_DWORD *this)
{
int v1; // edi
_BYTE *v2; // esi
const char *v3; // edx
_BYTE *v4; // esi
int v5; // ecx
int v6; // eax
int v7; // ecx
int v8; // edx
int v9; // edi
int v10; // esi
_BYTE *v11; // ecx
unsigned int v12; // ecx
int v14; // [esp-8h] [ebp-A8h]
char v16[4]; // [esp+10h] [ebp-90h] BYREF
char v17[4]; // [esp+14h] [ebp-8Ch] BYREF
_BYTE *v18; // [esp+18h] [ebp-88h]
const char *v19; // [esp+1Ch] [ebp-84h]
int v20; // [esp+20h] [ebp-80h]
int v21; // [esp+24h] [ebp-7Ch] BYREF
_BYTE *v22; // [esp+28h] [ebp-78h] BYREF
char v23[60]; // [esp+2Ch] [ebp-74h] BYREF
__int128 v24[2]; // [esp+68h] [ebp-38h] BYREF
__int64 v25; // [esp+88h] [ebp-18h]
int v26; // [esp+9Ch] [ebp-4h] MEMORY[0x5FF6](*(_DWORD *)(this[6] + 4), v16);
v26 = 0;
MEMORY[0x7C7C](v16, v17);
LOBYTE(v26) = 1;
v19 = (const char *)MEMORY[0x7C48](v17);
v24[0] = 0i64;
v24[1] = 0i64;
v25 = 0i64;
strcpy(v23, "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz");
v21 = 138 * strlen(v19) / 0x64;
v14 = v21 + 1;
v1 = 0;
v22 = (_BYTE *)MEMORY[0x8114](v21 + 1);
v2 = v22;
sub_402C08(v22, 0, v14);
v3 = v19;
v20 = (int)(v19 + 1);
if ( strlen(v19) )
{
v4 = &v2[v21];
v18 = v4;
while ( 1 )
{
v20 = ((char)*v4 << 8) + v3[v1];
v5 = v20 / 58;
*v4 = v20 % 58;
if ( v5 )
{
do
{
v6 = (char)*--v4;
v7 = (v6 << 8) + v5;
v20 = v7 / 58;
*v4 = v7 % 58;
v5 = v20;
}
while ( v20 );
v4 = v18;
}
if ( ++v1 >= strlen(v19) )
break;
v3 = v19;
}
v2 = v22;
}
v8 = 0;
if ( !*v2 )
{
do
++v8;
while ( !v2[v8] );
}
v9 = v21;
if ( v8 <= v21 )
{
v10 = v2 - (_BYTE *)v24;
do
{
v11 = (char *)v24 + v8++;
*v11 = v23[(char)v11[v10]];
}
while ( v8 <= v9 );
}
if ( !MEMORY[0x7C1A](v24, "56fkoP8KhwCf3v7CEz") )
{
if ( v19 )
v12 = strlen(v19);
else
v12 = -1;
v22 = (_BYTE *)MEMORY[0x7CCC](v19, v12);
LOBYTE(v26) = 2;
v21 = MEMORY[0x7CCC]("flag", 4);
LOBYTE(v26) = 3;
MEMORY[0x6124](this, &v21, &v22, 1024, 0);
MEMORY[0x7C66](&v21);
MEMORY[0x7C66](&v22);
}
MEMORY[0x7C30](v17);
return MEMORY[0x7C66]();
}

由上方字符串123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz推测为Base58编码,将字符串56fkoP8KhwCf3v7CEz以Base58解码后尝试提交即为flag

Crash

打开发现本程序是用Golang编写的,因此使用IDA7.6打开即可对应大部分的字符集,打开main_main看第18行为

 if ( v1[1] == 43LL && *(_DWORD *)v0 == 1413696327 && *(_WORD *)(v0 + 4) == 31558 && *(_BYTE *)(v0 + 42) == 125 )

其中,各个等值式分别判定了TCKG(内存地址中倒序存储字符串),{F,},因此推断这里应该就是在进行flag的判定,接着进入main_check函数

void __golang main_check(__int64 a1, unsigned __int64 a2)
{
__int64 v2; // [rsp+10h] [rbp-68h]
__int64 v3; // [rsp+10h] [rbp-68h]
__int64 v4; // [rsp+10h] [rbp-68h]
__int64 v5; // [rsp+18h] [rbp-60h]
__int64 v6; // [rsp+18h] [rbp-60h]
__int64 v7; // [rsp+18h] [rbp-60h]
__int64 v8; // [rsp+18h] [rbp-60h]
__int64 v9; // [rsp+18h] [rbp-60h]
__int64 v10; // [rsp+18h] [rbp-60h]
__int64 v11; // [rsp+20h] [rbp-58h]
__int64 v12; // [rsp+20h] [rbp-58h]
__int64 v13; // [rsp+20h] [rbp-58h]
__int64 v14; // [rsp+20h] [rbp-58h]
__int64 v15; // [rsp+20h] [rbp-58h]
__int64 v16; // [rsp+20h] [rbp-58h]
__int64 v17; // [rsp+28h] [rbp-50h]
__int64 v18; // [rsp+28h] [rbp-50h]
char v19[32]; // [rsp+30h] [rbp-48h] BYREF
char v20[32]; // [rsp+50h] [rbp-28h] BYREF if ( a2 < 0x1E )
runtime_panicSliceAlen();
v2 = main_encrypto(a1 + 6, 24LL);
if ( v5 == 44 )
{
v11 = runtime_memequal(v2, (__int64)"o/aWPjNNxMPZDnJlNp0zK5+NLPC4Tv6kqdJqjkL0XkA=", 44LL, 44);
if ( (_BYTE)v5 )
{
if ( a2 < 0x22 )
runtime_panicSliceAlen();
v17 = runtime_stringtoslicebyte((__int64)v19, a1 + 30, 4LL, v5, v11);
Encrypt_HashHex2(v6, v12, v17, v6, v12);
if ( v13 == 64 )
{
v14 = runtime_memequal(
v7,
(__int64)"6e2b55c78937d63490b4b26ab3ac3cb54df4c5ca7d60012c13d2d1234a732b74",
64LL,
v7);
if ( (_BYTE)v7 )
{
if ( a2 < 0x26 )
runtime_panicSliceAlen();
v18 = runtime_stringtoslicebyte((__int64)v20, a1 + 34, 4LL, v7, v14);
Encrypt_HashHex5(v8, v15, v18, v8, v15);
if ( v16 == 128 )
{
runtime_memequal(
v9,
(__int64)"6500fe72abcab63d87f213d2218b0ee086a1828188439ca485a1a40968fd272865d5ca4d5ef5a651270a52ff952d955c9"
"b757caae1ecce804582ae78f87fa3c9",
128LL,
v9);
if ( (_BYTE)v9 )
{
if ( a2 < 0x2A )
runtime_panicSliceAlen();
main_hash(a1 + 38, 4LL, v3, v9);
if ( v10 == 32 )
runtime_memequal(v4, (__int64)"ff6e2fd78aca4736037258f0ede4ecf0", 32LL, 32);
}
}
}
}
}
}
}

可以看出,总共分为了若干段,第一段有六个字符,且使用了DES加密(可直接爆破)第二段是使用了sha256加密,第三段是使用了sha512加密,最后一段则使用了md5加密,以上若干加密段皆可根据前面所截取提交内容内的长度推断该段加密前明文的长度,因此除第一个DES爆破解密已有相关网站外,其余皆写相同脚本爆破即可

第一段DES加密可以从encoding_json_Unmarshal内找到key和iv

    "key": "WelcomeToTheGKCTF2021XXX",
"iv": "1Ssecret"

接着发现此处key共有24byte,因此推测为3des,因此进行相应的爆破即可得到第一段flag,后面几段的解题脚本如下:

sha256 -> 4位

import hashlib
import string
import itertools dateset = string.ascii_lowercase + string.digits res = "6e2b55c78937d63490b4b26ab3ac3cb54df4c5ca7d60012c13d2d1234a732b74" def generate_strings(length=4):
chars = string.ascii_lowercase + string.digits
for item in itertools.product(chars, repeat=length):
tmp = "".join(item)
aa = hashlib.sha256(tmp.encode('utf-8')).hexdigest() if aa.hexdigest() == res:
print(tmp)
exit(0) generate_strings()

sha512 -> 4位

import hashlib
import string
import itertools dateset = string.ascii_lowercase + string.digits res = "6500fe72abcab63d87f213d2218b0ee086a1828188439ca485a1a40968fd272865d5ca4d5ef5a651270a52ff952d955c9b757caae1ecce804582ae78f87fa3c9" def generate_strings(length=4):
chars = string.ascii_lowercase + string.digits
for item in itertools.product(chars, repeat=length):
tmp = "".join(item)
aa = hashlib.sha512(tmp.encode('utf-8')).hexdigest() if aa.hexdigest() == res:
print(tmp)
exit(0) generate_strings()

md5 -> 4位

import hashlib
import string
import itertools dateset = string.ascii_lowercase + string.digits flag = "ff6e2fd78aca4736037258f0ede4ecf0" def generate_strings(length=4):
chars = string.ascii_lowercase + string.digits
for item in itertools.product(chars, repeat=length):
md5 = hashlib.md5() tmp = "".join(item)
md5.update(tmp.encode('utf-8')) if md5.hexdigest() == flag:
print(tmp)
exit(0)

将以上爆破出来的值按照顺序连在一起即为flag

Web

easycms

题目提示五位弱密码,尝试admin/12345后登陆成功。

尝试更改主题相关模板代码提示需要创建/system/tmp/xxxx.txt(貌似是动态的四个字母)。

在素材库上传文件可观察到路径是文件名直接拼接来的,故可利用目录穿越创建上述要求创建的文件。再向模板内插入shell后读flag即可。

GKCTF X DASCTF应急挑战杯-Maple_root-Writeup的更多相关文章

  1. CTF 湖湘杯 2018 WriteUp (部分)

    湖湘杯 2018 WriteUp (部分),欢迎转载,转载请注明出处! 1.  CodeCheck(WEB) 测试admin ‘ or ‘1’=’1’# ,php报错.点击登录框下面的滚动通知,URL ...

  2. 2017湖湘杯复赛writeup

    2017湖湘杯复赛writeup 队伍名:China H.L.B 队伍同时在打 X-NUCA  和 湖湘杯的比赛,再加上周末周末周末啊,陪女朋友逛街吃饭看电影啊.所以精力有点分散,做出来部分题目,现在 ...

  3. SYC极客大挑战部分题目writeup

    Welcome 复制黏贴flag即可 我相信你正在与我相遇的路上马不停蹄 关注微信工作号回复"我要flag"即可获得flag 代号为geek的行动第一幕:毒雾初现 发现flag为摩 ...

  4. 【CTF】2019湖湘杯 miscmisc writeup

    题目来源:2019湖湘杯 题目链接:https://adworld.xctf.org.cn/task/answer?type=misc&number=1&grade=1&id= ...

  5. XSS挑战第一期Writeup

    0x00 起因 这期 XSS 挑战的起因是在阅读“Modern Web Application Firewalls Fingerprinting and Bypassing XSS Filters”过 ...

  6. 【4.29安恒杯】writeup

    #### 安恒杯_writeup 下面为比赛中做出的题目 MISC: SHOW ME THE FLAG-by-cyyzore CRYPTO: LAZYATTACK-by-GoldsNow 这一题非常巧 ...

  7. 第一届“信安杯”部分WriteUp

    第一届"信安杯"部分WriteUp------OooooohLeeGay队! 小队成员(按姓氏):郭泽坤.李江川.赵乐祺 以下这部分是做出来的 2019.11.23-24 ++Re ...

  8. 上海嘉韦思杯部分writeup

    第二题 打开赛题,看到加密字符串,进行base64解密,发现是JSFUCK,再次解密,控制台得到flag. 第三题 打开频谱图得到flag,flag中有三个_,联想到音频文件详细信息中的三个zero, ...

  9. 【CTF MISC】pyc文件反编译到Python源码-2017世安杯CTF writeup详解

    1.题目 Create-By-SimpleLab 适合作为桌面的图片 首先是一张图片,然后用StegSolve进行分析,发现二维码 扫码得到一串字符 03F30D0A79CB0558630000000 ...

  10. 【CTF MISC】文件内容反转方法-2017世安杯CTF writeup详解

    Reverseme 用winhex打开,发现里面的字符反过来可以正常阅读,所以文件被倒置了 Python解题程序如下 with open('reverseMe','rb') as f: with op ...

随机推荐

  1. echarts区域选择(brush)默认开启选择

    api.dispatchAction({ // 刷选模式的开关.使用此 action 可将当前鼠标变为可刷选状态. 事实上,点击 toolbox 中的 brush 按钮时,就是通过这个 action, ...

  2. LeetCode LCP 2. 分式化简

    从最后一项依次叠加 1 class Solution(object): 2 def fraction(self, cont): 3 """ 4 :type cont: L ...

  3. 3dmax专用卸载修复工具,一键完全彻底卸载删除3dmax软件的专用卸载工具

    标题:3dmax重新安装方法经验总结,利用卸载清理工具完全彻底排查删除干净3dmax各种残留注册表和文件.3dmax显示已安装或者报错出现提示安装未完成某些产品无法安装的问题,怎么完全彻底删除清理干净 ...

  4. git在linux安装步骤详解!!

    linux上安装,以centos 7.x为例 yum命令安装 yum install gityum install 安装的git不是最新版本,如需最新版本需要自行编译 到下面的网站下载合适的版本 ht ...

  5. ESP32 环境搭建以及入门编程流程和体验-windows

    本帖适合入门级人员,但同时欢迎新老读者批评指正. 某宝上买了个esp32,还有一本ESP32开发指南的书. 然后就是环境搭建.上面写的主要是linux上的,我在自己的orange pi pc开发板上搭 ...

  6. maya灯光导入houdini插件开发——技术文档

    如果想了解插件开发流程的话,可以参考我另外一篇文章maya灯光导入houdini插件开发 插件下载地址 接下来我将说明怎么使用这插件(因为之前写过技术文档,所以也懒得再写一份了,直接照搬上来) 1.插 ...

  7. swftools工具将pdf文件转换为swf文件 文字丢失

    开发客户网站时遇到了一个需求,客户要求后台上传pdf文件,前台能以翻书的形式直接访问. 首先想到的是使用js解决,用户访问前端页面时,php将文件路径发送给js,让js呈现出来翻书的效果.在网上百度了 ...

  8. 运行python脚本报错SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape

    运行python脚本报错 SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes  in position 2-3: ...

  9. 【原创】SeetaFace2 Android编译

    SeetaFace2 github上有很完整的编译说明,但是自己编译过程中还是遇到了一点小问题.记录一下 编译环境: wsl ubuntu 20.04 执行编译命令 cmake .. -DCMAKE_ ...

  10. 关于Centos7Th 初始化的一些概述

    - 概述 Q:为什么要初始化,什么是初始化? A:一般初始化是根据的后期要部署的业务环境来定制的,新装的系统其自带的软件不够支撑各种开发环境或者运维工作:需要部署和设置对应的安全环境.开发/运维软件. ...