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