반응형

IDA로 우선까보자

int __cdecl main(int argc, const char **argv, const char **envp)
{
  char s1[9]; // [rsp+6h] [rbp-3Ah] BYREF
  char s[9]; // [rsp+Fh] [rbp-31h] BYREF
  unsigned int v6; // [rsp+18h] [rbp-28h] BYREF
  unsigned int v7; // [rsp+1Ch] [rbp-24h] BYREF
  char *s2; // [rsp+20h] [rbp-20h]
  int fd; // [rsp+2Ch] [rbp-14h]
  void *buf; // [rsp+30h] [rbp-10h]
  unsigned int v11; // [rsp+38h] [rbp-8h]
  int i; // [rsp+3Ch] [rbp-4h]

  v7 = 0;
  v6 = 0;
  v11 = 0;
  initialize(argc, argv, envp);
  buf = malloc(0x45uLL);
  fd = open("./flag", 0);
  read(fd, buf, 0x45uLL);
  close(fd);
  get_rand_num(&v6);
  printf("Random number: %#x\n", v6);
  printf("Input? ");
  __isoc99_scanf("%d", &v7);
  v11 = v6 ^ v7;
  snprintf(s, 9uLL, "%08x", v6 ^ v7);
  for ( i = 0; i <= 7; ++i )
    s1[i] = s[7 - i];
  printf("Result: %s\n", s1);
  s2 = "a0b4c1d7";
  if ( !strcmp(s1, "a0b4c1d7") )
  {
    puts("Congrats!");
    puts((const char *)buf);
  }
  else
  {
    puts("Try again");
  }
  return 0;
}

 

1. get_rand_num()에 의해 난수를 생성하고 생성된 난수를 16진수로 출력

2. Input? 이후에 사용자에게 입력받음

3. 입력받은 정수를 난수와 XOR연산을 수행한다.

4. 결과를 8자리 16진수형태의 문자열로 변환하여 저장

5. 저장한 문자열을 역순으로 읽고, a0b4c1d7과 비교한다.

 

 

cf.

argc: 명령줄에 전달된 인자의 갯수(임수 값을 가지지 않음)

argv: 인자의 내용이 저장되는 포인터형 배열

envp: 인자 값 중 환경변수 값이 들어가는 포인터형 배열

-예시-

code

#include <stdio.h>

int main(int argc, char *argv[]) {
    printf("%d\n", argc);
    printf("%s\n", argv[0]);
    printf("%s\n", argv[1]);
    return 0;
}

 

 

 

exploit code

from pwn import *

context.log_level = "DEBUG"
p = remote("host3.dreamhack.games", 10336)

p.recvuntil("number: ")

rand_num = p.recvn(10)
rand_num = int(rand_num, 16)  ^ 0x7d1c4b0a
rand_num = str(rand_num)

p.sendlineafter("Input? ", rand_num)

p.interactive()

반응형

'wargame' 카테고리의 다른 글

likeb64  (0) 2024.03.15
bypassIF  (0) 2024.03.10
Broken Buffalo Wings  (0) 2023.09.10
LoS - zombie assassin  (0) 2023.08.27
phpreg  (0) 2023.08.27
반응형

...??????

전혀 접근 방법에 대해서 모르다가 이게 맞나 싶을 정도로 당황스러웠다.

 

상기의 discription을 보고 어디에서 패치가 이루어졌는가 찾아 보았다.

파일의 크기가 다르길래 바로 확인해 보았더니 패치된 파일에는 존재하지 않는 부분이 존재한다.

            location ~ /flag.txt {
                deny all;
                return 403;
            }

이게 있는걸 보아하니... flag.txt경로로 이동하면 플래그가 보이나 싶어서 이동해보니...

..??????????

이 언인텐 풀이로 인하여 문제가 level 1인 것 같다

반응형

'wargame' 카테고리의 다른 글

bypassIF  (0) 2024.03.10
simple-operation  (0) 2023.09.18
LoS - zombie assassin  (0) 2023.08.27
phpreg  (0) 2023.08.27
type confusion  (0) 2023.08.27
반응형

이전의 succubus문제와 유사하게 풀면된다.

<?php 
  include "./config.php"; 
  login_chk(); 
  $db = dbconnect();
  $_GET['id'] = strrev(addslashes($_GET['id']));
  $_GET['pw'] = strrev(addslashes($_GET['pw']));
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~"); 
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~"); 
  $query = "select id from prob_zombie_assassin where id='{$_GET[id]}' and pw='{$_GET[pw]}'"; 
  echo "<hr>query : <strong>{$query}</strong><hr><br>"; 
  $result = @mysqli_fetch_array(mysqli_query($db,$query)); 
  if($result['id']) solve("zombie_assassin"); 
  highlight_file(__FILE__); 
?>

여기서 알아야할 함수는 두가지이다.

addslashes : ', " , %00(null) 뒤에 역슬래시를 추가한다.

strrev() : 문자열을 반대순서로 입력한다.

ex. strrev(test) -> tset

 

일부러 addslashes를 이용하는 payload를 구성하면 아래와 같다.

