2021.01.21


오늘은 지난주에 보았던 면접에 이어 다시 한 번 면접을 보게 되었고, 면접장을 나서 집에 가려던 찰나에 합격 통보를 받게 되었다. 그래서 결과적으로 다음 주 월요일부터 바로 출근을 하게 되었다. 지금까지 학생으로만 살아와서 그런지 직장인이 되었다는게 아직까지도 체감이 잘 안되면서도 다음 주부터 내가 어떤 일을 하게 될지 벌써부터 기대가 된다.

한편으로는 앞으로 일일커밋을 어떻게 해야할지에 대한 고민이 필요하다. 현실적으로 다음 주부터는 지금처럼 일일커밋에 많은 시간을 할애하기가 어려울 것이다. 물론 일일커밋을 그만 두거나 쉰다는 것은 아니고, 회사의 일과 병행하면서 일일커밋을 통해 나름대로 의미 있는 성취를 거둘 수 있는 방법을 찾아봐야겠다.

아무튼, 오늘은 일단 문제 풀이를 할거다. 내일부터는 뭐할지 나도 모르겠다.

Webhacking.kr - web-01(old-01) (Web(php), 200pts)

한동안 리버싱만 많이 한 것 같아서 오늘은 웹을 공부하고자 Webhacking.kr 문제를 가져와보았다. 첫 번째 문제라 그런지 비교적 쉬운 문제라고 생각된다.

우선 문제 페이지에 들어가면 아래 [그림 1]과 같은 화면을 볼 수 있다.

[그림 1] web-01


검은 바탕에 딱 3줄이 들어있는 매우 심플한 페이지이다. 여기서 더 볼 것은 가장 아래에 있는 ‘view-source’ 밖에 없으니 그것을 클릭하면 아래 [그림 2]와 같은 코드를 확인할 수 있다.

[그림 2] web-01 source


보다시피 코드의 길이가 상당히 짧은 편인 것을 볼 수 있다. 여기서 살펴봐야 할 부분은 알록달록한 색으로 되어 있는 php 코드이다. 우선 SetCookie() 함수를 통해 ‘user_lv’ 쿠키를 설정하고 그 값을 1로 둔다. 이후 user_lv의 값이 5 초과 6 미만일 때 solve(1) 함수를 실행하며, 그 외의 경우에는 값이 1로 변경된다.

정황상 solve(1) 함수가 이 문제를 풀게 해주는 함수로 보인다. 그렇다면 앞서 확인한 것처럼 user_lv의 값을 적절한 값으로 바꾸어 solve(1) 함수를 실행시켜주면 된다. 쿠키를 바꾸는 것은 여러 방법이 있지만, 나는 브라우저를 통해 간단히 쿠키를 바꾸어보았다.

참고 : 아래 풀이는 Chrome 87.0.4280.141을 이용하여 풀이하였음

다시 문제 페이지로 돌아간 후, 아래 [그림 3]과 같이 해당 페이지에서 ‘F12’를 눌러 개발자 도구를 연다.

[그림 3] 개발자 도구


이후 상위의 탭들 중 ‘Application’을 누른 뒤, 좌측 중단에 있는 ‘Cookies’를 눌러 해당 페이지에서 사용하는 쿠키들을 확인한다.

[그림 4] Application - Cookies


이어서, 해당 창에서 ‘user_lv’의 Value([그림 4]에서는 1로 되어있다) 부분을 클릭 후 해당 값을 앞서 확인한 조건 대로 5 초과 6 미만의 값으로 설정한다. 어렵게 생각할 것 없이 그냥 5와 6 사이의 유리수를 집어넣으면 된다. 나는 아래 [그림 5]와 같이 ‘5.5’를 입력하였다.

[그림 5] 5.5


이렇게 바꾼 상태에서 새로고침을 하면…

[그림 6] pwned


위 [그림 6]과 같이 문제가 풀려 200점을 얻은 것을 확인할 수 있다.

Webhacking.kr - code-4(old-20) (Web, 200pts)

사실 1번 문제를 풀었으면 2번 문제를 푸는 것이 맞지만.. 2번 문제의 배점은 500점이었고, 그 뜻은 난이도가 상당한 문제라는 것이다. 그래서 1번 문제와 같은 배점을 가진 20번 문제를 가져와보았다. 해당 문제 페이지를 열면 아래 [그림 1]과 같은 화면을 볼 수 있다.

[그림 1] code-4


이번 문제는 그래도 앞서 풀었던 web-01보다는 페이지에 보이는 것이 많다. 하지만 이 화면만 보아서는 문제에서 요구하는 것이 무엇인지 잘 모르겠다. 그래서 해당 페이지에서 우클릭 - 페이지 소스 보기를 눌러 소스코드를 확인해보았다.

[그림 2] code-4 source


[그림 1]에서 보았던 ‘Submit’ 버튼을 누르면 ck() 함수가 되는 것을 볼 수 있다. ck() 함수는 주어진 3개의 필드에 값이 채워져 있고, 마지막 ‘captcha’ 필드의 값이 해당 필드 옆에 쓰여진 값(lv5frm.captha_.value)과 동일할 경우 submit()을 실행한다는 것을 볼 수 있다.

submit() 함수가 정확히 무엇을 하는 것인지 코드를 통해서는 알 수 없다. 하지만 submit() 함수를 어떻게 불러올 수 있는지 알게 되었으니 해보면 된다. 앞서 언급했던 조건들을 모두 만족시켜주면 된다. 그러면 아래 [그림 2]와 같은 화면을 볼 수 있다.

[그림 3] Too slow


너무 느리단다. 뭐가 느리다는걸까. 문제 페이지로 다시 돌아와서 보니 맨 위에 있는 ‘time limit : 2 second’ 라는 문자열이 보였다. 시간 제한이 2초? 2초 안에 submit() 함수를 실행시켜야 한다는 뜻인 것 같다. 하지만 이는 일반적으로는 불가능하다. ‘captcha’ 필드의 값을 올바르게 채우는데만 2초보다 더 오래 걸릴 것이다.

그렇다면 어떻게 해야할까? 힌트는 아까 보았던 소스코드에 있다. 조금 전 보았던 ck() 함수는 Javascript이며, 자바스크립트는 개발자 도구의 Console에서도 실행시킬 수 있다. 따라서 굳이 필드를 채우고 버튼을 누를 것 없이 아래 [그림 4]와 같이 간단한 코드를 작성하는 것만으로 같은 효과를 낼 수 있다.

[그림 4] Wrong Captcha


위 [그림 4]는 Console을 통해 submit() 함수만 별도로 실행해준 것을 나타낸 그림이다. 나는 이렇게만 해도 문제가 풀릴 것이라 생각했는데, 문제가 풀리는 대신 ‘Wrong Captcha’라는 메시지가 나왔다. 아무래도 Captcha 값을 맞춰주고 submit()을 해야 되는 듯 하다.

그래서 이번에는 아래 [그림 5]와 같이 코드를 한줄 추가하였다.

[그림 5] No response


그랬더니 그저 새로고침만 될 뿐, 그 어떤 메시지 조차 나오지 않았다. 그래서 혹시나 나머지 필드도 채워야 하나 해서 아래 [그림 6]과 같은 코드를 작성하였더니, 마침내 문제가 풀렸다.

[그림 6] nickname, comment, captcha and submit


[그림 7] pwned


참고로 이렇게 코드를 입력하는 것도 페이지를 불러오고 2초 이내에 해야한다는 것을 잊으면 안 된다. 나름 피지컬(?)을 요구하는 문제라고도 할 수 있을 듯 하다.