문제를 보면 단어들이 뒤죽박죽 섞여있으며 순서대로 정렬 후 제출하면 성공합니다.


하지만 시간은 5초만 주어져있고 매번 글자는 랜덤하게 변경됩니다.

 

Coding level이니 만큼 알맞은 코드를 작성해서 전송하면 될것으로 보입니다.



Python을 주로 사용하기에 Python을 이용해서 문제를 풀었습니다.



① Cookie를 이용해 시도

처음에 생각했던 내용은 requests와 BeautifulSoup 모듈을 이용해 해당 페이지에 접근해서 데이터를 가져오는 방법이였습니다.


BeautifulSoup은 HTML과 XML을 파싱하는데 사용됩니다.


다음과 같이 Cookie 값을 이용해서 해당 페이지에 로그인된 상태로 접근하고 데이터를 가져와 전송해봤습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import requests
from bs4 import BeautifulSoup
 
cookies = {'PHPSESSID':'YourCookie'}    # 본인의 cookie 값 확인
url = 'https://www.hackthis.co.uk/levels/coding/1' 
 
req = requests.post(url, cookies=cookies)    # post 방식으로 cookie값을 가진채 페이지 요청
html = req.text        # 해당 페이지의 모든 html text 불러오기
 
soup = BeautifulSoup(html, 'html.parser')
textarea = soup.find('textarea')    # textarea 태그를 찾기
 
payload = textarea.string.split(', ')
payload.sort()
data = ", ".join(payload)
print(data)
requests.post(url, data=data)
cs



결과는 실패..


생각을 해보니 cookie 값을 가지고 url을 요청하다보면 데이터를 가져올 수 있지만


마지막에 다시 데이터를 보내기위해 requests.post 할 때 새로운 페이지가 열리게 되어 정렬해야할 값이 달라지는 것 같습니다



② selenium를 이용해 시도


브라우져를 컨트롤 할 수 있다는 selenium을 사용해 봤습니다.


submit 버튼을 클릭해야 겠다고 생각하여 버튼 클릭을 할 수 있는 모듈을 찾아보니 selenium으로 가능했습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from selenium import webdriver
 
url = 'https://www.hackthis.co.uk/levels/coding/1'
path = "chromedriver_win32/chromedriver.exe"    # Chrome Driver File
driver = webdriver.Chrome(path)
 
driver.get(url)
cookie = {'name':'PHPSESSID''value':'YourCookie'}
driver.add_cookie(cookie)
driver.get(url)
 
element = driver.find_element_by_xpath("//textarea")
textarea = element.get_attribute("value")
str(textarea)        # textarea type이 unicode이기에 변경 후 정렬
payload = textarea.split(', ')
payload.sort()
data = ", ".join(payload)
 
 
element = driver.find_element_by_name("answer")
element.send_keys(data)
 
#driver.find_element_by_id('submit').click()
cs


우선 마지막 라인 보시면 주석으로 해놨는데.. 버튼 클릭은 하다가 말았습니다.


대신 아래 사진을보시면 로그인도 잘 수행했으며 Answer에도 정확하게 값이 들어간 걸 확인할 수 있었습니다.


시간도 2초가량 남아서 그대로 그냥 Submit 버튼을 클릭했지만 로딩되는 시간이 길다보니 0초가 되어 성공하지 못했습니다.




③ Session을 이용!!


첫번째 쿠키를 이용했을때 느꼈던건 쿠키를 가지고는 못할 것 같다고 생각했으며


Session을 유지할 수 있다면 가능할 꺼란 생각에 다음과 같이 코등했습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import requests
from bs4 import BeautifulSoup
 
url = 'https://www.hackthis.co.uk/levels/coding/1'
 
LOGIN_INFO = {
    'username''YourID',
    'password''YourPWD'
}
 
with requests.Session() as s:
    login_req = s.post('https://www.hackthis.co.uk/?login', data=LOGIN_INFO)
 
    req = s.post(url)
    html = req.text
    soup = BeautifulSoup(html, 'html.parser')
    textarea = soup.find('textarea')
    
    payload = textarea.string.split(', ')
    payload.sort()
    data = ", ".join(payload)
    data = {'answer':data}
    print(data)
    s.post(url, data=data)
 
cs



결론적으로는 성공했으며 Session 유지도 잘 되었고 깔끔하게 되었습니다.


진짜 삽질도 많이했네요 .ㅜㅜ


근데 확인하고 싶은 내용은 ① 에 쿠키를 이용할 때 제가 놓쳤던 부분인데


③의 Line:22를 보시면 data = {'answer':data}를 한게 보일껍니다. 


쿠키를 이용할 때는 그냥 보내면 될꺼라는 생각에 보내기만 했는데 Session 할때 해보니깐


data를 보내도 answer에 적혀있는 데이터여야 정답처리가 된다는 것을 알아기에 다음과 같이 코딩 했습니다.


그런데 이미 completed가 되어 이게 되는지 안되는지 확인을 못하네요 .. ㅜ




[참고]

나만의 웹 크롤러 만들기: https://beomi.github.io/2017/01/20/HowToMakeWebCrawler-With-Login/

문과생도 할 수 있는 웹 크롤링: http://sacko.tistory.com/14?category=643535

Python selenium: https://selenium-python.readthedocs.io/navigating.html?highlight=add_cookie

'WarGame > hackthis.co.uk' 카테고리의 다른 글

[HackThis] Main level7  (0) 2018.08.29
[HackThis] Coding level2  (0) 2018.08.28
[HackThis] Crypt level5  (0) 2018.08.26
[HackThis] Crypt level4  (0) 2018.08.26
[HackThis] Crypt level3  (0) 2018.08.25

+ Recent posts