티스토리 뷰

728x90
반응형

Emdee five for life - 문제 개요

처음 접속하면 위와 같이 나오는데요. 언뜻 보면 주어진 문자열을 MD5 암호화해서 input 입력란에 입력하고 Submit 버튼을 누르면 되는 걸로 보입니다.

# md5.py
import hashlib

string = "95FsH2OPEIf6NGnXvDTF".encode("utf-8")
enc = hashlib.md5()
enc.update(string)
encText = enc.hexdigest()

print(encText)

Python 코드로 위에 나오는 문자열을 md5 암호화 해서 출력된 값은 다음과 같습니다.

C:\Users\Domdom>python md5.py
71916fb0702e0f4d9d56f3c733854e24

그리고 이 암호화한 문자열을 input 입력란에 입력하고 Submit 버튼을 눌렀더니 다음과 같이 나옵니다.

너무 느리다고 하네요. 그래서 크롤링 때 써먹었던 BeautifulSoup 을 이용해서 페이지가 로딩되자마자 바로 위에 출력되는 문자열을 가져온 다음에, 즉시 md5 암호화 후 post request로 submit 해보도록 하겠습니다.

import requests as req
from bs4 import BeautifulSoup
import hashlib

url = "http://138.68.162.166:30258/"
# 새로고침 할 때마다 문자열이 달라집니다. 
# 그러므로 동일한 세션에서 문자열을 가져와서 암호화해서 보내야합니다.
res = req.get(url, headers={
	"cookie": "PHPSESSID=g6rq677fs6el96ehrf73tvrvp7"
})

# 문자열 추출
soup = BeautifulSoup(res.text, 'lxml')
string = soup.select('h3')[0].text.encode("utf-8")

# 암호화
enc = hashlib.md5()
enc.update(string)
encText = enc.hexdigest()

# 암호화된 문자열 전송
res2 = req.post(url, headers={
	"cookie": "PHPSESSID=g6rq677fs6el96ehrf73tvrvp7"
}, data={
	"hash": encText
})

# Flag 값 추출 후 출력
soup2 = BeautifulSoup(res2.text, 'lxml')
print(soup2.select('p')[0].text)

위와 같이 하면 인터넷환경에 따라 너무 느려졌을 경우 Too slow 가 나올 수 있지만, 일반적으로 Flag 값이 잘 나옵니다.

 

근데 왠만하면 BeautifulSoup 라이브러리 쓰지 않고 단순히 request 모듈만 사용해서 푸는 것이 더 좋습니다. 왜냐하면 BeautifulSoup 을 사용하게 되면, 아무리 빠른 알고리즘을 사용하더라도 res.text 에서 'lxml' 방식으로 다시 문자열들을 재구성하는 데서 시간이 꽤 걸리기 때문에 가끔 too slow가 나타나기도 하기 때문입니다.

 

- 끝 -

728x90
반응형
댓글