phone that evil
挑战地址,点我
分析
图片上一个电话,下面还有一行提示 phone that evil
。
右键查看网页源码,可以看到一个 phonebook.php
,这是电话本
。
打开可以看到是一个类似 xml 的东西,但是报错了。
<?xml version="1.0"?>
<methodResponse>
<fault>
<value>
<struct><member><name>faultCode</name>
<value><int>105</int></value>
</member>
<member>
<name>faultString</name>
<value><string>XML error: Invalid document end at line 1, column 1</string></value>
</member>
</struct>
</value>
</fault>
</methodResponse>
这里其实一个 xml-rpc
协议。xml-rpc
是基于 xml
的远程过程调用(rpc: remote procedure call)。
关于 rpc
和 xml-rpc
可以文章末尾的参考资源。
python 中的 xmlrpc 包 实现了相关功能。
我们先使用 xmlrpc.client 看看服务端都提供了那些接口。
#!/usr/bin/env/ python3
import xmlrpc.client
with xmlrpc.client.ServerProxy("http://www.pythonchallenge.com/pc/phonebook.php") as proxy:
print(proxy.system.listMethods())
输出结果:
['phone', 'system.listMethods', 'system.methodHelp', 'system.methodSignature', 'system.multicall', 'system.getCapabilities']
可以看到其中有个 phone
接口。我们看下这个接口的帮助信息:
#!/usr/bin/env/ python3
import xmlrpc.client
with xmlrpc.client.ServerProxy("http://www.pythonchallenge.com/pc/phonebook.php") as proxy:
print(proxy.system.methodHelp('phone'))
print(proxy.system.methodSignature('phone'))
输出结果:
Returns the phone of a person
[['string', 'string']]
可以看到 phone
这个接口就是用来 打电话给某一个人
,调用这个接口需要传入一个 string
参数指定给谁打电话,成功了会返回一个 string
。
现在清楚了怎么打电话,那么需要打电话给谁的? 根据提示 phone that evil
,这里的 evil
是谁呢?
联想到上一关中出现了很多的 evil
的图片,evil1.jpg, evil2.jpg, evil3.jpg, evil4.jpg, evil5.jpg,。
其中 evil1.jpg, evil2.jpg, evil3.jpg 都是一些图片,evil3.jpg 上面提示 no more evils...
。
evil5.jpg 打开是 404,evil4.jpg
打开出现了错误看不到图片,但不是 404,说明 evil4.jpg
中是有内容的。
我们使用 urllib
包读取内容看下:
#!/usr/bin/env/ python3
import urllib.request
import pickle
url = "http://www.pythonchallenge.com/pc/return/evil4.jpg"
# http basic 认证,第 8 关之后都需要认证
passwdmgr = urllib.request.HTTPPasswordMgrWithDefaultRealm()
passwdmgr.add_password(None, "http://www.pythonchallenge.com", "huge", "file")
httpauth_handler = urllib.request.HTTPBasicAuthHandler(passwdmgr)
opener = urllib.request.build_opener(httpauth_handler)
urllib.request.install_opener(opener)
with urllib.request.urlopen(url) as f:
print(f.read().decode("utf-8"))
输出内容:
Bert is evil! go back!
尝试下给 Bert
打电话:
#!/usr/bin/env/ python3
import xmlrpc.client
with xmlrpc.client.ServerProxy("http://www.pythonchallenge.com/pc/phonebook.php") as proxy:
print(proxy.phone('Bert'))
输出结果:
555-ITALY
使用 ITALY
替换 url
提示:
SMALL letters.
那么 italy
替换 url 就是下一关的入口 http://www.pythonchallenge.com/pc/return/italy.html
参考资源: