|-----@Crypto
|----------@Secret01
|----------@Secret Message
|----------@&#
|----------@Orz Loop
|----------@Secret Message 2
|----------@Coder
|----------@Dark
|----------@Strange Base64
|-----@MISC
|----------@Append
|----------@Call
|----------@Fakey
|----------@Picture
|----------@Word
|-----@Web
|----------@Source
|----------@method
Crypto
Secret01
> 00111010000111010111011100001111 Flag format: Ph0en1x{The password you've found.}面对一个二进制串,首先转转看,这题转为十进制串即flag(是很无脑,所以你得多尝试)。你可以使用tool或者win10自带计算器的程序员模式,或者是万能的python,
#这个语句将base进制的串转为十进制,‘base=’可以不写
#python
int('00111010000111010111011100001111',base=2)
或者是触手可及的javascript
//javascript
parseInt('00111010000111010111011100001111',2)
Secret Message
> ZmxhZ3tQaDBlbjF4R099这是一个base64编码的字符串,当然我不能确定它就是,于是我按照base64编码规则尝试解码,我发现解码后得到的是一个有意义的字符串。你可以用tool来解码或者是以下方法。
#方法一:python
#base全家桶包括base64/base32/base16
#例如可用base32.encode('xxx')来实现base32编码
import base64
base64.b64decode('ZmxhZ3tQaDBlbjF4R099')
//方法二:js
//相应的,window.btoa即为base64编码
window.atob('ZmxhZ3tQaDBlbjF4R099')
&#
这是典型的unicode编码,解码后将得到一个类似flag的字符串,这个字符串是flag凯撒加密后的结果。提供两个网站,[unicode编解码](http://tool.chinaz.com/Tools/unicode.aspx)和[凯撒加解密](http://www.yellowpipe.com/yis/tools/encrypter/index.php)。Orz Loop
>Vm0weGQxTnRVWGxXYTFwUFZsZG9WRmxVU2xOalJsSlZW R3RPYW1KR1dqQmFSVll3WVd4YWRHVkVRbFZpUmxwUVZsU kdZV014V25GVWJHUk9ZV3hhVVZac1pIcGxSbHAwVkd0a2FG SnRVbGhVVkVaTFZGWmtXR1ZIUmxkTlZuQlhWRlpXVjJGSFZu RlJWR3M5由题目暗示可以知道这里面有循环加密或者编码,先用base64解个十次看看。
#python
import base64
str='Vm0weGQxTnRVWGxXYTFwUFZsZG9WRmxVU2xOalJsSlZWR3RPYW1KR1dqQmFSVll3WVd4YWRHVkVRbFZpUmxwUVZsUkdZV014V25GVWJHUk9ZV3hhVVZac1pIcGxSbHAwVkd0a2FGSnRVbGhVVkVaTFZGWmtXR1ZIUmxkTlZuQlhWRlpXVjJGSFZuRlJWR3M5'
for i in range(1,10):
str=base64.b64decode(str);
print str
然后,你就看到你想看到的了。
Secret Message 2
>MZWgCZ33kBUDAZLoGF4FEVKTjBGUkRL5这个是上面提到的base32编码,可以用tool或者python解码。
Coder
>••−• •−•• •− −−• −− −−− •−• ••• • −•−• −−− −•• • •−•这是摩斯电码,可以找一张对应表手动解密或是用在线工具解密。
解码后是小写字符串,记得套上flag{**}。
Dark
> 10210897103123737297118101701111171101008911111733125这题考验你的观察力,你会发现102 108 97 103这些都是可打印字符的ascii码值,于是会心一笑。当然,我们不能接受可以手动解。
import sys
for i in [102,108,97,103,123,73,72,97,118,101,70,111,117,110,100,89,111,117,33,125]:
sys.stdout.write(chr(ord))
#之所以不用print是因为print默认换行,这不方便,
#也可以用"print chr(i),",但字母间有空格,也不方便
#用这个方法输出记得要import sys
Strange Base64
> 这个Base64有点奇怪啊。这题是base64隐写。怎么隐写呢,看个例子。
对于一个字符串"me"
|0| 1 |2|3|4|
|--|:---|:---|:---|
|二进制| 01101101 | 01100101 | | |
|常规分组| 011011 | 010110 |0101 00 | 000000 |
|base64|b|W|U|=|
|隐写分组| 011011 | 010110 |0101 xx| 000000|
|隐写分组示例| 011011 |010110 |0101 01| 000000| //最后6位都是0,图片有误!
|base64|b|W|V|=|
base64串末尾可能有1或2个'='。我们假设一个base64串末尾有n个'=',那么在它解码时
会先删除二进制串末尾的8*n个位(因为他们本应该是不含有任何信息而只是单纯地padding上去的0位)
也就是上图中加粗的八个位。
也就是说,'bWU='和'bWV='解码前都会变成'0110110101100101',最终都解码出'me'来,但是明显后者多含了01两个位,而实际上,这两个位还可能是10、11、00,如果有多个句子,就可能每个句子隐写2或4个位,连起来后形成一个新的有意义的二进制串。若依然迷糊,可参考这里。然后附上别处抄来的解密代码:
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('a.in', 'rb') as f:
file_lines = f.readlines()
bin_str = ''
for line in file_lines:
steg_line = line.replace('
', '')
norm_line = line.replace('
', '').decode('base64').encode('base64').replace('
', '')
diff = get_base64_diff_value(steg_line, norm_line)
pads_num = steg_line.count('=')
if diff:
bin_str += bin(diff)[2:].zfill(pads_num * 2)
else:
bin_str += '0' * pads_num * 2
res_str = ''
for i in xrange(0, len(bin_str), 8):
res_str += chr(int(bin_str[i:i+8], 2))
print res_str
solve_stego()
MISC
Append
>find the secret behind the hacker.将图片用十六进制编辑器(如winhex)打开,拖到尾部即可看到flag。
Call
> . .. ..... ........ .......... .. ... ... Flag format: Ph0en1x{*****}图片是一个使用脉冲拨号的老式转盘电话,脉冲拨号是一种时域处理方法,它用脉冲的个数来表示号码数字。所以数出点数就可以了。10个点表示0。
Fakey
> 为啥有密码??这是一个zip伪加密,就是一个实际上没有加密的zip压缩包会被识别为加密的。原理是zip文件格式约定用某几位的值来表示文件是否加密,伪加密就是人为篡改这些值,我们要做的就是把这些值改回来。用winhex打开,在 "搜索->替换十六进制数值" 中搜索"0108"替换为"0000",保存文件即可。(大致原理如上所述,至于具体为什么是这样请自行搜索)
Picture
> WOW,what a great picture! what does it mean?$binwalk zip.jpg
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
0 0x0 JPEG image data, JFIF standard 1.01
23885 0x5D4D Zip archive data, at least v2.0 to extract, compressed size: 25, uncompressed size: 23, name: flag.txt
24038 0x5DE6 End of Zip archive, footer length: 22
$ binwalk -e zip.jpg
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
0 0x0 JPEG image data, JFIF standard 1.01
WARNING: Extractor.execute failed to run external extractor 'jar xvf '%e'': [Errno 2] No such file or directory: 'jar'
23885 0x5D4D Zip archive data, at least v2.0 to extract, compressed size: 25, uncompressed size: 23, name: flag.txt
24038 0x5DE6 End of Zip archive, footer length: 22
binwalk是一款识别和提取文件的神器,我们看到它分析出来文件从0x5D4D到0x5DE6是一个zip压缩包,那么我们可以直接binwalk -e filename
自动提取或者将0x5D4D到0x5DE6位置的二进制内容手动提取另存为zip格式再解压,总之,解压后就能看到flag。
Word
> 我可能装了个假Word打开是一个word文件,显示出来的flag毋庸置疑是假的,binwalk无果,用winhex打开,在假flag下面发现真flag,复制出来即可。实验发现把两个flag间的3个0x0d00都换成0x0000,flag就可以显示出来。这估计和文档格式有关,来日深究。
Web
Source
右键查看源代码即可。method
> GET or POST That's a question^^感觉这题挺好玩,把"Ph0en1x = CTF"用get方法和post方法各发包一次,各得到半截flag,拼起来即可。