CTF 参加するにあたり、ざっくりと Python 知識のおさらい。
基本的なこととは言え、一般的なコーディングでは利用しないものも多いかと思う。
もくじ
Unicode 文字列
Unicode 文字列には、世界共通の番号が振られていますよね?知ってますよね?笑
- ord(‘文字’) で 該当する Unicode の値を取得
- chr(Unicode 値) から Unicode 文字列に変換
- 問題: [33258, 20998, 12391, 23432, 12428, 33] を Unicode 文字列にするとどうなるでしょうか?
- 標準関数の map(関数, リスト) を利用すると、簡単ですね。
- 回答: map(chr, [33258, 20998, 12391, 23432, 12428, 33]) で答えがでます。
文字列操作
文字操作は一般的によく使うので、知ってますよね?笑
- スライス:
- ‘abcdefg'[0] #先頭の文字
- ‘abcdefg'[-1] #末尾の文字
- ‘abcdefg'[0:3] #先頭から 3 文字目([3] は含まない!) の文字
- ‘abcdefg'[:3] #先頭 3 文字目([3] は含まない!) の文字
- ‘abcdefg'[3:] # 3 から末尾までの文字
- ‘abcdefg'[3:-1] # 3 から末尾 2 文字目([-1] を含まない!) の文字
- ‘abcdefg'[1:5:2] # 2 文字おきにで
- ‘abcdefg'[1::2] # 1 から末尾まで、2 文字おきの文字
- ‘abcdefg'[::-1] #末尾から最初の文字までの文字 (=反転)
- 分割:
- ’11 22 33 44 55′.split() #デフォルトは空白文字で分割
- ’11:22:33:44:55′.split(‘:’) #文字列指定するとそれが分割文字になる
- 連結:
- ‘ ‘.join([’11’, ’22’, ’33’, ’44’, ’55’]) #文字列リストを空白区切りでつなげる
- ‘:’.join([’11’, ’22’, ’33’, ’44’, ’55’]) #文字列リストをセミコロン(:)区切りでつなげる
- 置換:
- ’11:22:33:44:55′.replace(‘:’,”) #第一引数で指定した文字列を、第二引数の文字列に置換
- 問題:
数値操作: 2, 8, 16 進数
する事 | 2 進数 | 8 進数 | 16 進数 | 備考 |
---|---|---|---|---|
10進数値を○進数に変換 | bin(23) | oct(23) | hex(23) | |
○進数で表現されてる値を 10 進数に変換 | int('10111',2) | int('27',8) | int('17',16) | |
○進数で表現されてる値を 10 進数に変換(プレフィックス版) | ('0b10111', 0) | ('0o27', 0) | ('0x17', 0) | |
format() の第一引数の10進数値を、第二引数で○進数に指定 | format(27, 'b') | format(27, 'o') | format(27, 'x') | format(27, '7b') とすると 7 桁になるように表示 |
ハッシュ値
ハッシュ値は色々な場所で使いますので、知ってて損はないですね。
import hashlib をすることで、下記関数でハッシュ値が扱えるようになります。
- hashlib.md5(‘abc’).hexdigest()
- hashlib.sha1(‘abc’).hexdigest()
- hashlib.sha256(‘abc’).hexdigest()
- hashlib.sha512(‘abc’).hexdigest()
ファイル操作
テキストファイルやバイナリファイルなど、ファイルの中身を読み込む際に f.open() で読み込む場合、f.close() を忘れることがよくあります(よね?)。開いたらシステム的に勝手に閉じてほしいものです。
なので、そうしてくれる “with” ステートメントをぜひ使いましょ。
with open('ReadME.txt', 'r') as f:
while True:
line = f.readlie()
print(line, end='')
if not line:
break
socket 通信
requests モジュールなど使うと簡単に通信ができますが、もう少し低レベルで通信を行うには socket を利用します。
こちらが Google ページ (www.google.com) に接続するサンプルコードです。
import socket
server = 'www.google.com'
port = 80
# Getting Server IP
# server_ip = socket.gethostbyname(server)
# print(server_ip)
request = 'GET / HTTP/1.1\nHOST: ' + server + '\n\n'
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((server, port))
s.send(request.encode())
result = s.recv(1024)
print (result)
socket 通信では、バイトコードでのやりとりになるので、encode/decode を行うことを忘れないようにしましょ。
result の中身を print した際に b’文字列’ となっていることがわかります。
HTTP 通信
標準ライブラリ urllib やサードパーティツールの requests モジュールで通信ができます。
import urllib.request
url = 'https://www.google.com'
with urllib.request.urlopen(url) as f:
html = f.read()
print(html)
その他
出力結果を見やすくするときに便利です
- print(‘Start From Here’.center(30, ‘-‘))
IDE 使うとあまり使わないかもしれないですが、デバッグ中に便利です。
- print(locals())
- print(globals())
Python の基本中の基本でしたが、モジュールなどもこれから紹介していきます!