소스를 확인해보면 입력한 값은 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

+ Recent posts