안녕하세요. 오늘은 basic rce level 11을 풀어보겠습니다.

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

OEP와 stolenbyte를 찾으라네요. stolenbyte는 앞서 문제에서 한번 봤지만 한 번 더 설명하면 훔쳐진 바이트입니다.

자 그러면 파일을 받아 봅시다.

어디서 많이 본 문구네요. 음 한번 올리디버그로 열어 봅시다.

맨 위가 pushad로 되어있네요. 패킹되었을 확률이 높습니다. 앞서 level 10에서 설명드렸다 시피 pushad로 패킹된 프로그램은 popad로 풀었을 수도 있습니다. popad를 찾아봅시다.

오른쪽 마우스를 눌러 다음과 같이 들어갑니다.

 popad를 쳐주시고 find를 눌러줍시다.

 딱 한개가 나오는군요, 한번 더블클릭 해줍시다.

OEP를 알아내기 위해 전부 브레이크를 걸고 실행해보겠습니다.

실행을 하시면 아래와 같이 문자열이 뜨는군요.

계속 실행을 해봅시다. 중간에 반복되는 부분이 있군요. 그래서 반복되는 부분은 브레이크를 해제하게습니다.

맨마지막 줄까지 왔습니다. 이제 맨마지막줄을 실행해봅시다.

맨마지막줄까지 하니 프로그램이 실행되는 것을 볼 수 있습니다. 즉 맨마지막에 보시면 JMP 0040100C 라고 적혀있는 걸로 보아 0040100C가 OEP라고 볼 수 있습니다. OEP를 한번 봅시다. 오른쪽 마우스 follow를 눌러줍시다

.

음 뭐라고 하는지 모르겠네요. 실행버튼을 눌러줍시다.

예 지금 보니까 0040100C에서 시작하는 것이 확실해 지는군요. OEP는 0040100C입니다.

그리고 이젠 stolenbyte를 찾아야 합니다.stolenbyte는 훔친 바이트란 뜻이죠. 즉 빼돌린 바이트를 의미합니다. 지금 OEP부분에서 빠진 것이 보이나요?
그렇죠. 문자열 하나가 빠졌습니다. 어떤 문자열일까요?

이 문자열이 빠졌습니다. 그러면? 이 문자열을 찾아야겠죠. 오른쪽 마우스를 눌러 아래와 같이 들어갑시다.

 눌러주시면 아래와 같은 그림이 뜹니다.

빠진 문자열이 보이는군요. 더블클릭 해줍시다.

빠진 문자열은 두개이지만 앞서 문제에서 앞의 PUSH 0까지 넣었던 적이 있었기 때문에 이번에도 넣어서 해보겠습니다. stolenbyte는 6A0068002040006812204000입니다.

OEP까지 넣어야 하므로 0040100C6A0068002040006812204000 이겠네요. 한번 인증해 봅시다.

아니라는군요. 그렇다면 앞의 PUSH 0을 빼봅시다.

0040100C68002040006812204000을 인증해봅시다. 그런데? 이것도 안됩니다. 뭐가 잘못됐나 하면서 계속 헤맸습니다. 그리고 몇번의 삽질 후에 저는 OEP가 틀렸다는 것을 알 수 있었습니다.

0040100C위쪽을 보시면 NOP라고 나와있습니다. 그런데 NOP가 원래 아무 뜻도 없지만 하나당 1바이트를 차지합니다. 총 세어보니 12바이트가 나오더군요. 그런데? 앞의 6A0068002040006812204000을 1바이트씩 나누어보면

6A 00 68 00 20 40 00 68 12 20 40 00 총 이렇게 12개가 나옵니다. 그렇다는 것은 원래 NOP부분에 이 stolenbyte가 들어가져 있었다는 뜻이 됩니다.

만약 원래로 복구시킨다면 실질적 OEP는 0040100C가 아닌 00401000이 되겠지요. 00401000을 넣어서 해봅시다.

004010006A0068002040006812204000을 입력해줍시다.

다음문제로 넘어가는 것으로 보아 정답인 것 같습니다.

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

'codeengn' 카테고리의 다른 글

codeengn - basic rce level 13  (0) 2015.08.12
codeengn - basic rce level 12  (0) 2015.08.12
codeengn - basic rce level 10  (0) 2015.08.05
codeengn - basic rce level9  (0) 2015.08.05
codeengn - basic rce level 8  (0) 2015.08.05
Posted by englishmath
,

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

