CCST-CTF 2019 部分 Writeup

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

Misc

刘翔

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

刘翔跨栏可还行。

爆破一下?

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

然后就完事儿了。

base64?

base64果然不行(

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

红石电路

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

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


我觉得可以做个强模(逃

drcom

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

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

我 裂 开 了。

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

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

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

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

RE

BabyRE

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

写个脚本异或就完事了。

疯狂点击

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

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

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

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

#include 
#include 
#include 
 
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可以看@某昨的博客: http://www.yesterday17.cn/2019/09/28/ctf1/

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

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