Python/2.7 simple coding(+ c++)

Enigmagroup missions/programming 6

qkqhxla1 2014. 11. 9. 18:56

페이지를 열면 섞인 단어 리스트가 나온다.


ex)

o)orrcspao ls a lte p(mfslntmmptiire
punes rocoe
ggnaostrheay
acinkkb
eDBSnop
eEuSponS
oeskoiigopcinno
gpmoegr inua
ecle aknnrip
nardviam
rtroten
ielntuvylairb
ncionlqitsej
gaop)D ( d nPtfoehi
cgM( ae)nmeihalxX 
SBl etner)ud os aDefboh(ce
taoieln t (rse)PclpfrTofFro
honkgio
)f(pone
utppscrfeut


http://www.enigmagroup.org/missions/programming/6/keywords.txt에 사전 파일이 있고,


저 섞인 단어들을 재배열해서 사전 파일과 맞는 단어가 나오면 그게 정답이다.


저 위의 단어들을 전부 재배치해서 사전 파일의 단어로 만든 후


"anagram=foo,bar,baz,biz&submit=true" 와 같은 형식으로 


http://www.enigmagroup.org/missions/programming/6/submit.php 에 POST방식으로 보내면 된다.


어떻게 할까 생각하다가 각 단어의 문자 갯수를 가지고 풀기로 했다. 예로 abcde라는 단어는 한개이고,


bdeca같이 a가 1개, b가 1개, c가 1개, d가 1개인 단어는 abcde가 맞을 것이다. 


파이썬의 사전으로 풀었다. 저 페이지의 keywords.txt파일의


단어들 전부를 조각조각 분해했다. 예로 keywords.txt파일의 첫번째 단어인


hypertext markup language (HTML) 는.




처럼 분해했다. 이런식으로 keywords.txt파일의 단어 전부를 하나하나 나눈 후에 갯수가 몇갠지 적어서


각각 사전에 다 넣었고, 페이지에서 저 섞인 단어 리스트를 가져와서 또다른 사전에 넣은 후


원래 사전과 비교해서 해당 단어의 갯수가 맞으면 똑같은 문자열로 인식해서 하는 방법으로 코드를


짰다.


import urllib2
#사전 파일 전부 dic변수에 넣음.
dic = """hypertext markup language (HTML)
php hypertext preprocessor (PHP)
enigma group
assembly language
nullbyte (%00)
sql injection
cross site scripting (XSS)
cross site request forgery (CSRF)
carriage return line feed (CRLF)
rooting
buffer overflow (BoF)
code auditing
black hat
white hat
red hat linux
ubuntu
kubuntu
xubuntu
edubuntu
gentoo
debian
slackware
backtrack
openSuSE
fedora core
linuxmint
mandriva
trixbox
knoppix
damn vulnerable linux (DVL)
damn small linux (DSL)
winblowz
internet exploder
firefox
iceweasil
adamantix
pingOO
xandros
freeBSD
openBSD
netBSD
linus torvalds
bill gates
steve jobs
structured query language (SQL)
ethereal
wireshark
advanced packaging tool (APT)
redhat package management (RPM)
proof of concent (PoC)
graphics draw library (GD)
cookie poisoning
form poisoning
union all select
curl library
secure sockets layer (SSL)
secure shell (SSH)
file transfer protocol (FTP)
domain name service (DNS)
dynamic host configuration protocol (DHCP)
mail exchange (MX)
post office protocol (POP)
simple mail transfer protocol (smtp)
mail spoofing
captcha
optical character recognition (OCR)
programming challenges
practical extraction and reporting language (PERL)
visual basic
vbscript
zohh emmm exxx (zomx)
compression
kickban
/gline
/kline
hackers
hackers 2 - operation takedown
hackers 3 - antitrust
brute force
quick and dirty (QnD)
quick and nasty (QnN)
berkeley system distribution (BSD)
polymorphism
cookie monster
kernel panic
blue screen of death (BSoD)
code crunching
cyberpunk
cypherpuck
message-digest algorithm 5 (MD5)
secure hash algorithm 1 (SHA1)
vigenere
cryptography
steganograhy
hooking
microshit (M$)
msDoNT
denial of service (DoS)
distributed denial of service (DDoS)
ping of death (PoD)
directory traversal
filter bypass
base64
obfuscated
evilsite
spyware
adware
malware
virus
robots.txt
require_once
fopen()
search and destroy
stfuppercut
social engineering (SE)
phishing
pharming
easter egg (./youfoundme.php)
swap space
sysadmin
telnet
bindshell
egshell
fuckthewhitehatmovement
content management system (CMS)
webmin
phpmyadmin
port scanning
war driving
war dialing
fingerprinting
forensics
footprinting
steganography
cryptology
encryption
decryption
cyper
decypher
full path disclosure (FPD)
ircbot
backdoor
firewall
bastion host
pfSense
m0n0wall
javascript
object oriented programming (OOP)
sun microsystems
cracker
intrusion detection system (IDS)
cascading style sheets (CSS)
front end
back end
for the win (FTW)
for the lose (FTL)
omg (Oh My God)
lmao (laughing my ass off)
rofl (rolling on the floor laughing)
blackhat takeover
whitehat wars
internet relay chat (IRC)
cpanel
crytogram
macintrash
torrent
internet protocol (IP)
subnet mask
default gateway
network address
network address translation (NAT)
reservations
exclusions
red herring
operating system (OS)
sourceforge
open source
pseudonym
black market
credit card trade
zero day (0day)
exploit
vulnerability
full disclosure
python
ruby
beatrix
acunetix
brute force and ignorance (BFI)
repository
safemode
basedir restrictions
unix
linux
centOS
wysiwyg
wysiayg
black box
beige box
phreaking
liveCD
grand unified bootloader (GRUB)
azureus
gnu object model environment (GNOME)
k desktop environment (KDE)
google d0rking
h4x0r
haxxor
hacksaw
whitehats-arent-hackers
blackhats-are-hackers
ezines
site missions
articles
wikistyle
tableless design
happy hacking
pc out
local area network (LAN)
metropolitan area network (MAN)
wide area network (WAN)
wireless local area network (WLAN)
prism2
packet injection
"""

dic = dic.split('\n') #줄내림을 기준으로 단어를 분리함.
dictonary = [{} for i in range(0,224)] #사전을 단어 갯수만큼 만듬. dic의 갯수가 224개.
for i in range(0,224):
    count = [0 for k in range(0,60)] #A~Z, a~z, (,)까지 갯수를 셀 리스트. 그냥 넉넉하게 60개 만들었다.
    for j in range(0,len(dic[i])): #한단어의 한문자씩 돌아가면서 카운트
        if dic[i][j]=='(':
            count[58] += 1
        elif dic[i][j]==')':
            count[59] += 1
        elif dic[i][j]!=' ':
            count[ord(dic[i][j])-65] += 1
    for j in range(0,58):
        dictonary[i][chr(j+65)]=count[j]
    dictonary[i]['(']=count[58]
    dictonary[i][')']=count[59]
#dictonary에는 keywords.txt의 각 단어에 각각의 문자가 몇개 들어있는지 사전파일로 저장되어있다. 224개의 단어에 대한 사전파일이 들어가있음.

req = urllib2.Request('http://www.enigmagroup.org/missions/programming/6/')
req.add_header('cookie','enigmafiedV4=내 쿠키')
page = urllib2.urlopen(req).read()
page = page[page.find('7">')+4:page.find('

')].split('
\n') #print page #여기에는 페이지에서 가져온 섞인 단어가 들어있다. 궁금하면 출력.. scramble = [{} for i in range(0,len(page))] #페이지의 단어 갯수만큼 사전을 만듬. for i in range(0,len(page)): #위와 비슷한 알고리즘. count = [0 for k in range(0,60)] for j in range(0,len(page[i])): if page[i][j]=='(': count[58] += 1 elif page[i][j]==')': count[59] += 1 elif page[i][j]!=' ': count[ord(page[i][j])-65] += 1 for j in range(0,58): scramble[i][chr(j+65)]=count[j] scramble[i]['(']=count[58] scramble[i][')']=count[59] #scramble에는 페이지에서 가져온 각각 섞인 단어들의 문자의 개수가 써있다. dictonary에는 제대로된 사전파일의 문자개수, scramble에는 페이지에서 가져온 섞인 단어들의 문자개수. answer = [] for i in range(0,len(scramble)): #섞인 단어 개수만큼 반복하면서 for j in range(0,224): #사전파일의 단어를 섞인 단어와 한개씩 비교한다. for k in range(0,58): #각각 문자 개수가 맞는지 비교. if scramble[i][chr(k+65)]!=dictonary[j][chr(k+65)]: #서로 틀리면 그냥 끝냄. break elif k==57: #똑같으면 answer리스트에 추가함. answer.append(dic[j]) #print answer,'\n' data = 'anagram=' #data에는 anagram=foo,bar,baz,biz&submit=true 같은 형식의 문자열을 만들기 위함. for i in range(0,len(answer)): data += answer[i] if i==len(answer)-1: break data += ',' data += '&submit=true' #print data,'\n\n' req = urllib2.Request('http://www.enigmagroup.org/missions/programming/6/submit.php',data) req.add_header('cookie','enigmafiedV4=내 쿠키값') print urllib2.urlopen(req).read()