iT邦幫忙

2021 iThome 鐵人賽

DAY 12
0
Security

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

[2021鐵人賽 Day12] General Skills 09

  • 分享至 

  • xImage
  •  
  • 引言
    昨天的題目學習到進位制以及「 ASCII code <-> 字元」轉換,

    • 關於 Python 中的進位制前綴,可以簡單列出下表:

      進位制 前綴

      二進制 | 0b (零+b)
      八進制 | 0o (零+小寫英文字母o)
      十進制 | 無
      十六進制 | 0x (零+小寫英文字母x)

      例:
      一個八進位數字 4562 表示成: 0o4562
      一個十六進位數字 ff75 表示成: 0xff75

      順帶一提這個包含字母的前綴+數字在 Python 中視為數字喔,
      如果你試著

      print(0x34)
      

      程式會印出 52 ,可見 Python 事實上會將其轉成十進位數。

    • Python 中處理 ASCII code字元轉換的方式剛好就兩個函數:

      • chr() 昨天用到的,參數傳入 ASCII code 後會將其轉換為字元傳回。
        e.g. print(chr(65)) 會印出 A
      • ord() 表示 ordinal (序數) ,會將字元轉換成 ASCII code 。
        e.g. print(ord('b')) 會印出 98
  • General Skills / Warmed Up
    https://ithelp.ithome.com.tw/upload/images/20210927/20111429swq4p7mI8y.png
    這題馬上就用到進位制了,題目要求16進位轉10進位,
    所以寫一個 python 檔,用 int() 來轉換:

    # base.py
    print(int('0x3d', base=16))
    

    int() 轉換出來的必定是十進位整數

    這裡寫法很多種,
    因後面已指定 base 是16進位, 0x 就沒有必要:

    print(int('3d', base=16))
    

    還有這種,
    base=0 表示自動判斷,因為前面有 0x 就能得知是16進位:

    print(int('0x3d', base=0)) 
    

    int() 可填入數字字串,取決於用途,

    • 如果是用來小數整數,填入數字,如: int(3.14)
    • 如果是用來進制轉換 (必轉成10進位) ,有指定 base 的話 (包含 base=0) ,
      則需填字串,如: int('0b101', base=2)
      但如果不填入 base 則需填數字,如: int(0b101)

    執行:

    $ python base.py
    61
    

    將 61 用 flag 格式包住:
    picoCTF{61}


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

尚未有邦友留言

立即登入留言