wargame/wargame.kr

14번 php? c?

NTART 2019. 11. 12. 18:55

32bit의 int 자료형에 관한 문제인 듯 하다.

 

필요한 값을 찾아 넣어야 하는 것 같다. get source로 코드를 확인하면,

 

<?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";}
?>

d1과 d2를 post형식으로 받아,

각각 input1과 input2 변수에 int형으로 초기화시켰다.

 

# file_exists(), is_file(), file() - 서버에 특정 파일 있는지 확인 

file_exists(경로 및 파일이름) , is_file(파일이름) 

 

/tmp/p7의 경로에서 p7.c를 컴파일하고, input1값을 넣어 계산한 값을 result 변수에 넣는다.

result 값이 1이 아니고 input2의 값이면 flag를 얻을 수 있다.

 

 

url에 p7.c를 입력하면 c 코드를 볼 수 있다. 

agrc는 지정한 함수의 실행 횟수, argv는 문자열들이 배열에 저장된다.

atoi는 문자열을 정수로 리턴해주는 함수이다.

 

그런데 코드를 잘보면, 음수일 때 nono이면서 +5를 하고 5보다 작아야한다.

input1값이 nono를 리턴할 수 밖에 없기 때문에, 버퍼오버플로우를 일으켜야만 한다. 

 

 

int형 값의 범위이다. c언어에서 int형의 범위를 벗어난 2,147,483,647+1값을 넣으면 -2,147483,648 값을 반환한다.

위의 함수에서는 i값에 5를 더하기 때문에 d1에 2,147,483,643 값을 넣을 것이다. 이 값은 함수를 거치며 -2,147483,648값을 리턴할 것이기 때문에 v2에 -2,147483,648값을 넣으면될것이다.

2147483643 -2147483648

그런데 d1값이 짤린다 글자 제한을 걸어 둔 것 같다.

 

html란을 보면 maxlength가 9로 되어있다. 이것을 바꿔 넣으면 

 

클리어~