CRYPTO

古典密码

拿到手,有三段加密,都不难:

第一关:大帝
iodj{36g9i2777
  
第二关:滴滴滴
-... ----. ..--- -... .- -.-. ...-- ----. .- .- ..---
  
第三关:篱笆
a0dd}b6942c07    大帝指的是凯撒大帝,滴滴滴是莫斯密码,篱笆指的是栅栏加密, 所以直接得到找到答案
part1:flag{36d9f2777
part2:B92BAC39AA2
part3:ab206cd90d47} 

连起来就是flag{36d9f2777b92bac39aa2ab206cd90d47}


Reserve

easy-py

题目是一个pyc文件,很明显可以直接用工具反编译,得到源代码

import base64
import string
def caser(flag):
    enc1 = ''
    for i in flag:
        enc1 += chr(ord(i) - 5)
    return enc1
def rail(flag):
    p1 = ''
    p2 = ''
    p3 = ''
    enc2 = ''
    for i in range(len(flag)):
        j = i % 3
        if j == 0:
            p1 += flag[i]
            continue
        if j == 1:
            p2 += flag[i]
            continue
        p3 += flag[i]
    enc2 = p1 + p2 + p3
    return enc2
def rep(flag):
    table1 = 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM'
    table2 = 'QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm'
    table = string.maketrans(table1, table2)
    return flag.translate(table, '=')
while True:
    flag = raw_input('please input flag to check:')
    if rep(base64.b64encode(rail(caser(flag)))) == 'ywjCytmRxI9CycWZngD2ncTDkZqYlJrGmhHCxISUnfWSlgfDlJi':
        print 'Success!you got it!'
        break
        continue
    print 'try a gain' 可以看到题目做了base64加密,栅栏加密,大小写替换这些步骤。所以编写反编译脚本
import base64
import string

def rep(flag):
    table1 = 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM'
    table2 = 'QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm'
    table = string.maketrans(table2, table1)
    return flag.translate(table, '=')

def caser(flag):
    enc1 = ''
    for i in flag:
        enc1 += chr(ord(i) + 5)
    return enc1

strs = 'ywjCytmRxI9CycWZngD2ncTDkZqYlJrGmhHCxISUnfWSlgfDlJi'
print(caser(base64.b64decode(rep(strs)+'='))) 

再到网上获得栅栏解密后的flag

因为我的python代码水平有限,没写出栅栏解密的代码,现在官方WP放出后转载一下官方的代码

import base64
import string
ans1='ywjCytmRxI9CycWZngD2ncTDkZqYlJrGmhHCxISUnfWSlgfDlJi='
table1="qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM"
table2="QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm"
table = string.maketrans(table2,table1)
ans2=ans1.translate(table)
ans3=base64.b64decode(ans2)
ans4=''
for i in range(len(ans3)/3):
    ans4+=ans3[i]+ans3[13+i]+ans3[26+i]
ans4+=ans3[12]+ans3[25]
flag=""
for i in ans4:
    flag+=chr(ord(i)+5)
print flag

maze1

这是一道迷宫题,linux x64环境

由IDA打开,直接看main函数,可以看到迷宫的生成代码

v16 = __readfsqword(0x28u);
for ( i = 0; i <= 5; ++i )
    byte_602300[i] = 1;
for ( j = 0; j <= 5; ++j ){
    byte_602300[6 * j] = 1;
    byte_602302[6 * j] = 1;
    a2 = (char **)j;
    byte_602302[6 * j + 3] = 1;
}
byte_602323 = 2;

由这段代码写脚本,生成迷宫地图

int main() {
    int i, j;
    int maze[6][6] = { 0 };
    for (i = 0; i <= 5; ++i) {
        maze[0][i] = 1;
    }
    for (i = 0; i <= 5; ++i) {
        maze[i][0] = 1;
        maze[i][2] = 1;
        maze[i][5] = 1;
    }
    maze[5][5] = 2;
    for (i = 0; i < 6; i++) {
        for (j = 0; j < 6; j++) {
            printf("%d ", maze[i][j]);
        }
    printf("\n");
    }
}

题目意思应该是:1是通路,0是死路

现在,再看迷宫是由什么控制的

再IDA中我们可以看到,wasd控制上下左右,所以迷宫路径应该是dddddsssss。

所以就能得到flag了


MISC

lemonEssence

一张柠檬果的png图片,尝试binwalk后无果,看文件大小体积与范围不匹配,猜想可能有高度隐写

将高度拉高200后得到flag

简单的zip隐写

拿到手是个rar,这与题目的zip不符,在右侧备注栏找到504B开头16进制代码,

将16进制代码写入成文件后发现显示压缩包错误

尝试修复zip包,将控制压缩包版本的00改为08,之后得到正确解压