HackYou CTF 2012 write-up

Hint: flag is not a frag: once you've got it, you can get one more...

PPC 100 и 300 были на быстрое распознавание каптчи. Первая вообще текстовая (сложить 2 числа), вторая -- распознать число, разложить на множители и выслать делитель. В обоих случаях ещё надо было отсылать токен.
Собственно, было полезно попрактиковаться, накодил ненаучное решение, заюзав в 300 тулзу tesseract-ocr и сервис factordb.com =)
Ответ выдавался в виде набора двоичных кодов ascii-символов флага.

Решение PPC100 на python 3:
Код:
from urllib.request import Request, urlopen
from re import search

wrong = 1

while( wrong ):
	resp = urlopen( Request( 'http://misteryou.ru/ppc100/' ) ).read()
	trueanswer = search( b"trueanswer' value='([^']*)", resp ).group( 1 ).decode()
	task = search( b'(\d*\s\+\s\d*)', resp ).group( 1 )
	answer = eval( task )
	query = 'captchatype=hugecaptcha&trueanswer=%s&answer=%s' % (trueanswer,answer)
	res = urlopen( Request( 'http://misteryou.ru/ppc100/', query.encode() ) ).read()
	try:
		res.index( b'ALERT' )
	except:
		wrong = 0

print( ''.join( [chr( int( x, 2 ) ) for x in search( b'is:<br> (.*)\n', res ).group( 1 ).split( b'<br> ' )] ) )

'''$ python3.2 ppc100.py
killallhumans'''
Решение PPC300 на Python 2:
Код:
from re import search
from urllib2 import urlopen, Request
from time import sleep
import subprocess
import tempfile

def ocr( image ):
	tmp = tempfile.NamedTemporaryFile()
	process = subprocess.Popen( [ 'tesseract', image, tmp.name ], stdout = subprocess.PIPE, stdin = subprocess.PIPE, stderr = subprocess.STDOUT )
	process.communicate()
	return open( tmp.name + '.txt', 'r' ).read()

def getfactor( num ):
	try:
		return search( '000000">(\d+)', urlopen( 'http://factordb.com/index.php?query=%s' % num ).read() ).group( 1 )
	except:
		sleep( 1 )
		return getfactor( num )

def tryit():
	resp = urlopen( 'http://misteryou.ru/ppc300/' ).read()
	trueanswer = search( "trueanswer' value='([^']*)", resp ).group( 1 )
	pic = 'http://misteryou.ru' + search( "src='(.*)'", resp ).group( 1 )
	tempFile = tempfile.NamedTemporaryFile()
	open( tempFile.name, 'w' ).write( urlopen( pic ).read() )
	num = search( '\d+', ocr( tempFile.name ) ).group( 0 )
	return urlopen( Request( 'http://misteryou.ru/ppc300/', 'captchatype=refactor&trueanswer=%s&answer=%s' % (trueanswer, getfactor( num )) ) ).read()

def main():
	wrong = 1
	while( wrong ):
		res = tryit()
		try:
			res.index( 'ALERT' )
		except:
			wrong = 0
	print( ''.join( [chr( int( x, 2 ) ) for x in search( 'is:<br> (.*)\n', res ).group( 1 ).split( '<br> ' )] ) )

if __name__ == "__main__":
	main()

'''$ python ppc300.py
kill_1_human
'''