CTF 筆記

前言

近日來解 CTF 時,時常會用到一些工具及 python 的 module 因此先記下來作為日後參考用

Python modules

socket

  • 說明:

    • 解 ctf 幾乎是必用的一個 module,主要用來 create 一個 tcp 連線
    • 一般來說比 netcat 更為方便,更好送出 payload
    • 以下僅列出常使用的,其餘部分請參考官方文件
  • 使用方式:

    • class:
      • socket(family,type[,protocal])
    • family :
      • socket.AF_INET (IPV4)
      • socket.AF_INET6 (IPV6)
    • type :
      • socket.SOCK_STREAM (TCP)
      • socket.SOCK_DGRAM (UDP)
    • 範例:

      • 創立一個 TCP socket :

        sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        
      • 創立一個 UDP socket :

        sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
        
    • 函式:

      • sock.connect((host,port))
        • 與 host:port 建立連線
      • sock.recv(buffersize)
        • 接收 socket 所傳來的訊息,接收量為 buffersize
      • sock.send(string)
        • 發送訊息
      • sock.close()
        • 關閉 socket

struct

  • 說明:

    • 用來將數值以 binary 的方式輸出( ex:\x54\x01\x05\x08 ) ,原先主要是用來讀入 c 語言的 data ,轉成 python 看得懂的數值,詳情可參考官方文件
    • 製作 payload 時非常好用
    • 可指定要 little-endian 還是 big-endian
  • 使用方式:

    • 格式:

    • Byte Order

    • 函式:
    • struct.pack(fmt,v1,v2,...)

      • fmt 為上述格式,要輸出的字串格式,可加入 order
      • Ex :

        struct.pack("<I",0x8048580) //\x80\x85\x04\x08
        
    • struct.unpack(fmt,string)

      • fmt 為上述格式,並給入二進位的字串,即可取得原先數值
      • Ex :

        struct.unpack("<I","\x80\x85\x04\x08") //(134514048,) = 0x8048580
        

telnetlib

  • 說明:

    • 很久以前就有在用了,以前在當網管時常常使用它來管理各項設備,不過後來沒再用了,畢竟安全性上是一項問題,不過就單純的 telnet 連線來說,是個非常方便的 module,詳細的內容一樣可參考官方文件
    • 搭配 socket 可是 ctf 中很常用的方法,當在遠端成功執行 shell 時,需要靠它來保持連線
  • 用法:

    • class
      • telnetlib.Telnet([host[, port[, timeout]]]) #創立一個連到 host 的 telnet 物件
    • 函式:
      • Telnet.read_until(string)
        • 讀入 host 端傳來的訊息,直到讀到 string
      • Telnet.write(buffer)
        • 送出 buffer 的訊息到 host 端
      • Telnet.interact()
        • 使 telent 的控制權交給使用者,使連線像是直接遠端過去的命令互動模式
      • Telnet.close()
        • 關閉 telnet 連線
    • 範例:

      telnet = telnetlib.Telnet()
      telnet.sock = sock  #sock 為 socket 物件
      telnet.interact()
      

Tool

comments powered by Disqus