CTF | wargame

Alexctf / unVM me (파이썬 디컴파일 uncompyle, md5 해쉬데이터 조회)

nopdata 2017. 3. 11. 04:28
date : `17.02


If I tell you what version of python I used .. where is the fun in that?

pyc파일 하나가 주어진다. pyc는 파이썬 소스코드의 컴파일 버전이며 소스코드를 바로 볼 수 없다. 하지만 간단하게 디컴파일이 가능하다.
이전에 pox암호문제를 풀 때 사용했던 uncompyle2를 사용하였다. http://nopdata.tistory.com/198

uncompyle2를 파이썬 콘솔 내에서 사용하는 방법으로 사용하였다. (일반 커맨드 사용도 가능하다.

1
2
3
4
5
from uncompyle2 import uncompyle_file
 
= open('unvm_me.py','wb')
uncompyle_file('unvm_me.pyc',outstream=f)
f.close()
cs

이렇게 하면 소스코드를 바로 얻을 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#Embedded file name: unvm_me.py
import md5
md5s = [174282896860968005525213562254350376167L,
 137092044126081477479435678296496849608L,
 126300127609096051658061491018211963916L,
 314989972419727999226545215739316729360L,
 256525866025901597224592941642385934114L,
 115141138810151571209618282728408211053L,
 8705973470942652577929336993839061582L,
 256697681645515528548061291580728800189L,
 39818552652170274340851144295913091599L,
 65313561977812018046200997898904313350L,
 230909080238053318105407334248228870753L,
 196125799557195268866757688147870815374L,
 74874145132345503095307276614727915885L]
print 'Can you turn me back to python ? ...'
flag = raw_input('well as you wish.. what is the flag: ')
if len(flag) > 69:
    print 'nice try'
    exit()
if len(flag) % 5 != 0:
    print 'nice try'
    exit()
for i in range(0len(flag), 5):
    s = flag[i:i + 5]
    if int('0x' + md5.new(s).hexdigest(), 16!= md5s[i / 5]:
        print 'nice try'
        exit()
 
print 'Congratz now you have the flag'
cs

소스코드는 md5로 해쉬화된 데이터들이 있고, 이 값을 다시 얻어주면 된다.

Flag :  ALEXCTF{dv5d4s2vj8nk43s8d8l6m1n5l67ds9v41n52nv37j481h3d28n4b6v3k}