バランスを取りたい

よくCTFの記事を書きます

RuCTF 2014 Writeup (Crypto 100)

100. MD5

Server (python27.quals.ructf.org:12337) accepts only authorized messages.
It works like this:

	buf = c.recv(4096)
	digest, msg = buf.split(" ", 1)
	if (digest == md5(password+msg).hexdigest()):
		#here I send a secret
	else:
		c.send("Wrong signature\n")

You have intercepted one authorized message: "b34c39b9e83f0e965cf392831b3d71b8 do test connection". Construct your own authorized message! Answer starts with 'RUCTF_'

Length extension attackを知ってるかどうかが勝負の分かれ目らしい。
IRCで変な質問してる人がいたりして面白かったです(真顔


この手の攻撃で知ってるツールはHashPumpだけだったのでそれでなんとかしました。
結果下見たいなコードになったんですが、Pythonほとんど書いたことが無くて文字列の処理周りでめっちゃ大変なことになってます。
あと、文字列周りでエラー吐く可能性があったんですが何事も無く動いたのでそのままです。

import socket
import time
import commands

host = "python27.quals.ructf.org"
port = 12337

known_sig = "b34c39b9e83f0e965cf392831b3d71b8"
known_text = "do test connection"

def test(sign, text):
  sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM);
  sock.connect((host, port))
  
  data = sign + " " + text
  sock.send(data)
  time.sleep(0.1)
  return sock.recv(4096)

for i in range(1,32):
  cmd = "/Users/rex/CTF/tools/HashPump/HashPump"
  cmd += " -s " + known_sig
  cmd += " -d \"" + known_text + "\""
  cmd += " -k " + str(i)
  cmd += " -a " + "AAAA"
  sign, text = commands.getoutput(cmd).split('\n')
  a, b = text.split('\\x80')
  b = b[:-4].replace('\\x','').decode('hex')

  data = a + '\x80' + b + 'AAAA'
  res = test(sign, data)
  print str(i) + ': ' + res
  if not 'Wrong' in res:
    break