홈페이지로 들어가 webhacking 61번 문제를 눌러주세요.


정말 쿨하게 나와있네요. source를 눌러줍시다.

여기선 solve 대신 clear가 나와있네요. q[id]=admin이면 해결된다네요. q부분을 한번 봅시다. mysql_query를 통해 query문을 실행하는군요. 

select $_GET[id] : 입력받은 id를 검색한다는 뜻입니다.

from c_61 : c_61 테이블에서 라는 뜻입니다.

order by id desc : order by는 정렬하는 함수이구요. desc는 내림차순을 의미합니다. 즉 id칼럼을 내림차순으로 정렬하라라는 뜻입니다.

limit 1 : 데이터를 가져올 갯수를 뜻합니다. 여기선 id의 맨 첫번째 줄에서 1개를 가져온다는군요. 

limit 1때문에 id를 전부가져오란 명령어를 꺼내도 내림차순 된 id 하나밖에 나오지 않습니다.

내림차순으로 정렬되었으니 가장 으뜸인 z가 맨위에 있는 것이지요.

그렇다면 우리는 어떻게 해야할까요? 

주석문을 넣어 뒤쪽의 조건을 전부 무력화시키면 어떨까요? 쿼리문은

'admin' from c_61--가 되겠죠. 이렇게 되면 참 좋겠습니다만 소스에 보시면

if(eregi("\(|\)|union|select|challenge|from|,|by|\.",$_GET[id])) exit("Access Denied");

가 있습니다. 해당문자열이 들어갈 경우 접근금지 라는 메세지를 출력한답니다.

from이 금지어로 되어있기 때문에 주석문은 의미가 없어졌습니다. 그렇다면 우리는 select문의 비밀을 이용해 풀어보겠습니다.

select id 는 id칼럼에서 검색하라라는 소리입니다. 이건 다들 아시는겁니다만

select 1 id 는 무슨 뜻일까요? 

1이란 값의 별명을 id로 주어 이 id를 칼럼명으로 쓰겠다는 뜻입니다.  그렇게 되면 결국 id칼럼안에 1값이 들어가지게 됩니다. 이것을 칼럼별칭(column alias)이라고 합니다.

그렇다면? select admin a는 무슨 뜻일까요?

admin이란 값의 별명을 a로 주어 이 a를 칼럼명으로 쓴다는 뜻입니다. 그렇게 되면 a칼럼안에 admin 값이 들어가지게 됩니다. 이방법을 사용하면 됩니다. 다만

위와 같이 q[id]가 admin이 되어야 하므로 쿼리는 select admin id 이렇게 써줘야 합니다. 이렇게 해야 id칼럼안에 admin값이 들어가지게 됩니다.  그렇게 되면 뒤쪽의 문구는 쓸모가 없어집니다. 이미 q[id]안에 admin이 들어가졌으니 뭘 어떻게 해도 admin을 뽑게 되어있습니다.

다만 문자열 admin을 입력하기 위해선 '를 입해야 하는데 이 '가 magic_quotes_gpc에 의해막혀있습니다. 게다가 ()도 필터링이 되있기 때문에 char 함수도 사용할 수 없습니다. 그래서 저번에 한 것 처럼 hex값을 줘서 풀이합시다.

admin의 헥스값은 0x61646d696e입니다. 입력칸이 따로 없으니까 주소창에 적어줍시다.

변수를 입력하기전에 ?를 붙여주셔야 합니다.

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

'Webhacking' 카테고리의 다른 글

webhacking - 42번 문제  (0) 2015.09.18
webhacking - 58번 문제  (0) 2015.09.18
webhacking - 49번 문제  (0) 2015.08.07
webhacking - 21번 문제  (0) 2015.08.02
webhacking - 46번 문제  (0) 2015.08.01
Posted by englishmath
,

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

홈페이지로 들어가 49번 문제를 눌러주세요.

? 보니까 46번 문제랑 똑같이 생겼습니다. 일단 제출을 해봅시다.

zzibong가 뜨는군요. 소스를 한 번 봅시다.

주석처리 되있는 index.phps가 보입니다. 주소창 뒤쪽에 붙여서 들어갑시다.

solve부분부터 봅시다. q[0]이 admin이면 해결이 된다는군요. 46번 소스랑 비슷하네요.

q부분을 봅시다. sql문을 실행시키네요. 입력한 lv에 맞는 id를 nembers에서 검색시켜서 반환한다는군요.

