ctf writeup之程序員密碼
起因
在v2ex上看到有人發了一篇帖子,說做了一個程序員小遊戲,遂試玩了一下。
遊戲的地址在這裏: http://www.bettertomissthantomeet.com/pages/level.html
第零關
控制臺打印的字符“Hello, world!”,復制粘貼通過。
第一關
控制臺又打印了一串字符:
看著像base64,拿去解碼,得到“I‘m a programmer.”,復制粘貼通過。
第二關
為毛又是控制臺打印…
拿去base64解碼,得到“ping www.programmerpassword.com”,遂ping了一下:
將ip地址“47.104.152.148”復制粘貼通過。
感覺這個設計得不太好,因為一般ping的話是為了看ttl延時,少數情況是為了解析到ip地址,不過好歹也能夠聯想到。
第三關
這次控制臺沒有輸出了,並且頁面上也沒有啥提示,於是ctrl+shift+c選了下提交按鈕,然後看到了
這是一個透明元素,所以頁面上看不到,復制“123456”粘貼沒通過….需要完整的復制“密碼是123456”粘貼提交才能通過,作者很頑皮啊。
第四關
這次還是老的套路,控制臺打印了一串十六進制數:
拿去解碼(關鍵詞十六進制轉字符串),將“4275672072756e6e696e67”轉為字符串“Bug running”,復制粘貼通過。
第五關
選一下這個井號:
看到有一個樣式是rgb(r,g,b)這種格式指定的,然後頁面上又是一個大大的井號,遂將“rgb(47, 69, 132)”拿去rgb轉hex,得到“#2F4584”,但是很悲劇的事情是作者的判斷正確的方法是將我們提交得的答案md5和正確答案的md5進行比對,所以就沒辦法兼容大小寫這種情況,這個是我想吐槽的第一點。然後我想吐槽的第二點是沒有辦法兼容大小寫就算了標準答案還是非主流的小寫…hex的A-F很少有用小寫的,所以就導致大多數人都會被坑一下…
提交“#2f4584”通過。
第六關
控制臺打印了一堆東西,很明確表示這是base64。然後觀察base64的開頭和img的src base64很像,遂拿去放到一個html中:
<!DOCTYPE html> <html> <head> <title></title> </head> <body> <img src="data:image/png;base64,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"> </body> </html>
打開這個html:
提交“463700”通過。
第七關
有個掛掉的圖片:
然後切換到network看一下:
發現這明明是個doc類型的好吧,然後手動打開:
提交“better to miss than to meet”通過。
第八關
頁面上顯示了一行字:
控制臺也有輸出:
遂在控制臺使用getPassword()方法解密(別問我怎麽知道的,因為我讀了這個js…):
提交“25LTQWMP9Y”通過。
第九關
這關是設計得還比較好的,因為所使用的技術的特點體現的非常好。
頁面上就這麽一張圖片:
看了半天,以為玄機在圖片上的代碼裏,還去看了PDO的相關資料….代碼成功的吸引了猿類的註意力,如果是一張風景圖之類的恐怕就能夠秒想到圖片隱寫術。
右鍵把圖片保存到本地,然後使用winhex打開,搜索FFD9找jpg圖片的結尾。
jpg文件有一個特點就是以FFD9為結束符,結束符之後的內容就直接無視,利用這個特性可以往尾部藏一些東西。
下圖中高亮的部分都是會被無視的內容:
這是兩行命令,最有可能的答案就是這兩行命令的輸出了,來分析依稀可能會輸出什麽:
cd /data/log/../www/ pwd
log會被..約掉,所以是cd /data/www/然後用pwd輸出當前路徑,Linux下pwd是不會帶最後的斜線的,所以最終的輸出就是“/data/www”,提交通過。
不足
核心的判斷邏輯在這個js中:http://www.bettertomissthantomeet.com/static/js/app/level.js,將判斷放在前端還很齊齊整整,人家只要閱讀一遍這個js就大概了解了,這樣大大降低了難度不太好。
不過最後的隱寫術真的很6,成功誤導我在PDO的方向上越走越遠,花了一大會兒時間才想到….
.
ctf writeup之程序員密碼