소스를 확인해보면 입력한 값은 int형으로 casting이 되고, D1에 값을 p7이라는 c 프로그램에 인자로 넘겨줍니다.

그 결과와 D2값이 동일하면 문제가 해결됩니다.



우선 p7.c 코드를 확인해 봅니다. (URL로 이동)

  ① D1의 값을 atoi()함수로 int 형변환 후 i변수 선언.

  ② i값이 음수면 nono() 실행

  ③ i값에 +5

  ④ i값이 4보다 크면 nono() 실행

  ⑤ i값이 5보다 작으면 i값 printf


결론은 처음에는 음수였다가 +5한 값이 4이하이면서 1이 아니면 해결이 됩니다.

하지만 가장 작은 값인 0을 입력해도 +5를 하면 ④번으로 인해 실패하게 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <stdlib.h>
 
void nono();
 
int main(int argc,char **argv){
    int i;
    if(argc!=2){nono();}
    i=atoi(argv[1]);
    if(i<0){nono();}
    i=i+5;
    if(i>4){nono();}
    if(i<5){printf("%d",i);}
    return 0;
}
 
void nono(){
  printf("%d",1);
  exit(1);
}
cs



처음 문제를 열었을 때 32bit application에서 integer type에 관해 알고 있는지 물어봅니다.

32bit에서 int는 4byte로 값의 범위가 정해져 있습니다.


이때 2,147,483,647이상의 값을 입력하게 되면 error나는 것이 아니라 Overflow로 음수가 됩니다.

(ex. 2147483647 + 1 = -2147483648)

이것을 이용해서 문제를 해결 할 수 있습니다.



최대 값인 2,147,483,647을 D1에 입력하면 ②번의 양수를 검사하는 부분을 통과하게 되고,

+5를 하게 되면 Overflow가 발생하여 -2,147,483,644이 됩니다.


그리고 해당 값을 보낼 때 input tag에서 글자 수 제한(9)을 두었는데 개발자 모드로 살~짝 바꿔주시면 됩니다.




[참고]

C언어 데이터 형식 범위: https://msdn.microsoft.com/ko-kr/library/s3f49ktz.aspx

'WarGame > wargame.kr' 카테고리의 다른 글

[WarGame] ip log table  (0) 2018.11.08
[WarGame] WTF_CODE  (0) 2018.11.05
[WarGame] tmitter  (0) 2018.11.01
[WarGame] img recovery  (0) 2018.10.31
[WarGame] pyc decomplie  (0) 2018.10.30



tmitter이라는 홈페이지가 나옵니다.

계정을 로그인 할 수 있는 버튼과 새로 가입할 수 있는 버튼이 하나씩 있습니다.



계정을 모르기 때문에 해당 페이지로 가보면 ID/PS 입력란이 있고 아무것도 알려주지 않습니다.

소스를 확인 하면 주석으로 admin으로 가입하라는 힌트가 하나 주어집니다.



기본적으로 admin으로 가입을 시도하면 다음과 같이 존재한다면서 아이디가 생성되지 않습니다.



SQL Injection으로 해보면 되지 않을까 생각에 다음과 같이 시도해도 싱글쿼터(') 앞에 \가 붙으면서 제 역할을 하지 못합니다.

아마 addslashes() 나 get_magic_quotes_gpc()가 사용되고 있는 것으로 생각됩니다.

(insert into table_name value('$id','$pw')이런 식으로 join하겠죠?)



하지만 멀티바이트를 사용하는 언어셋 환경이라면 싱글쿼터를 우회 할 수 있습니다.

%a1~%fe 중 하나를 싱글쿼터 앞에 붙여서 보내면 싱글쿼터와 합쳐져 하나의 문자로 인식되기 때문에 우회가 가능합니다.


그래서 burp suite로 중간에 해당 값을 바꿔서 보내면 가입이 완료됩니다.




근데 생각해보니 싱글쿼터가 하나가 남게 되는데 query error가 아닌가 보네요...?

#을 지우고 해도 join이 되었습니다...??? (알 수 없네요..)



원래 의도 풀이


다른 블로그를 확인해보니 DB의 문제를 이용한 풀이를 했었습니다.


사실 처음 화면에 왜 create 문을 보여주었는지 의아해 했는데...

id가 32글자라는 것이 중요한 힌트였습니다.


서버에서 처리할 때 trim을 이용해 앞뒤 공백을 지우게 되는데 이것을 이용해서

"admin                           1" 이런 식으로 1을 제외한 앞 부분까지 32글자를 공백으로 만들어 보내면

32글자까지만 인식하기에 admin으로 가입이 되는 문제였습니다.

'WarGame > wargame.kr' 카테고리의 다른 글

[WarGame] WTF_CODE  (0) 2018.11.05
[WarGame] php? c?  (0) 2018.11.02
[WarGame] img recovery  (0) 2018.10.31
[WarGame] pyc decomplie  (0) 2018.10.30
[WarGame] md5_compare  (0) 2018.10.30



어지러운 패턴의 연속으로 되어있는 배경이 보입니다.

우선 이미지를 얻기 위해 소스를 확인해 보시면 쉽게 얻을 수 있습니다.



HxD로 확인해 보면 맨 아래 부분에 tExtsoftware.Japng r119 라는 문구가 의심스럽습니다.

japng 검색해보면 png파일을 여러장의 이미지를 하나의 파일로 만들어 gif처럼 움직이는 이미지를 만들 수 있습니다.



japngEditor를 이용해서 해당 이미지를 열어보면 다음과 같이 두 가지의 이미지가 들어있는 것을 알 수 있습니다.

(cmd>java -jar japng-editor.jar)

각각의 이미지를 Export해서 보다 보면 QR CODE일 것이라는 생각이 듭니다.



하지만 QR CODE를 인식하려면 하나의 이미지로 만들어야 되는데 배경이 흰색이기에 겹치지 못합니다.

다양한 방법이 있겠지만 PhotoScape라는 프로그램을 이용해서 이미지의 투명도를 조절해 하나로 겹치게 만들 수 있습니다.



QR CODE Scanner로 문자열을 얻고 인증하면 key값을 획득할 수 있습니다.



'WarGame > wargame.kr' 카테고리의 다른 글

[WarGame] php? c?  (0) 2018.11.02
[WarGame] tmitter  (0) 2018.11.01
[WarGame] pyc decomplie  (0) 2018.10.30
[WarGame] md5_compare  (0) 2018.10.30
[WarGame] strcmp  (0) 2018.10.30

+ Recent posts