Description

Category: Web

Source: wargame.kr

Points: 297

Author: Jisoon Park(js00n.park)

Description:

do you know "integer type" of 32bit application?

Write-up

두 종류의 입력을 받는 텍스트 박스가 있다. 소스 코드를 보면 첫번째 인자가 p7 바이너리의 입력으로 주어지고, 두번째 인자가 바이너리의 실행 결과와 동일해야 한다고 한다.

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

p7 바이너리는 주어지지 않는데, 코드를 살펴보면 소스 코드인 p7.c 파일이 현재 디렉토리에 존재하는 것을 알 수 있다. 주소 표시줄에 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);
}

입력으로 받은 값이 음수이면 안되고, 거기에 5를 더했을 때 5보다 작아지면 될것 같다. 자연수에서야 이런 수는 없겠지만, c 코드에서는 integer overflow가 존재하니 그것을 이용하자.

integer overflow에 따르면, 32bit MAX_INT 값에 1을 더하면 MIN_INT가 된다. MAX_INT에 5를 더하면 MIN_INT + 4가 될것이다. 32bit MAX_INT와 MIN_INT의 값은 쉽게 알아낼 수 있다.

2147483647과 –2147483644를 d1과 d2에 각각 넣어주면 flag를 얻을 수 있다... 라고 생각했는데, 입력값 길이에 걸린다. 소스 코드로 봤을 때 서버쪽에서 특별한 길이 제한은 없었으니 burp suite로 request를 수정해 주면 된다.

이제 정상적으로 flag를 확인할 수 있다.

Flag : 9b6c4f386f3ebded4c3284103b5d73a397f6ae45

'writeups > Web' 카테고리의 다른 글

type confusion  (0) 2019.11.25
QR CODE PUZZLE  (0) 2019.11.25
login with crypto! but..  (0) 2019.11.25
md5_compare  (0) 2019.11.25
md5 password  (0) 2019.11.25

+ Recent posts