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,之后得到正确解压