zoukankan      html  css  js  c++  java
  • 【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('
    ', '')
          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,拼起来即可。

  • 相关阅读:
    带结点与不带结点用头插法和尾插法创建单链表
    高中数学教资面试记录
    学习爬虫——test1——模拟浏览器去访问网站
    解决centos虚拟机中使用virt-manager创建虚拟机遇到的镜像导入问题
    pycharm更改背景颜色
    控制函数调用的流程
    简单的获取list的下标
    种一棵树的时间,不是以前,也不是未来的某一天,而是现在。
    将八位教师随机分配到三个办公室——python
    使用tomcat部署idea项目方法(1)
  • 原文地址:https://www.cnblogs.com/findneo/p/6884113.html
Copyright © 2011-2022 走看看