CCST-CTF 2019 部分 Writeup

终于咱也入了 CTF 坑 23333 不多说,先上 wp。

Misc

刘翔

比较明显的栅栏密码,看第一个 f 到 l,所以 6 个一组。

刘翔跨栏可还行。

爆破一下?

发现有密码,无脑先修复一下,发现没用。拖进 aapr,然后惊喜的发现我裂开了(指默认暴力和字典都不行)。之后打开发现说明密码为 5 位数字,

然后就完事儿了。

base64?

base64 果然不行(

不过看到给出了字母表,于是百度了下 base64 的原字母表,写个 py 脚本映射就好。

红石电路

丢尽 MultiMC,然后发现是简单的门电路。甚至还好心的给了不同门的实现。

从结果端逆推,拿着红石块放到红石线上做标记(可以点亮红石),然后就推出来了(

我觉得可以做个强模(逃

drcom

丢进 InnoExtract,发现里面是个.c 和其编译后执行文件。

strings 找到的密码也不对,然后就没思路了。

我 裂 开 了。

仔细阅读发现,答案在 EULA 里…… 而且整句话也不含 flag,这就更隐蔽了。

这里注意提交要带上最后的句号。真狠啊。

Pixel

按照 Misc 解题自动机(?),先丢进 ps 建两个图层,把混合模式从上到下滚动一遍。然后丢进 BeyondCompare,调节容差看对比。可惜的是两种都没结果。

然后丢进 010Editor 文件比对,终于发现有点不同。于是将两段内容复制出来,发现 xor 后就是 flag。

RE

BabyRE

搜索字符串,找 xref 到引用处。

写个脚本异或就完事了。

疯狂点击

这题做了两次,开始是队友做的,连点器点出来了 flag,但是提交发现不是。

首先找入口。不会 mfc 啊…… 所以就断点,然后找到 offset 0xE31154 处。

然后就跟到了 offset 0xE31006 处,F5 之后对代码进行简单处理。(内心 os:为什么连点结果不对,看逻辑没看出来

简单处理就可以丢进 cpp 了,代码如下:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
#include <iostream>
#include <cstdlib>
#include <Windows.h>
using namespace std;
unsigned char datas[] = {0x72,0xFF,0x0E,0xA5,0x6F,0xC3,0x3D,0x8C,0x53,0xCC,0x0C,0xA3,0x25,0xF0,0x30,0xAB,0x21,0xCC,0x1C,0xF2,0x4B,0xA6,3 ,0xAF,0x44,0xDA,0x0A,0xBF};
int main() {
int v4; // ebx
int v5; // ebx
int v6; // ebx
unsigned int magic_number; // ebx
unsigned char magic_number_2[4];
char *new_space; // eax
char *flag; // esi
unsigned int i; // edx
int offset; // edi
char *flag_i; // ecx
char flag_val; // al
int v15; // edi
int v16; // eax
srand(0x3164624Au);
for (int i = 0; i < 114514; i++) {
v4 = (unsigned __int8)rand();
v5 = ((unsigned __int8)rand() << 8) | v4;
v6 = ((unsigned __int8)rand() << 16) | v5;
magic_number = (rand() << 24) | v6;
}
new_space = (char *) malloc(29u);
magic_number_2[0] = *(((unsigned char *) &magic_number) + 0);
magic_number_2[1] = *(((unsigned char *) &magic_number) + 1);
magic_number_2[2] = *(((unsigned char *) &magic_number) + 2);
magic_number_2[3] = *(((unsigned char *) &magic_number) + 3);
flag = new_space;
i = 0;
do
{
flag_i = &flag[i];
flag_val = datas[i] ^ magic_number_2[i & 3];
++i;
*flag_i = flag_val;
}
while ( i < 28 );
for(int j = 0; j < 28; j++) {
// cout << flag[i] << endl;
}
printf("%s", flag);
return 0;
}
#include <iostream> #include <cstdlib> #include <Windows.h> using namespace std; unsigned char datas[] = {0x72,0xFF,0x0E,0xA5,0x6F,0xC3,0x3D,0x8C,0x53,0xCC,0x0C,0xA3,0x25,0xF0,0x30,0xAB,0x21,0xCC,0x1C,0xF2,0x4B,0xA6,3 ,0xAF,0x44,0xDA,0x0A,0xBF}; int main() { int v4; // ebx int v5; // ebx int v6; // ebx unsigned int magic_number; // ebx unsigned char magic_number_2[4]; char *new_space; // eax char *flag; // esi unsigned int i; // edx int offset; // edi char *flag_i; // ecx char flag_val; // al int v15; // edi int v16; // eax srand(0x3164624Au); for (int i = 0; i < 114514; i++) { v4 = (unsigned __int8)rand(); v5 = ((unsigned __int8)rand() << 8) | v4; v6 = ((unsigned __int8)rand() << 16) | v5; magic_number = (rand() << 24) | v6; } new_space = (char *) malloc(29u); magic_number_2[0] = *(((unsigned char *) &magic_number) + 0); magic_number_2[1] = *(((unsigned char *) &magic_number) + 1); magic_number_2[2] = *(((unsigned char *) &magic_number) + 2); magic_number_2[3] = *(((unsigned char *) &magic_number) + 3); flag = new_space; i = 0; do { flag_i = &flag[i]; flag_val = datas[i] ^ magic_number_2[i & 3]; ++i; *flag_i = flag_val; } while ( i < 28 ); for(int j = 0; j < 28; j++) { // cout << flag[i] << endl; } printf("%s", flag); return 0; }
#include <iostream>
#include <cstdlib>
#include <Windows.h>

using namespace std;

unsigned char datas[] = {0x72,0xFF,0x0E,0xA5,0x6F,0xC3,0x3D,0x8C,0x53,0xCC,0x0C,0xA3,0x25,0xF0,0x30,0xAB,0x21,0xCC,0x1C,0xF2,0x4B,0xA6,3   ,0xAF,0x44,0xDA,0x0A,0xBF};

int main() {
    int v4; // ebx
    int v5; // ebx
    int v6; // ebx
    unsigned int magic_number; // ebx
    unsigned char magic_number_2[4];
    char *new_space; // eax
    char *flag; // esi
    unsigned int i; // edx
    int offset; // edi
    char *flag_i; // ecx
    char flag_val; // al
    int v15; // edi
    int v16; // eax
    srand(0x3164624Au);
    for (int i = 0; i < 114514; i++) {
        v4 = (unsigned __int8)rand();
        v5 = ((unsigned __int8)rand() << 8) | v4;
        v6 = ((unsigned __int8)rand() << 16) | v5;
        magic_number = (rand() << 24) | v6;
    }
    new_space = (char *) malloc(29u);
    magic_number_2[0] = *(((unsigned char *) &magic_number) + 0);
    magic_number_2[1] = *(((unsigned char *) &magic_number) + 1);
    magic_number_2[2] = *(((unsigned char *) &magic_number) + 2);
    magic_number_2[3] = *(((unsigned char *) &magic_number) + 3);
    flag = new_space;
    i = 0;
    do
    {
    flag_i = &flag[i];
    flag_val = datas[i] ^ magic_number_2[i & 3];
    ++i;
    *flag_i = flag_val;
    }
    while ( i < 28 );
    for(int j = 0; j < 28; j++) {
       // cout << flag[i] << endl;
    }
    printf("%s", flag);
    return 0;
}

然后发现结果和连点器是一样的,然后官方就发通知了,然后就没有然后了(

pwn

hof

主要是让条件成立。

阅读代码发现,可以通过 service 来达到目标地址。所以:

auth 233
service 23333333333333333333
login

然后就可以 cat flag.txt(也可以先 ls -al 看看是什么文件)

easyprintf

虽然最后也没过,但是搞了一上午很自闭,贴下代码(

https://pastebin.com/30wqb7yC

Re:从零开始的 pwn 学习.jpg

Web

php 代码审计

阅读代码,发现要绕过三层判断条件。第一个可以用数组,第二个也可以用数组,第三个就不能了。

然后发现可以科学计数法,然后就没有然后了

所以说动态类型不好啦((

这个加密见过吗

整个页面也只有 favicon.png 作为线索了。而且这张图还让我的 postman 裂开了。

丢进 010editor,结合我裂开的 postman,果然是因为 ihdr 的 crc 校验裂开了。首先想到修复宽高,python 一跑发现是高度不对,改成 0x0462 就完事…… 诶等等图里面竟然是一个链接

打开发现一大堆颜文字,还好原先见过,这其实是 aaencode(参见:论如何正确的收一个新年解谜红包),原理简单说就是字符串构造和 eval。最简单的方法,就是开个网页 F12 丢 console 然后

就没有然后了。

后记

玩的还是很开心哒~这次 CTF,有幸和 @某昨和凡神组队,两位队友都贼强。虽然赛前都说没接触过,但是赛程 A 题都超快的 w。说实话,刚开始队友光速做掉了 web 压力还是很大的 Orz。最后,也很开心能拿到 rank1。

另 1/3 的 wp 可以看 @某昨的博客:https://blog.yesterday17.cn/post/ctf-2019/

如果还有什么特别印象深刻的……

“什么东西会背叛你呢?金钱会,女人会,但是 pwn 不会,不会就是不会,怎么学都不会”.jpg

分享到

KAAAsS

喜欢二次元的程序员,喜欢发发教程,或者偶尔开坑。(←然而并不打算填)

相关日志

  1. 没有图片
  2. 没有图片
  3. 没有图片
  4. 没有图片
  5. 没有图片
  6. 没有图片

评论

  1. 虚青海 2019.10.01 6:17 下午

    完全没看懂在写什么 (:3_ヽ)_这就是 dalao 的世界吗

    • KAAAsS 2019.10.01 9:43 下午

      我觉得主要还是因为没有放上题目啦(

  2. Burn 2019.10.06 2:20 下午

    恭喜啊,拿到 rank1,也算是一种锻炼自己的机会吧。高中时立下的目标,越学习技术发现离它越远,CTF 也是不错了。

  3. repostone 2019.10.09 4:24 下午

    非技术的路过。

在此评论中不能使用 HTML 标签。