「KSNCTF攻略」Easy Cipher

Published on:

昨天有幸得知一个网站:KSNCTF,是一个解谜过关的网站,但是你过关的时候,需要各种知识,包括简单的密码学、编程等,我目前只过了三关。你要想过关,就必须找到形如 FLAG_123456xyz 这样的过关钥匙, 这把钥匙就隐藏在你要过的关卡中。而第一关,就是个练习, 直接告诉你FLAG_123456xyz,让你输入过关就行。

本篇blog我们来说说 第二关:Easy Cipher


这是一道50分的题,题目如下:

EBG KVVV vf n fvzcyr yrggre fhofgvghgvba pvcure gung ercynprf n yrggre jvgu gur yrggre KVVV yrggref nsgre vg va gur nycunorg. EBG KVVV vf na rknzcyr bs gur Pnrfne pvcure, qrirybcrq va napvrag Ebzr. Synt vf SYNTFjmtkOWFNZdjkkNH. Vafreg na haqrefpber vzzrqvngryl nsgre SYNT.

这就是一堆乱码,再没有其他的说明。

再这堆乱码中想找出形如「FLAG_123456xyz」的钥匙字符串,显然没那么容易。 肉眼看过去,也就数「SYNTFjmtkOWFNZdjkkNH」这段字符比较像。 那么唯一的线索,就是想到,这可能是一段加过密的字符串。那么既然这里是让我们解题, 那么应该是这种对称加密方式,否则,此题无解,因为并没有任何其他的线索(包括查看网页源码寻找隐藏线索,一般的解迷过关游戏都会这样隐藏信息,否则没地方隐藏了)。 所以,接下来就应该思考,这段文字,是用什么样的对称加密方式呢?

在网上搜索了一下,对称加密方式有好几种, 最简单的一种是凯撒移位加密,还有其他的方式。但是除了凯撒移位的加密方法,其他的方式基本都是需要密文配合使用的,也就是所谓的密钥。 但是我们说了,本题再没有任何的线索,那么只有考虑凯撒移位加密方式,你才能把本题进行下去。

凯撒移位加密:

“恺撒密码”据传是古罗马恺撒大帝用来保护重要军情的加密系统。

它是一种置换密码,通过将字母按顺序推后起3位起到加密作用,如将字母A换作字母D,将字母B换作字母E。据说恺撒是率先使用加密函的古代将领之一,因此这种加密方法被称为恺撒密码。

假如有这样一条指令:
明文(小写):easy cipher
用恺撒密码加密后就成为(加入我们移动1位):
密文(小写):fbtz djqifs

那么接下来,我们就需要寻找, 题中给的密文,到底是移动了多少位? 反正就26个英文字母, 我唯一能用的就是暴力破解了:

选定一个单词,然后把每个字母从1-26都移一遍位,看看得出的单词,那个是比较通顺的。

def caesar_cipher(str)
  result = []
  1.upto(25) do  |i|
    arr = str.downcase.each_char.inject([]) do |s, c|   
      if (c.ord+i> 122) 
        s << (c.ord - (26 - i)).chr
      else
        s << (c.ord + i).chr
      end
      s
    end 
    result << arr.join
  end 
  result
end

上面这个方法(我没判断大小写,全部转为小写),用来暴力破解凯撒位移密码,我们输入那个觉得可疑的字符串:

caesar_cipher("SYNTFjmtkOWFNZdjkkNH")

#=>


["tzougknulpxgoaeklloi",
 "uapvhlovmqyhpbflmmpj",
 "vbqwimpwnrziqcgmnnqk",
 "wcrxjnqxosajrdhnoorl",
 "xdsykoryptbkseioppsm",
 "yetzlpszqucltfjpqqtn",
 "zfuamqtarvdmugkqrruo",
 "agvbnrubswenvhlrssvp",
 "bhwcosvctxfowimsttwq",
 "cixdptwduygpxjntuuxr",
 "djyequxevzhqykouvvys",
 "ekzfrvyfwairzlpvwwzt",
 "flagswzgxbjsamqwxxau",
 "gmbhtxahycktbnrxyybv",
 "hnciuybizdlucosyzzcw",
 "iodjvzcjaemvdptzaadx",
 "jpekwadkbfnwequabbey",
 "kqflxbelcgoxfrvbccfz",
 "lrgmycfmdhpygswcddga",
 "mshnzdgneiqzhtxdeehb",
 "ntioaehofjraiuyeffic",
 "oujpbfipgksbjvzfggjd",
 "pvkqcgjqhltckwaghhke",
 "qwlrdhkrimudlxbhiilf",
 "rxmseilsjnvemycijjmg"]

然后我们看看结果, 发现第10个转换后的字符"flagswzgxbjsamqwxxau"很可疑, 因为有flag前缀。那么我们把这个字符按照KSNCTF网站的过关规则,结合密文中的大写小写位置,变化一下这个字符串:

"SYNTFjmtkOWFNZdjkkNH" # 原来的字符

"flagswzgxbjsamqwxxau" # 破解出来的可疑字串

"FLAGSwzgxBJSAMqwxxAU"  # 大小写比对,肉眼变换

"FLAG_SwzgxBJSAMqwxxAU" # 在FLAG后面加下划线


经过上面几步,我们得到了一个过关钥匙串,把他输入到我们的题目中:

Congratulation! Flag FLAG_SwzgxBJSAMqwxxAU is correct.

恭喜你! 过关了。


请期待下一篇: 「KSNCTF攻略」Crawling Chaos

Comments

comments powered by Disqus