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