안녕하세요. 오늘은 basic rce level 17 문제를 풀어보겠습니다.

홈페이지로 들어가 basic rce level 17을 눌러주세요.

Name을 알아내는 것이군요. Name은 한자리 라고 합니다. 무차별 대입을 막기 위해 정답인증은 Name의 MD5 해쉬값이라고 적어 놨네요. 파일을 받아 봅시다.

재생버튼을 눌러 봅시다. PUSHED가 아닌 걸러 보아 패킷된 파일은 아니군요. 바로 텍스트를 찾아 봅시다.

둘러보니까 성공문자열이 보이는군요. 한 번 들어가 봅시다.

보니까 성공문자열 말고도 다른 문자열이 보입니다. 글자를 더 입력하라는 메세지와 30글자를 넘으면 안된다는 문자열도 있군요. 흠.. 확인을 위해 프로그램을 실행시키고 문제에서 제시한 키값을 입력해 봅시다.

check it을 눌러줍시다.

글자를 더 입력하라는 군요. Name을 빼먹어서 그런가 봅니다. 아무거나 하나 적어놓고 다시 해봅시다.

??? 분명 Name은 한글자고 키값도 문제에 나온대로 했는데 계속 글자를 더 입력하라고 나옵니다. 흠.. 뭔가 이상하군요. 올리디버그로 가서 More Chars 부분을 한번 봅시다.

위에 비교함수인 CMP와 조건점프인 JGE가 있군요. CMP에 브레이크를 걸고 실행해봅시다.

아까처럼 입력하신 후 check it을 누르시고 브레이크 된 CMP부분을 한 번 봅시다.

EAX값이 1이라고 나와있네요.

여기서 JGE 조건점프에 대해 설명하겠습니다.

JGE는 앞의 CMP a,b 에서 a가 b보다 크거나 같을 때에 점프를 하게 됩니다.

즉 정리를 하면 EAX가 3보다 크거나 같아야 JGE에 의해 점프를 하게 되고 점프를 해야 More Chars 문구가 뜨지 않습니다. 여기서 EAX는 Name이란 걸 알 수 있죠,. 그런데 아까 본 숫자 1이 값을 의미하는지 아니면 자릿수를 의미하는 지 알 수가 없습니다. 그래서 다시 한번 해 봅시다.

check it을 눌러주시고 브레이크를 확인합시다.

2가 나오는군요. 즉 EAX는 Name의 자릿수를 의미합니다. 그런데?

문제에서 Name는 한자리라고 했습니다. 즉 EAX가 1이어야 합니다. 근데 그렇게 하면 조건에 맞지 않아 More Chars 문구를 뜨게 합니다. 이럴땐 그냥 조건을 바꿔주시면 됩니다.

CMP EAX,3 부분을 더블클릭하고 조건을 아래와 같이 맞춰줍시다.

이렇게 해야 EAX가 1이 되어도 조건에 맞기 때문에 JGE가 실행됩니다. 

그런데 여기서 밑으로 좀 더 내려가면 30자리 이상은 안된다는 문자열이 있습니다. 여기선 EAX와 1E를 비교하며 JLE가 쓰였습니다. JLE는 JGE와 반대로 a가 b보다 작거나 같을 때 점프합니다. JLE이므로 건드릴 필요는 없습니다.

수정이 완료되었으면 실행해 봅시다.

Check it을 눌렀는데 아무런 반응이 없습니다. 성공적으로 수정이 됐다는 것입니다.

그러면 이제 정답을 찾아야 합니다. 한글자 라고 했으므로 그냥 뭐 다 입력해보면 되겠지요. 

1~9 그리고 알파벳 소문자,대문자, 한글 그리고 기타 특수문자 등 입력 할 수 있는건 전부 입력해 봅시다.

몇번을 삽질하다보니 정답이 나왔습니다. F라는군요. F를 MD5 해쉬해봅시다.

값에 대문자가 있으므로 맞는 것 같습니다. 인증해봅시다.



정답이 맞는 것 같습니다. 네 이것으로 문제풀이를 마치겠습니다.

