문제로는 이상한 파일이 주어지지만 hex분석 결과, pdf파일, doc파일, python파일이 하나씩 들어있다.
pdf파일의 내용 : "no hint given"
doc파일의 내용 : "still no hint given"
python파일
#원본파일 pvcure="U51\\\'Hk2W&+(3M;Hkpk0Kkf\k13u\k014$I!E($E>\g/)E!\k01<.\k13,A-nC4Z4nEhT1-IhH0 ThU+n@0J=3E9\k01>(_0\k01,8P0Ek ThA6\"I|\k1rmXM3\k014$]}E!2\k1q4F?7\k1nh\k1skf\g_\k01kn\k13<Tk)E&Vc2W&\k0s93G#mw\k1p\k1nc\k13ex\k00t\k01r|\k13t\k19wh\k0on\k18wg\k02b+kn\k13h\k01kn\k13%F1/Th\k03\k1o.\\:A7.\\:A4b\k13\k0pA-3\k133Z9&\k13<Ek N2JwvM{QinK0Kwu\k136A6\"E!\k01\k07eP0c\k138n\k1qp22vrh\k161Sj+=-@0\k1oEn\k13h\k01(3M;HkpE\'S.f\k1p>Q!f\k13<Ek,M&E1/Gj+E"a =0 ;vzcbeg unfuyvo ,flf ; gel :xrl =flf .neti [1 ] rkprcg VaqrkReebe :flf .rkvg ("k\k9p\ks3A\knqG0G\kp8\kpq,.\kpr\kppXJ\kp8\kppFU,W/\k03\k00Z\k97\k07\\".qrpbqr ("zip")) s =trgngge (unfuyvo ,"k\k9p\kpoZ1\k05\k00\k02T\k01\k07".qrpbqr ("zip")) juvyr a <(5 *10 **6 ):xrl =(s (xrl ).qvtrfg ());a =a +1 xrl =xrl [:5 ].hccre () juvyr yra (xrl )<yra (pvcure ):xrl =xrl *2 cynva ="".wbva (znc (pue ,[beq (n )^beq (o )sbe n ,o va mvc (pvcure ,xrl )])) gel :rkrp cynva rkprcg :cevag "k\k9p\k0o/\kpn\kpsXJ\ks0A\knqG\k04\k00\k14q\k03k".qrpbqr ("zip"), erce(cynva) |
# 위의 코드->rot13 cipher="H51\\\'Ux2J&+(3Z;Uxcx0Xxs\x13h\x014$V!R($R>\t/)R!\x01<.\x13,N-aP4M4aRuG1-VuU0 GuH+a@0W=3R9\x01>(_0\x01,8C0Rx GuN6\"V|\x1ezKZ3\x014$]}R!2\x1d4S?7\x1au\x1fxs\t_\x01xa\x13<Gx)R&Ip2J&\x0f93T#zj\x1c\x1ap\x13rk\x00g\x01e|\x13g\x19ju\x0ba\x18jt\x02o+xa\x13u\x01xa\x13%S1/Gu\x03\x1b.\\:N7.\\:N4o\x13\x0cN-3\x133M9&\x13<Rx A2WjiZ{DvaX0Xjh\x136N6\"R!\x01\x07rC0p\x138a\x1dc22ieu\x161Fw+=-@0\x1bRa\x13u\x01(3Z;UxcR\'F.s\x1c>D!s\x13<Rx,Z&R1/Tw+R" n =0 ;import hashlib ,sys ; try :key =sys .argv [1 ] except IndexError :sys .exit("x\x9c\xf3N\xadT0T\xc8\xcd,.\xce\xccKW\xc8\xccSH,J/\x03\x00M\x97\x07\\".decode("zip")) f =getattr (hashlib, "x\x9c\xcbM1\x05\x00\x02G\x01\x07".decode("zip") while n <(5 *10 **6 ):key =(f (key ).digest ());n =n +1 key =key [:5 ].upper () while len (key )<len (cipher ):key =key *2 plain ="".join (map (chr ,[ord (a )^ord (b )for a ,b in zip (cipher ,key )])) try :exec plain except :print "x\x9c\x0b/\xca\xcfKW\xf0N\xadT\x04\x00\x14d\x03x".decode ("zip"), repr(plain) |
key를 md5로 만들고 앞의 5글자만으로 cipher과 xor연산한다. 그리고 그 결과가 plain이 되고 마지막에 이것을 실행하도록 되어있다.
나는 palin으로부터 역으로 key의 hash 5글자를 알아내는 방법으로 풀었다.(다만, 이 코드는 python 키워드 중에 5글자를 추측해야된다는 문제점이 있다...)
import array import sys, hashlib c = "H51\\\'Ux2J&+(3Z;Uxcx0Xxs\x13h\x014$V!R($R>\t/)R!\x01<.\x13,N-aP4M4aRuG1-VuU0 GuH+a@0W=3R9\x01>(_0\x01,8C0Rx GuN6\"V|\x1ezKZ3\x014$]}R!2\x1d4S?7\x1au\x1fxs\t_\x01xa\x13<Gx)R&Ip2J&\x0f93T#zj\x1c\x1ap\x13rk\x00g\x01e|\x13g\x19ju\x0ba\x18jt\x02o+xa\x13u\x01xa\x13%S1/Gu\x03\x1b.\\:N7.\\:N4o\x13\x0cN-3\x133M9&\x13<Rx A2WjiZ{DvaX0Xjh\x136N6\"R!\x01\x07rC0p\x138a\x1dc22ieu\x161Fw+=-@0\x1bRa\x13u\x01(3Z;UxcR\'F.s\x1c>D!s\x13<Rx,Z&R1/Tw+R"
a = str(sys.argv[1]) while len(a) < len(c): a *= 2
plain ="".join (map (chr ,[ord (q )^ord (w )for q ,w in zip (c,a)])) a = plain[:5]
while len(a) < len(c): a *= 2 plain ="".join (map (chr ,[ord (q )^ord (w )for q ,w in zip (c ,a )])) print str(plain) |
plain의 처음글자가 import라는 가정 하에 위의 코드를 실행시킨 결과 아래와 같이 나왔다.
import sys print "Key 2 = leetspeak(what do you call a file that is several file types at once)?" if len(sys.argv) > 2: if hash(sys.argv[2])%2**32 == 2824849251: print "Coooooooool. Your flag is argv2(i.e. key2) concat _3peQKyRHBjsZ0TNpu" else: print "argv2/key2 is missing" |
위의 코드가 문제파일에서 plain이고 이 코드를 문제파일 내에서 exec를 이용하여 실행하게 된다.
모든 코드를 종합해서 최종코드는 아래아 같다.
#!/usr/bin/env python import sys import hashlib cipher = "H51\\\'Ux2J&+(3Z;Uxcx0Xxs\x13h\x014$V!R($R>\t/)R!\x01<.\x13,N-aP4M4aRuG1-VuU0 GuH+a@0W=3R9\x01>(_0\x01,8C0Rx GuN6\"V|\x1ezKZ3\x014$]}R!2\x1d4S?7\x1au\x1fxs\t_\x01xa\x13<Gx)R&Ip2J&\x0f93T#zj\x1c\x1ap\x13rk\x00g\x01e|\x13g\x19ju\x0ba\x18jt\x02o+xa\x13u\x01xa\x13%S1/Gu\x03\x1b.\\:N7.\\:N4o\x13\x0cN-3\x133M9&\x13<Rx A2WjiZ{DvaX0Xjh\x136N6\"R!\x01\x07rC0p\x138a\x1dc22ieu\x161Fw+=-@0\x1bRa\x13u\x01(3Z;UxcR\'F.s\x1c>D!s\x13<Rx,Z&R1/Tw+R" try: key = sys.argv[1] #anything value except IndexError: sys.exit("x\x9c\xf3N\xadT0T\xc8\xcd,.\xce\xccKW\xc8\xccSH,J/\x03\x00M\x97\x07\\".decode("zip")) keyword = 'import' while len(keyword) < len(cipher): keyword *= 2 plain = "".join(map(chr, [ord(a) ^ ord(b) for a, b in zip(cipher, keyword)])) keyword = plain[:5] while len(keyword) < len(cipher): keyword = keyword * 2 plain = "".join(map(chr, [ord(a) ^ ord(b) for a, b in zip(cipher, keyword)])) try: exec plain except: print "x\x9c\x0b/\xca\xcfKW\xf0N\xadT\x04\x00\x14d\x03x".decode("zip"), repr(plain)
|
<입력>
파일명 [key] [key2] //key는 아무 값을 넣어도 되고 key2는 웹사이트에 제공된 힌트로 풀면 된다.
//key2 hint :: think outside the box= being several types at once like an animal that can change its color. =>카멜레온을 말하는듯...
<실행결과>----------------------------------------------------
C:\Users\blackcon\Desktop>zip_problem.py 1 1
Key 2 = leetspeak(what do you call a file that is several file types at once)?
--------------------------------------------------------------
key2는 leetspeak형식으로 적어라고 한다. (leetspeak 예 :: l33tsp3ak)
Chameleon => ch4m3l30n
<실행결과>---------------------------------------------------------
C:\Users\blackcon\Desktop>zip_problem.py 1 ch4m3l30n
Key 2 = leetspeak(what do you call a file that is several file types at once)?
Coooooooool. Your flag is argv2(i.e. key2) concat _3peQKyRHBjsZ0TNpu
------------------------------------------------------------------
flag : ch4m3l30n_3peQKyRHBjsZ0TNpu
'Security > [게임] CTF 풀이' 카테고리의 다른 글
2013 DefCamp writeups (0) | 2013.11.17 |
---|---|
hdcon 이벤트문제 1번, 3번 (0) | 2013.10.31 |
Hacklu 2013 Internal150 writeup (0) | 2013.10.25 |
Hacklu 2013 web200 writeup (0) | 2013.10.25 |
CSAW CTF 2013 Write Up (Reversing 200) (0) | 2013.09.24 |