BUUCTF MISC
[GXYCTF2019]gakki
- 下载附件拿到一张图片,使用binwalk进行分离,得到一个压缩包。
- 使用ARCPHR压缩包爆破工具进行爆破,成功拿到密码。
- 在压缩包中拿到flag.txt文件,发现大量乱序字符,使用Python脚本工具进行统计。
# -*- coding:utf-8 -*-
#Author: mochu7
alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%^&*()_+- =\\{\\}[]"
strings = open('./flag.txt').read()
result = {}
for i in alphabet:
counts = strings.count(i)
i = '{0}'.format(i)
result[i] = counts
res = sorted(result.items(),key=lambda item:item[1],reverse=True)
for data in res:
print(data)
for i in res:
flag = str(i[0])
print(flag[0],end="")
[ACTF新生赛2020]base64隐写
1.下载附件,得到一个文本文件,里面全是base64加密的数据。
2. 编写Python脚本进行解密。
def get_base64_diff_value(s1, s2):
base64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
res = 0
for i in xrange(len(s2)):
if s1[i] != s2[i]:
return abs(base64chars.index(s1[i]) - base64chars.index(s2[i]))
return res
def solve_stego():
with open('ComeOn!.txt', 'rb') as f:
file_lines = f.readlines()
bin_str = ''
for line in file_lines:
steg_line = line.replace('\n', '')
norm_line = line.replace('\n', '').decode('base64').encode('base64').replace('\n', '')
diff = get_base64_diff_value(steg_line, norm_line)
print diff
pads_num = steg_line.count('=')
if diff:
bin_str += bin(diff)[2:].zfill(pads_num * 2)
else:
bin_str += '0' * pads_num * 2
print goflag(bin_str)
def goflag(bin_str):
res_str = ''
for i in xrange(0, len(bin_str), 8):
res_str += chr(int(bin_str[i:i + 8], 2))
return res_str
if __name__ == '__main__':
solve_stego()
[WUSTCTF2020]find_me
下载发现是一张图片,查看图片的属性,发现一串看不懂的符号,根据以前的经验,判断是盲文,在线网址解密成功拿到flag。
https://www.qqxiuzi.cn/bianma/wenbenjiami.php?s=mangwen
[ACTF新生赛2020]明文攻击
- 下载附件,得到一个压缩包,压缩包嵌套这另一个压缩包,解压后,得到一张图片和一个res.zip压缩包,但是要解压密码。
- 使用解压软件阅览了一下里面的文件,发现有个两个文件,分别为flag.txt与secret.txt。题目说了是明文攻击,我们先从图面入手呗。
- 使用winhex打开图片,在文件尾部发现flag.txt文件字样,于是开心的使用binwalk命令进行提取,但是发现咋么也提取不了,傻了!为啥?
- 通过仔细查看文件的hex值,发现那个文件头并不完整。
- 然后将图片文件的后缀名改为zip,解压,成功拿到flag.txt文件,但是那个并不是真正的flag。再结合题目说的明文攻击,我们将拿到flag.txt文件压缩为zip格式,使用ARCHPR爆破攻击进行攻击。
简单加密
- 下载附件得到一段密文和加密脚本。
==jEgWTn8kJrRyRFBuKJLuzH1LmDTAzs
function encode( $str = '' ){
$strrev = strrev( $str );
$string = '';
for( $i=0; $i < strlen($strrev);$i++ ){
$char = substr( $strrev, $i, 1 );
$ordChar = ord( $char ) + 1;
$char = chr( $ordChar );
$string = $string.$char;
}
$string = base64_encode( $string );
$string = strrev( $string );
$string = str_rot13( $string );
return $string;
}
- 其实这个加密脚本挺简单的,但是由于本人基础薄弱,还是花了好几个小时才写出来,但是想起来还是值得。
function decode( $str = ''){
$strrev = strrev($str);
$strrev = str_rot13($strrev);
$strrev = base64_decode($strrev);
$string = '';
for ( $i=0; $i < strlen($strrev);$i++ ){
$char = substr( $strrev, $i, 1 );
$ordChar = ord( $char ) - 1;
$char = chr( $ordChar );
$string = $string.$char;
}
return $string;
}
使用python的中切面倒置字符串即可:
>>>string = '}bEB54QgWXwMGHCxk{galF'
>>> print(string[::-1]);
Flag{kxCHGMwXWgQ45BEb}
黑客帝国
- 下载附件,得到一个文件,使用winhex查看发现是zip文件,解压得到一个文本文件,文件的内容全是十六进制的,且文件的开头为52617221,初步判断这是一个rar文件,使用python将十六进制以二进制形式写入另一个文件。
import binascii
content = ''
with open('resource.txt') as file_obj:
content = file_obj.read()
out=open('res.txt','wb')
out.write(binascii.unhexlify(content))
out.close()
- 将拿到的文件再次解压,但是需要密码,使用爆破工具进行掩码爆破,成功拿到密码 3690。
- 打开文件的时候,发现是一张无法正常显示的png图片,开始使用winhex查看的时候也没有啥发现,看了大佬的wp才知道原来这个是一个jpg文件,jpg图片的文件头被换成了png的文件头导致无法正常显示。
改好之后,图片就能正常显示了,成功拿到了flag。
[MRCTF2020]你能看懂音符
- 下载附件,得到一个rar压缩包,但是不能正常打开,使用winhex查看才知道原来文件头的前两个字节被调换了,缓过来即可。
- 成功拿到一个word文件,打开发现什么都没有,使用binwalk扫描一波,发现里面影写了zip文件,直接将word文件后缀名改成zip进行提取。
- 使用记事本打开document.xml文件,在里面找到了音符使用在线网站解密成功拿到flag!
[GUET-CTF2019]KO
[MRCTF2020]ezmisc
- 下载附件得到一张图片,刚开始打开图片的时候就发现图片的像素有点不对500x319。想着图片的高度是不是被篡改过。
- 使用winhex打开,修改图片的高,注意点,既然图片的宽度是500,那我们就把高度也改为500,500对应的十六进制编码为1f4。
保存,在图片的底部成功显示出flag。
[HBNIS2018]caesar
-
下载附件得到一个文本文件。
-
当时一点头绪都没有,看了大佬的博客才知道,直接使用脚本进行解密。
def change(c, i):
num = ord(c)
if (num >= 33 and num <= 126):
num = 33 + (num + i - 33) % (94) # 126-33=93
return chr(num)
def kaisa_jiAmi(string, i):
string_new = ''
for s in string:
string_new += change(s, i)
print(string_new)
return string_new
# 本题有种暴力解密感觉
def kaisa_jiEmi(string):
for i in range(0, 94):
print('第' + str(i + 1) + '种可能:', end=' ')
# 区别在于 string 是该对象原本就是字符串类型, 而 str()则是将该对象转换成字符串类型。
kaisa_jiAmi(string, i)
# 你要知道input输入的数据类型都是string
def main():
print('请输入操作,注意不是平常26种:')
choice = input('1:恺撒加密,2:凯撒穷举解密.请输入1或2:')
if choice == '1':
string = input('请输入需要加密字符串: ')
num = int(input('请输入需要加密的KEY: '))
kaisa_jiAmi(string, num)
elif choice == '2':
string = input('请输入需要解密字符串: ')
kaisa_jiEmi(string)
else:
print('输入错误,请重试')
main()
if __name__ == '__main__':
main()