• Skip to main content
  • Skip to primary sidebar

自分で守れ!

個人情報はダダ漏れ。

現在の場所:ホーム / misc / CTF でよく使う Python コマンド

CTF でよく使う Python コマンド

2018年7月2日

CTF 参加するにあたり、ざっくりと Python 知識のおさらい。

基本的なこととは言え、一般的なコーディングでは利用しないものも多いかと思う。

もくじ

  • Unicode 文字列
  • 文字列操作
  • 数値操作: 2, 8, 16 進数
  • ハッシュ値
  • ファイル操作
  • socket 通信
  • HTTP 通信
  • その他

Unicode 文字列

Unicode 文字列には、世界共通の番号が振られていますよね?知ってますよね?笑

  • ord(‘文字’) で 該当する Unicode の値を取得
  • chr(Unicode 値) から Unicode 文字列に変換
  • 問題: [33258, 20998, 12391, 23432, 12428, 33] を Unicode 文字列にするとどうなるでしょうか?
    • 標準関数の map(関数, リスト) を利用すると、簡単ですね。
    • 回答: map(chr, [33258, 20998, 12391, 23432, 12428, 33]) で答えがでます。

文字列操作

文字操作は一般的によく使うので、知ってますよね?笑

  • スライス:
    1. ‘abcdefg'[0] #先頭の文字
    2. ‘abcdefg'[-1] #末尾の文字
    3. ‘abcdefg'[0:3] #先頭から 3 文字目([3] は含まない!) の文字
    4. ‘abcdefg'[:3] #先頭 3 文字目([3] は含まない!) の文字
    5. ‘abcdefg'[3:] # 3 から末尾までの文字
    6. ‘abcdefg'[3:-1] # 3 から末尾 2 文字目([-1] を含まない!) の文字
    7. ‘abcdefg'[1:5:2] # 2 文字おきにで
    8. ‘abcdefg'[1::2] # 1 から末尾まで、2 文字おきの文字
    9. ‘abcdefg'[::-1] #末尾から最初の文字までの文字 (=反転)
  • 分割:
    1. ’11 22 33 44 55′.split() #デフォルトは空白文字で分割
    2. ’11:22:33:44:55′.split(‘:’) #文字列指定するとそれが分割文字になる
  • 連結:
    1. ‘ ‘.join([’11’, ’22’, ’33’, ’44’, ’55’]) #文字列リストを空白区切りでつなげる
    2. ‘:’.join([’11’, ’22’, ’33’, ’44’, ’55’]) #文字列リストをセミコロン(:)区切りでつなげる
  • 置換:
    1. ’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 の基本中の基本でしたが、モジュールなどもこれから紹介していきます!

カテゴリー: misc
タグ: ctf, python

最初のサイドバー

Who Am I

IT が発達し便利な世の中になっているが、セキュリティリスクも同時に増えています。自分の身は自分で守りましょ。
お問い合わせはこちらから。

Search

最近の投稿

  • CTF でよく使う Python コマンド
  • セキュリティ関連で参考にしたいサイト

アーカイブ

  • 2018年7月
  • 2018年6月

カテゴリー

  • misc

Tags

ctf python

Privacy Policy and Terms of Use
Copyright © 2025 · All rights reserved.