integer overflow에 대한 문제이다.
<?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";}
?>
두 개의 input을 받아서
하나는, /tmp/p7 $input
의 쉘 명령어에 사용되고,
다른 하나는, 위에서 나온 리턴값과 비교하는 데에 사용된다.
#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);
}
C 코드의 내용도 단순하다.
i=i+5
에서 overflow가 일어나고, overflow가 일어난 값을 출력해주는 코드이다.
문제 초반에서 32-bit application이라고 했으므로, 32 bit integer의 최댓값과 근사한 값으로 d1을 입력하여 overflow가 일어나도록 해 주었다.
2147483647 + 5 = –2147483644