2014年7月6日日曜日

Pwnium CTF 2014 Writeup

Programming 300 Crackme Fast




http://41.231.53.44:9393/に繋ぐとバイナリがダウンロードされる


LPCK?? なんだかよくわからなかったが下にMZがあったのでそこから下をすべて切り出す
実行するとパスワードが聞かれる
Password :
aa
Sorry ! Incorrect pass
IDAで開きstringsからSorry ! Incorrect passを探す


loc_40138Dのところで入力した文字とパスワードの比較をしているみたいだったので、
OllyDbgで見ることに

パスワードにaaaaaaaaを入れて実行
入力した文字とパスワードを比較しているところにブレイクポイントをうち値を確認

EAX 00000061 → a
ECX 0000006c → l

EAXに入力した文字が入り ECXにはパスワードが入るなのでECXの値を監視する

パスワードはlF{Oc0Mg

ファイルを実行し確認
Password :
lF{Oc0Mg
Good Boy ! Send That pass to server to get the Flag
ということで
http://41.231.53.44:9393/check.php?p=lF{Oc0Mg
アクセスするとToo late ! 遅いといわれる

問題文に
Send the password in less than 2 seconds

どうがんばっても人力だと5分くらいかかってしまうのでプログラムを書くことにした。

まずパスワードがどこに保存されているかバイナリをみて確認する

0x1310にそれっぽいものを発見。しかし正解のlF{Oc0Mgこの文字列とは違うということでIDAデ処理を確認すると 
パスワードの文字と1をxorしていた。
後はプログラムを書く


プログラムでやることまとめる
1、ファイルをダウンロード
2、ファイルから文字列を取得
3、1とxorする
4、パスワードを送り返す

#! c:/Python27/python.exe
# -*- coding: utf-8 -*-

import urllib2, cookielib

cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))

d=opener.open("http://41.231.53.44:9393/").read()[0x1310:0x1330].replace('\x00', '')
passwd=''.join(chr(ord(b)^0x1) for b in d)

print passwd
print opener.open("http://41.231.53.44:9393/check.php?p="+passwd).read()

Flag: Pwnium{b1a371c90da6a1d2deba2f6ebcfe3fc0}