id="&pw=or 1=1%23

 

이제 입력하기 위해 역순으로 만들어준다. 이 때, %23역시 32%로 만들어주면 #으로 인식하지 못하기에 %23은 그대로 입력해주어야한다.

그리하여 최종적인 payload는 아래와 같다.

?id="&pw=%231=1%20ro

 이렇게 보내면, highlight친 부분이 문자열로 처리되기에 뚫리는 것이다.

반응형

'wargame' 카테고리의 다른 글

simple-operation  (0) 2023.09.18
Broken Buffalo Wings  (0) 2023.09.10
phpreg  (0) 2023.08.27
type confusion  (0) 2023.08.27
tmitter  (0) 2023.08.26
반응형

이걸 왜 ctf때 못 풀었지... 너무 쉬운건데 아쉬웠다ㅠㅠㅠ

두가지 step을 돌파하면 flag를 준다.

첫화면이다. nickname과 password가 나온다.

step 1에 대한 code snippet은 아래와 같다.

            // pw filtering
            if (preg_match("/[a-zA-Z]/", $input_pw)) {
              echo "alphabet in the pw :(";
            }
            else{
              $name = preg_replace("/nyang/i", "", $input_name);
              $pw = preg_replace("/\d*\@\d{2,3}(31)+[^0-8]\!/", "d4y0r50ng", $input_pw);

              if ($name === "dnyang0310" && $pw === "d4y0r50ng+1+13") {
                echo '<h4>Step 2 : Almost done...</h4><div class="door_box"><div class="door_black"></div><div class="door"><div class="door_cir"></div></div></div>'

필터링을 우회하고, 정규표현식을 만족하며 $name === "dnyang0310" && $pw === "d4y0r50ng+1+13" 요롷게 되도록 만들어야한다.

name은 nyang을 없애버리는 것을 오히려 이용하면 되고,

pw에 대해 해석해보면, 

\d* : 0개 이상의 숫자

\@ : 문자그대로 @

\d{2,3} : 2개에서 3개의 연속된 숫자

(31)+ : 문자그대로 31

[^0-8] : 숫자 0부터 8 사이가 아닌 어떤 문자

\! : 문자 그대로 !

 

더하여 pw filtering부분에서 알파벳을 쓰면 안된다고 나와있다. 모든 조건을 만족하는 것은 아래와 같다.

dnyanyangng0310
123@123319!+1+13

다음 step은 뭔가 입력받는 곳이 존재한다.

code에 의하면 shell command를 입력받는다.

cat flag를 바로 시도해보았다.

필터링이 존재한다.

 // cmd filtering
                else if (preg_match("/flag/i", $cmd)) {
                  echo "<pre>Error!</pre>";
                }

여기서도 정규표현식이 활용된다. cat fl* 이런식으로 쓰면,  fl 로 시작하는 파일을 불러온다.

그러나 결과가 안나온다.

생각해보니 현 디렉터리에 flag파일이 없을 수 있다는 생각이 들어서 확인해보았다.

역시나 없다.

한줄로만 command를 보낼 수 있기에 ; 를 활용하여 여기저기 디렉터리를 좀 뒤져보았다.

아래의 명령을 보낼 시 찾을 수 있다.

cd ../dream; ls

이제 아래의 command를 보내면 flag가 나온다.

cd ../dream; cat fl*

반응형

'wargame' 카테고리의 다른 글

Broken Buffalo Wings  (0) 2023.09.10
LoS - zombie assassin  (0) 2023.08.27
type confusion  (0) 2023.08.27
tmitter  (0) 2023.08.26
Robot-only  (0) 2023.07.21
반응형

php 의 느슨한 비교로 인해 발생하는 취약점이다.

== 비교에 대한 matrix는 아래와 같다.

이제 문제의 코드를 보겠다.

<?php
 if (isset($_GET['view-source'])) {
     show_source(__FILE__);
    exit();
 }
 if (isset($_POST['json'])) {
     usleep(500000);
     require("./lib.php"); // include for FLAG.
    $json = json_decode($_POST['json']);
    $key = gen_key();
    if ($json->key == $key) {
        $ret = ["code" => true, "flag" => $FLAG];
    } else {
        $ret = ["code" => false];
    }
    die(json_encode($ret));
 }

 function gen_key(){
     $key = uniqid("welcome to wargame.kr!_", true);
    $key = sha1($key);
     return $key;
 }
?>

==비교를 하고 있으며 웹페이지에서  제출되는 값을 비교하여 참 거짓을 판별한다.

이때, 제출되는 payload를 보면, json형식으로 {key:value} 요롷게 전송되는 것을 볼 수 있다.

여기서 1234를 true로 전송해주면 상기의 표에 의해 비교했을때 true이므로 풀린다.

반응형

'wargame' 카테고리의 다른 글

LoS - zombie assassin  (0) 2023.08.27
phpreg  (0) 2023.08.27
tmitter  (0) 2023.08.26
Robot-only  (0) 2023.07.21
file-csp-1  (0) 2023.07.02

+ Recent posts