'codeengn' 카테고리의 다른 글

codeengn - basic rce level 16  (0) 2015.10.02
codeengn - basic rce level 18  (0) 2015.09.25
codeengn - basic rce level 15  (0) 2015.08.18
codeengn - basic rce level 14  (0) 2015.08.18
codeengn - basic rce level 13  (0) 2015.08.12
Posted by englishmath
,

안녕하세요. 오늘은 webhacking 60번 문제를 풀어보겠습니다.

홈페이지로 들어가 webhacking 60번을 눌러주세요.

 

들어가자마자 접근거부라고 나오는군요. 초대받지 못한 손님인 것 같습니다.

밑에 index.phps가 나와있네요. 눌러 봅시다.

첫문자를 보시면 sleep(1);가 적혀있습니다. sleep은 지연시키는 함수로 1이라고 적혀있으므로 1초를 지연시킨다는 소리입니다. 즉 1초가 지나고 다음 함수를 실행시킨다는 것이지요.

그 다음 첫 if문을 보시면 eregi가 나와있습니다. eregi는 문자를 찾는 함수이지요. COOKIE(PHPSESSID)에서 0~9까지의 숫자가 나올 경우 접근 거부를 출력한다는군요.

즉 COOKIE PHPSESSID에 숫자가 없어야 접근거부가 안뜬다는 것입니다.

그다음 if문을 보면  mode 값이 auth일 경우 Auth~ 란 문구를 출력하고 f에 readme/세션[id].txt를 저장시킨다는군요. 앞에 file()함수가 있으므로 파일을 배열로 읽어 들입니다.

그다음은 for문을 이용해 result에 .txt의 내용을 저장시키고 그 밑의 if문에서 세션[id]의 값이 result에 있으면 Done를 출력하고 unlink를 호출해 .txt파일을 삭제합니다. 그리고 문제가 해결된다는군요.

자 그러면 한번 해봅시다. PHPSESSID에 숫자가 없어야 하므로 숫자를 전부 지워봅시다.

 쿠키값에 있는 숫자를 다 지우고 새로고침을 하면 로그인을 하라고 합니다.

그래서 다시 로그인하고 60번 문제로 들어가면 아래와 같은 화면이 나옵니다.

자 이제 여기서 문제해결을 위해  mode에 auth를 넣어 봅시다.

Auth가 출력되었는데 Done가 출력되지 않았다는 것은 clear문의 if문이 참이 되지 못했다는 뜻입니다. 원래라면 당연히 참이 되야 하는 조건인데 참이 되지 못했다는 것은 .txt파일이 없어 result에 저장이 되지 않았다는 것으로 봐야 합니다.

소스문을 다시 봅시다.

클리어문의 if문을 제외하면 밑에 또 소스가 있는 것을 볼 수 있습니다.

위에 if문은 mode에 auth 값이 들어가 있을 때 실행하는 if문

밑의 문은 mode에 auth값이 없을 때 실행하는 문구인 것 같습니다.

보시면  fopen과 w를 이용해 .txt파일을 만들어서 f에 저장시키는 것이 보입니다.

그다음은 fwrite를 이용해 f에 저장된 내용을 세션[id]에 저장시킵니다.

그 다음을 보시면 if문이 있습니다.

ip주소가 다음과 다를 경우 1초의 지연시간을 주고 파일을 삭제시킨다는 군요.

그러면 이 파일이 삭제되기전에 클리어의 if문을 실행시킬 필요가 있습니다.

쿠키값을 수정시켜 들어오는 순간에 if문이 실행되므로 두 익스플로러를 띄워 하나는 파일 생성용 하나는 문제해결용으로 만들어줍시다.

서로의 쿠키값은 달라야 하므로 서로 다른 브라우저를 써 봅시다. 익스플로러와 크롬을 사용해봅시다.

크롬은 쿠기에디터를 사용해서 쿠키를 바꿀수 있고 익스플로러는 쿡시툴바를 이용해서 바꿀 수 있습니다. 일단 쿡시툴바를 다운받아 봅시다.