즉 이부분을 보시면 level이 1인 q값이 echo에 의해 출력되었습니다. level1의 q는 zzibong이군요. 그런데 칸에 다른 수를 입력해보시면 1을 제외한 다른 숫자는 출력이 되지 않습니다. 즉 lv1에 맞는 아이디는 하나밖에 없다는 것입니다. 하지만 우리는 id가 admin인 것을 뽑아내야 합니다. 그런데 lv에 맞는 admin이 없으므로 lv의 조건을 무력화 시켜줄 필요가 있습니다.

select id from members where lv=$_GET[lv] 라고 되어있는 문구에 lv값을 넣어 lv값의 조건을 무효화시키고 id가 admin인 것을 빼올려면 어떻게 해야할까요? 간단합니다.

select id from members where lv=1 or id='admin' 이 되게 하면 됩니다.

lv이 1값이거나 또는 id가 admin인 id를 검색한다. 즉 앞의 lv값이 1이든 2이든 3이든 100이든 앞의 조건을 무시할 수 있습니다. or이기 때문에 앞의 조건이 맞지 않아도 뒤쪽의 조건 id가 admin인 id를 검색하게 됩니다. 그런데 or이기 때문에 앞의 조건은 무조건 틀려야 하니까 lv의 값은 1을 제외한 값을 넣어서 앞의 lv조건이 무조건 틀리도록 해주셔야 합니다.

1만 아니면 되니까 아무값이나 넣어줍시다. 저는 2를 넣겠습니다.

select id from members where lv=2 or id='admin' 이렇게 해주시면 됩니다.

그런데 말입니다. 소스의 윗부분을 보시면 eregi가 있습니다. 해당문자열을 찾을 경우 그다음 명령어를 실행하는 함수입니다. exit()가 있는걸로 보아 문자열을 찾았을 경우 종료된다고 되어있네요. 즉 쉽게 말하면 금지어입니다. " "(뛰어쓰기)가 금지어고 or도 금지어네요. 그렇다면 or을 대신할 만한 것 중에서 띄어쓰기가 필요없는 것을 쓸 필요가 있습니다. 간단하죠.

||입니다. ||는 키보드 \위쪽에 있습니다. ||을 넣어주시면 2||id='admin'이 됩니다. 넣어줍시다.

lv칸에 입력하면 안되는 것이 보입니다. 아무래도 magic_quotes_gpc에 의해 '가 막힌 것 같습니다. 그래서 char을 이용하여 입력해보겠습니다.

2||id=char(97,100,109,105,110)가 되겠네요. 한번 입력해봅시다.

제출을 해봅시다. 안되네요...

문법으론 틀리지 않았습니다. 혹시 필터링을 잘못보았나 싶어 필터링을 쭉 자세히 살펴보았습니다.

if(eregi("\(",$_GET[lv])) exit();
if(
eregi("\)",$_GET[lv])) exit();

가로도 필터링이 되있었네요... 즉 char은 사용할 수가 없습니다. 그런데 admin을 '없이 char 사용 없이 표현할 수 있을까요? 굳이 char이 아니더라도 (가 금지되있기 때문에 다른 함수를 쓸 수도 없습니다. 그런데? 다른 함수를 쓰지 않고도 그 것의 고유한 값을 표현할 수 있는 방법이 있지요. 바로 hex값입니다. 

hex값이라 하여 사람들이 어려워 하는데 어려워 할거 하나 없습니다.

그냥 admin을 16진수로 바꿔주시면 됩니다. 프로그램이 구글에 널려있으므로 하나하나 바꿔 보시면 됩니다.

61646D696E이네요. 이 숫자가 admin을 16진수로 바꾼 값입니다.

그런데 그냥 입력하면 16진수인지 그냥 숫자인지 컴퓨터가 판별을 못합니다. 그래서 앞에 0x를 붙여 16진수임을 알립시다.

네 이것으로 문제풀이를 마치겠습니다. 참고로 굳이 16진수값이 아니고 2진수로 admin을 표현하셔도 됩니다. 다만 2진수로 하면 너무 길어지기 때문에 여기선 16진수로 했습니다.



'Webhacking' 카테고리의 다른 글

webhacking - 58번 문제  (0) 2015.09.18
webhacking - 61번 문제  (0) 2015.08.07
webhacking - 21번 문제  (0) 2015.08.02
webhacking - 46번 문제  (0) 2015.08.01
webhacking - 36번 문제  (0) 2015.07.30
Posted by englishmath
,