늘모자란, 개발 :: [wargame.kr] Challenge 22 - php? c?

늘모자란, 개발

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


d1과 d2는 반드시 필요한데, 강제로 int로 형변환을 하고 있다.
전혀 감 잡히는 바가 없기때문에 int 취약점에 대해서 검색해봤는데, 첨에 생각한건 32bit 라면 int가 2147483647 이상 올라가지 않아서 오버플로우 될것이라고 생각했다. 그래서 자릿수를 높여서 적어봤는데 되진 않았다.

이 경로에 p7.c가 있다니 접근해보니 소스를 얻을 수 있었다

#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);
}


컴파일해보았다. 그 이후 오버플로우가 발생하도록 int의 최대자리를 넣어보았다.


gcc p7.c
./a.out 2147483647


그러자 띠용.. 생각도 못한 값이 나왔다. 야매로 하다간 밤샐뻔했다. 나오는 숫자를 보내주면 키가 반환된다.
2016/06/13 22:52 2016/06/13 22:52