쿡시를 다운받으셨으면 익스플로러를 열어 오른쪽상단의 톱니바퀴를 눌러 추가 기능 관리로 들어갑니다.

그러면 아래와 같은 창이 뜹니다.

다운 받은 쿡시 툴바를 사용하기 위해 하단의 사용 함 버튼을 눌러주세요. 그리고 창을 닫아주시면 주소창 아래에 쿡시툴바가 보입니다. 자 이제 익스플로러 문제페이지를 들어가봅시다.

들어가셨으면 쿡시툴바의 맨 오른쪽의 edit 버튼을 눌러 쿠키값을 수정해 줍시다.

문자로만 들어가도록 바꿔줍시다.

다시 로그인을 하고 들어오시면 hi가 보이실 것입니다. 그리고 주소창에?mode=auth를 미리 써줍시다. 엔터는 아직 치지 마세요.

지금 접속됨으로써 text파일이 생성되고 지워졌을 겁니다.

여기까지 되셨으면 이번엔 크롬으로 들어갑시다.

쿠키값을 다르게 설정해줍시다.

설정 후 다시 로그인을 하셔서 들어오시면 hi가 뜹니다.

자 이제 익스플로러 hi와 크롬 hi가 있을 것입니다. 자 그리고 아까 익스플로러에 적어 놓은 ?mode=auth를 엔터친 후 바로 크롬 홈페이지를 새로고침 합니다. 이것을 반복합니다.

좀 하다 보시면 아래와 같이 뜹니다.

이번 문제는 레이스컨디션을 이용해서 푸는 문제였군요.

레이스 컨디션이란 쉽게 말하면 프로세스가 경쟁하는 것을 말합니다. 프로세스가 여러번 실행되는 과정에서 실행 순서가 뒤바뀌는 것을 말하지요.

즉 이번 문제를 보시면 

파일 생성 - sleep - 파일 삭제 순으로 코드가 작성되어있었지요? 이것도 하나의 프로세스작업입니다. 그런데 이러한 작업을 여러번 실행하다보면 원래라면

파일 생성 - sleep - 파일 삭제 - 파일 생성 -sleep - 파일 삭제 가 되어야 합니다.

하지만 레이스 컨디션에 의해 

파일 생성 - sleep  - 파일 생성 - sleep - 파일 삭제 가 될 수 있습니다. 물론 매번 시도할때마다 실행 순서는 다릅니다.

우리의 목표는 이러한 작업을 여러번 실행시켜서 파일 삭제를 늦추고 그 사이에 mode에 auth를 대입해 문제를 푸는 것이었습니다.

그렇다면 의문점이 하나 생기실겁니다. 쿠키값을 왜 바꾸고 했는지 말입니다.

동일한 쿠키값으로 두 행위를 하면 두 행위가 아닌 하나의 행위로 인식됩니다.

우리는 파일삭제를 늦추는 행위와 mode에 auth를 넣는 행위 즉 두 행위를 해야하는데 하나의 행위만 인식되면 문제를 풀 수가 없습니다.

브라우저를 다르게 한 것도 쿠키값을 서로 다르게 하기 위함이였습니다.

사설이 조금 길었네요. 이것으로 문제풀이를 마치겠습니다.



'Webhacking' 카테고리의 다른 글

webhacking - 26번 문제  (0) 2015.10.02
webhacking - 18번 문제  (0) 2015.10.02
webhacking - 20번 문제  (0) 2015.09.25
webhacking - 42번 문제  (0) 2015.09.18
webhacking - 58번 문제  (0) 2015.09.18
Posted by englishmath
,

안녕하세요. 오늘은 webhacking 20번 문제를 풀어보겠습니다.

홈페이지로 들어가 webhacking 20번을 눌러주세요.

칸이 세개가 있고 그  밑에 문구가 있습니다.

프로그래밍을 하지 마라! 이것은 자바스크립트 문제이다. 라고 적혀있네요.

일단은 소스를 봅시다.

