War game/pythonchallenge

pythonchallenge level13

badcob 2009. 10. 22. 20:30


http://www.pythonchallenge.com/pc/return/disproportional.html

call him.,  
전화를 걸라는 것인가?
소스를 보면 그림의 중간 부분에
http://www.pythonchallenge.com/pc/phonebook.php 로
링크가 걸려 있는 걸 알 수 있다. 링크를 클릭해보면 XML error 메세지가 나온다.

해본게 도둑질이라고 phonebook.php 페이지에서 파라미터를 조작해서 넣어보았지만 같은 메세지만
나오더라.
이럴 땐 역시 포럼. 포럼에서 미국에서 phonebook에 대한 설명을 읽다보니 먼가 감이 왔다.

먼저 Python XML 관련 모듈들을 디벼보았다. Python에서 XML 프로그래밍 이라는 글이 눈에 띈다.
(http://coding-free.com/jython/tutor/python-xml.pdf)

아 이런 XML을 핸들링 할때는 이런 모듈이 쓰이는구나..
그러나 예제를 보면서 코드를 만지다보니 이게 아니다 싶었다. 단순히 XML 파일을 파싱하는 것이 아니라
XML 형식의 데이터를 주고 받아야 하기 떄문이었다,

XML에 대해서 먼저 알 필요가 있을거 같아서 xml 관련 정보를 찾다 다음 2개의 링크를 볼 수 있었다.

KLDP Wiki           XML-RPC HOWTO
SIRINI님의 블로그 XML-RPC에 관한 시덥잖은 고찰

올커니. XML-RPC!! 파이썬에는 XML-RPC 클라이언트에서 사용하는 xmlrpclib 라는 모듈이 있다.
xmlrpclib — XML-RPC client access

이 녀석을 이용해서 문제를 해결해보자. 먼저 문제 페이지에는 phone that evil 이라고 적혀있다. 
level12에서 gfx 파일을 받다가 우연찮게 본 파일에 Evil 이 누구인지 적혀 있었다.
(http://www.pythonchallenge.com/pc/return/evil4.jpg)

누구에게 걸어야 될지를 알았다. 이제 이 값을 전화번호부 페이지로 보내보자.
(서버에 등록된 메소드는 ServerProxy 객체의 ListMethods 를 통해 알 수 있다.)

import xmlrpclib

name = 'Bert'
proxy = xmlrpclib.ServerProxy('http://www.pythonchallenge.com/pc/phonebook.php')
print 'method %s' % (proxy.system.listMethods())
print 'phone number %s' % str(proxy.phone(name))


위의 스크립트를 실행하면 555-ITALY 가 찍힌다. 이게 답인가 싶어 넣어봤지만 없는 페이지라고 나오던 중
italy를 쳐봤더니 다음 레벨을 볼 수 있었다. (찾느라 한참 삽질을 -_-;;)

http://www.pythonchallenge.com/pc/return/italy.html