14번 php? c?
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로 되어있다. 이것을 바꿔 넣으면
클리어~