function 은 사용자 정의 함수입니다. 즉 기본적으로 제공되는 함수가 아닌 사용자 임의로 만들어진 함수란 뜻입니다. 뒤에 ck가 있는 걸로보아 임의로 만든 ck라는 함수를 호출하는 것 같습니다.

첫줄을 보시면 if(lv5frm.id.value=="") { lv5frm.id.focus(); return; } 라고 되어있네요.

lv5frm의 id 값이 비어있으면 id의 포커스를 맞추고 값을 리턴시킨다는군요. focus()라는 것은 커서위치를 맞춰주는 함수입니다. 즉 값이 반환이 되어도 바로 입력할 수 있도록 커서위치를 맞춰준다는 것이지요.

2번째와 3번째 줄도 똑같구요. 4번째 줄을 보시면

hack의 값과 attackme의 값이 다르면 hack값을 리턴시킨다는군요. 즉 두 값이 같아야 리턴이 안됩니다.

마지막으로 이 데이터들을 전송시키는 submit함수를 호출하고 종료합니다. 아무래도 문제해결을 위해선 ck함수를 실행시킬 필요가 있습니다.

정상적으로 ck함수를 실행시키기 위해선 id ,cmt ,hack에 값을 넣어야 하며 이중 hack의 값은 attackme랑 같아야 합니다.

그렇다면 본문으로 들어가 id와 cmt, hack와 attackme를 찾아봅시다.

개발자도구에 들어가 하나하나 살펴봅시다.

 nickname옆의 칸은 id

comment옆의 칸은 cmt

 code옆의 칸은 hack

 값이 cyfsrwutxu인 버튼은 attackme

마지막으로 누르면 ck함수를 호출하는 Submit버튼이 있네요.

자 그럼 이제 값을 대입하는 것만 남았네요. hack과 attackme의 값만 같으면 되고 나머지는 따로 조건이 없었으므로 그냥 아무거나 입력해봅시다.

전송버튼을 눌러봅시다.

 ???? 틀렸다는 문구와 함께 attackme의 값이 바껴져있습니다.

왜 이렇게 된걸까 하고 살펴보았더니 상단 중앙에 다음과 같은 문구가 있습니다.

시간 제한 : 2 라고 되어있네요. 왜 진작에 못봤을까요.

2라고 적혀있으니 2분 또는 2시간이거나 아니면 2초(...)

혹시 2분이 아닐까 해서 빠르게 적어서 전송을 눌렀습니다만 역시 실패했습니다.

그렇다면 역시 2초인 것 같습니다.(...) 사실 상 2초안에 데이터를 입력한다는 건 불가능합니다. attackme의 값이 매번 달라지는데다가 복사도 안되서 일일이 써야하는데 다른거 다 재껴놓고 attackme만 쓰는데도 2초이상 걸립니다. 그래서 이럴땐 꼼수를 써야하지요.

아까도 말씀했다시피 2초안에 내용을 다적기는 불가능합니다. 그렇다면 2초란 카운트가 시작되기전에 미리 다 적어놓아야 하지요. 일단 메모장을 열고 다음과 같이 적어봅시다.

 뜻은 다들 아실테니 생략하겠습니다. 다 적으셨으면 복사를 해줍시다.

그리고 개발자 도구의 콘솔에 붙여넣습니다.

그 다음이 중요합니다. F5를 눌러 문제를 새로고침한다음 바로 콘솔창에서 엔터를 눌러 붙여넣은 내용이 실행이 되도록 합니다. 성공적으로 되셨다면 아래와 같은 창이 뜹니다.

간단한 문제처럼 보였지만 통수 맞았군요.

네 이것으로 문제풀이를 마치겠습니다.

 

 

 

'Webhacking' 카테고리의 다른 글

webhacking - 18번 문제  (0) 2015.10.02
webhacking - 60번 문제  (0) 2015.09.25
webhacking - 42번 문제  (0) 2015.09.18
webhacking - 58번 문제  (0) 2015.09.18
webhacking - 61번 문제  (0) 2015.08.07
Posted by englishmath
,