###### tags: `InterKosenCTF2020`
# [InterKosenCTF2020] limited
pcapファイルが渡される。
ぱっとみ、sqlのクエリをたくさん送ってるのが気になる。
![](https://i.imgur.com/rUbdbAH.png)
urlデコードしてみると、`http://moxxie.tk:8080/search.php?keyword=&search_max=(SELECT unicode(substr(secret, 2, 1)) FROM account WHERE name="admin") % 11`といった感じになっている。どうやら`secret`を1文字ずつ取得し、任意の値でmodをとった値が`search_max`へと渡されているっぽい。だいたい、1文字につき3〜4つの値でmodが取られているので、中国人剰余定理で求められる。
あとは、`search_max`の値で変わる情報がテーブル周りなのでそれをもとに`seacrh_max`の値を取得する(`th`使った)。
```python=
from scapy.all import *
from scapy.layers.http import *
from bs4 import BeautifulSoup
from collections import defaultdict
from ptrlib import chinese_remainder_theorem
import urllib.parse
import re
def get_requests_url():
urls = []
packets = sniff(offline="./packet.pcap", session=TCPSession)
for packet in packets:
if not packet.haslayer("IP"):
continue
if packet[IP].dst != "10.128.0.2":
continue
if packet.haslayer("HTTPRequest"):
request = packet.getlayer("HTTPRequest").fields
urls.append(request["Path"])
return urls
def get_response_data():
datas = []
packets = sniff(offline="./packet.pcap", session=TCPSession)
for packet in packets:
if not packet.haslayer("IP"):
continue
if packet[IP].src != "10.128.0.2":
continue
if packet.haslayer("HTTPResponse") and packet.haslayer("Raw"):
raw = bytes(packet.getlayer("Raw"))
datas.append(raw)
return datas
urls = get_requests_url()[5:-4]
print("[+] urls:", len(urls))
datas = get_response_data()[5:-4]
print("[+] datas:", len(datas))
d = defaultdict(list)
p = re.compile(r"\(SELECT unicode\(substr\(secret, (\d+), 1\)\) FROM account WHERE name=\"admin\"\) % (\d+)")
for url, data in zip(urls, datas):
url = urllib.parse.unquote_plus(url.decode())
soup = BeautifulSoup(data, "html.parser")
hits = len(soup.find_all("th")) - 3
a, b = p.findall(url)[0]
print(f"[+] {a}: x % {b} = {hits}")
d[a].append([int(hits), int(b)])
flag = b""
for i in range(1, 50):
flag += bytes([chinese_remainder_theorem(d[str(i)])[0]])
print(flag)
```
`KosenCTF{u_c4n_us3_CRT_f0r_LIMIT_1nj3ct10n_p01nt}`
方針すぐにたったけど、ライブラリてんこ盛りプログラミングに時間がかかった…