iT邦幫忙

2021 iThome 鐵人賽

DAY 20
1
Security

一起資安入門 -- picoCTF 探索與解題系列 第 20

[2021鐵人賽 Day20] General Skills 17

  • 分享至 

  • xImage
  •  
  • 今天我們稍微調動一下順序,先解 General Skills 系列的最後一題,
    因為跟昨天的題目算是同一題的延伸。這兩題我覺得相對沒出那麼好啦,
    不過也算是學點新東西~

  • General Skills / 1_wanna_b3_a_r0ck5tar
    https://ithelp.ithome.com.tw/upload/images/20211005/20111429Cc2PpKb03r.png
    這題跟昨天的題目 80% 是一樣的,我們一樣先下載題目給的檔案:

    Rocknroll is right              
    Silence is wrong                
    A guitar is a six-string        
    Tommy's been down               
    Music is a billboard-burning razzmatazz!
    Listen to the music             
    If the music is a guitar                  
    Say "Keep on rocking!"                
    Listen to the rhythm
    If the rhythm without Music is nothing
    Tommy is rockin guitar
    Shout Tommy!                    
    Music is amazing sensation 
    Jamming is awesome presence
    Scream Music!                   
    Scream Jamming!                 
    Tommy is playing rock           
    Scream Tommy!       
    They are dazzled audiences                  
    Shout it!
    Rock is electric heaven                     
    Scream it!
    Tommy is jukebox god            
    Say it!                                     
    Break it down
    Shout "Bring on the rock!"
    Else Whisper "That ain't it, Chief"                 
    Break it down 
    

    同樣是奇怪的歌詞,因為有昨天的經驗,可以猜到一樣要用那個網站進行翻譯:
    https://ithelp.ithome.com.tw/upload/images/20211005/20111429AbRDLJDx1H.png
    不一樣的是,這次卻沒有任何輸出?
    我們觀察到下方有個 input 欄位,想必是要填入一些輸入資料吧!

    雖然這樣說,但感覺沒有任何頭緒...
    我們先在這個網站上找找教學文件、範例等等,
    結果的確有一點蛛絲馬跡,以下是一些有助於解題的資訊,
    都可以在這個網站上找到:

    • xxx is yyy
      xxx 是變數,yyy 是值,代表把 yyy 的值放進 xxx 這個變數
    • the xxx 以及 xxx 算不同的變數
    • if xxx is yyy
      如果 xxx 等於 yyy 的值
    • nothing, nowhere, nobody, empty 以及 gone 代表 null 或 0
    • Say, Shout, Whisper 以及 Scream 代表 print 到 stdout ,也就是印出值
    • Listen to 代表 input 資料。
    • 最重要的一點
      這個語言的每個字除了關鍵字字串變數以外都是數字
      • 先講字串,用 "" 括起來的就是字串,使用 Say 等關鍵字會將字串原封不動印出
      • 關鍵字就是上面提到的那些有功能的單字
      • 變數就是 xxx is yyy 這種, is 前面的就是變數。
      • 數字怎麼表示呢?
        答案是看字數,該單字幾個字代表什麼數字,兩個數字連一起的話是代表兩個位數,舉例:
        apple pie banana 代表: 5325 (五千三百二十五)
        apple is great great good good eat 代表: apple 這個變數放入 55443 這個值
        
        其他符號則是有些規則, - 在單字中算一個字,
        . 在單字中央的話是小數點,在字尾則忽略,
        其他所有符號則都會被忽略。舉例:
        cat eat apple-pie 代表: 339
        dsd*fjj.!ef$?. 代表: 6.2
        
        值得一提的是,避免 1 、 2 等數字能表示的字太少,
        字數計算每多十個字扣掉十,也就是 字數 = 字數 mod 10 的意思,舉例:
        beautiful-banana great! 代表: 65
        

    OK ,差不多了,我們來解析歌詞,
    首先看看需要處理輸入的部份:

    A guitar is a six-string        
    Tommy's been down 
    Music is a billboard-burning razzmatazz!
    Listen to the music             
    If the music is a guitar                  
    Say "Keep on rocking!" 
    

    可以解析成:

    1. A guitar 裝入 10 (a: 1 與 six-string: 10)
    2. 這裡不會用到,跳過
    3. Music 裝入 170 (a: 1 與 billboard-burning: 7 與 razzmatazz!: 10)
    4. 把輸入裝到 the music (注意 the music 與 Music 不同)
    5. 如果 the music 是 a guitar (10) 就
    6. 輸出 "Keep on rocking!" 字串
      應該是要我們輸入 10 ,這樣才能讓 the music 等於 a guitar 。
      所以 input 欄位我們先輸入 10 ,然後換行,因為輸入資料以一行為單位。

    還有一段輸入部份:

    Listen to the rhythm
    If the rhythm without Music is nothing
    

    解析成:

    1. 把輸入裝到 the rhythm
    2. 如果 the rhythm 減 Music 等於 0 就
      without 代表減法,也是一個關鍵字,而 Music 上面有定義,存有 170 ,
      所以我們目標是讓輸入減去 170 會得到 0 ,只要讓輸入是 170 即可!
      那剛剛 10 的下一行我們就打入 170 ,因此輸入欄位會像這樣:
    10
    170
    

    按下 Rock! 吧~
    輸出就成功出現了:

    Keep on rocking!
    66
    79
    78
    74
    79
    86
    73
    Program completed in 118 ms
    

    跟昨天是一樣的,我們將 ASCII code 轉換過來吧,沿用一樣的程式,得到:

    $ python ascii.py < code.txt 
    BONJOVI
    

    可見 BONJOVI 就是 flag 關鍵字了 (邦喬飛的英文)
    套上 flag 格式:

    picoCTF{BONJOVI}
    

上一篇
[2021鐵人賽 Day19] General Skills 16
下一篇
[2021鐵人賽 Day21] General Skills 18
系列文
一起資安入門 -- picoCTF 探索與解題30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言