【wp】Ph0en1x OJ 指南

|-----@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('\n', '')
      norm_line = line.replace('\n', '').decode('base64').encode('base64').replace('\n', '')
      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,拼起来即可。

posted @ 2017-05-21 10:29  findneo  阅读(810)  评论(0编辑  收藏  举报