페이지를 열면 섞인 단어 리스트가 나온다.
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()
'Python > 2.7 simple coding(+ c++)' 카테고리의 다른 글
Enigmagroup missions/programming 7 (0) | 2014.11.17 |
---|---|
hack this site Programming missions : Unscramble the words (0) | 2014.11.15 |
Enigmagroup missions/programming 4 (0) | 2014.11.09 |
Enigmagroup missions/programming 5 (0) | 2014.11.05 |
Enigmagroup missions/programming 3 (0) | 2014.11.03 |