본문 바로가기
Security/[게임] CTF 풀이

Hacklu CTF 2013 Inernal200 writeup

by blackcon 2013. 10. 25.
728x90

문제로는 이상한 파일이 주어지지만 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


728x90

'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