[Wargame.kr] php? c? 풀이 (291p)
Wargame/wargame.kr

[Wargame.kr] php? c? 풀이 (291p)

php? c? view-source code

do you know "integer type" of 32bit application?

<?php
 if (isset($_GET['view-source'])) {
     show_source(__FILE__);
    exit();
 }
 require("../lib.php"); // include for auth_code function.
 if(isset($_POST['d1']) && isset($_POST['d2'])){
  $input1=(int)$_POST['d1'];
  $input2=(int)$_POST['d2'];
  if(!is_file("/tmp/p7")){exec("gcc -o /tmp/p7 ./p7.c");}
  $result=exec("/tmp/p7 ".$input1);
  if($result!=1 && $result==$input2){echo auth_code("php? c?");}else{echo "try again!";}
 }else{echo ":p";}
?>
#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);
}

php쪽 코드는, d1에 입력된 값을 C의 argv[1]로 넘기는 역할을 하고 출력되는 값을 맞추면 flag를 출력한다.

C는 입력받은 값에 5를 더하여 출력하는데..

 

이 문제는 오버플로우, 언더플로우 개념을 알고 있으면 쉽게 풀 수 있다.

설명은 다른 사이트에도 많기 때문에, 사진 하나로 보여주겠다.

당연하게도 5를 더하여 나온 출력값을 예상할 수 있겠지요..?