본문 바로가기

시스템해킹

[드림핵] angry_darim 풀이

728x90

이런 형식에 문제는 처음 보는데
뭔가 무차별 대입으로 값을 얻어낼 수 있을것으로 보인다

 

 

보호기법

 

 

 

 

문제 코드

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define JOKER "\x5f\x75\x43\x30\x6e\x5f\x00"
#define TRUE  1
#define FALSE 0
#define OK    0
#define ERRO -1

void howtouse (char *sw_name);
int __is_valid_dynamic_token (char *password);
void create_tag (char *id);

int main (int argc, char *argv[]) {
  if (argc != 2) {
    howtouse(argv[0]);
    return ERRO;
  }

  if ( __is_valid_dynamic_token(argv[1]) ) {
    create_tag(argv[0]);
    printf("\n +-+ 무,무슨 ! +-+ \n");
  } else {
    printf("\n You r noob. \n");
  }

  return OK;
}

int __is_valid_dynamic_token (char *password) {
  char *token = (char *) malloc(30*sizeof(char));
  time_t time1;
  memset((char *)token, '\0', 30);
  sprintf(token, "%s_%d", JOKER, (int) time(&time1));

  if (! strncmp(token, password, 18) ) {
    return TRUE;
  }

  return FALSE;
}

void howtouse (char *sw_name) {
  printf(" ----------- [%s] ----------- \n", sw_name);
  printf(" ::. Usage: %s <DarimKey>\n\n", sw_name);
}

void create_tag (char *id) {
  FILE *fd;
  char *tag_name = (char *)malloc(24 * sizeof(char));
  memset(tag_name, '\0', 24);
  snprintf(tag_name,24, "./%s.tag", id);
  fd = fopen(tag_name, "w");
  if (fd != NULL) {
    fprintf(fd, "당했다!\n");
    fclose(fd);
  } else {
    printf("[!] 파일 열다가 오류 발생\n");
  }
}

 

문제를 보면 main 부분에서 입력을 받는 부분이 없어 보인다

 

c언어 특성으로 

int main (int argc, char *argv[]) {
  // argc: 인수의 개수 (프로그램 이름 포함)
  // argv: 인수 배열 (프로그램 이름 포함)
}

이 구조로 main이 구성되어 있는데

 

./darim 값 

이렇게 실행시 값이 argv[1]에 값이 들어가는 것이다

그리고 함수에서 argv[1] 즉 사용자 입력값을

__is_valid_dynamic_token 함수에서
확인한다

 

 

저 함수에서는 token 변수에 joker_현재시간 값을 저장한다

그리고 입력 인자와 token을 비교하는데

 

핵심은 

joker값과 _ 그리고 현재 시간을 결합하여
token을 지정하는 것이다

 

그렇다면 문제 설명에서

맨 뒤에 _가 2개가 붙는다고 하였는데
joker + _ = _uC0n__ 이므로

_uC0n_ 이 값인것 같다

그래도 현재 시간을 이용해 성공했다는 의미인

파일 생성까지 유도해 보겠다

 

 

payload 

from pwn import *
import time

joker = b"\x5f\x75\x43\x30\x6e\x5f"
timestamp = str(int(time.time()))
target_string = joker + b'_' + timestamp.encode()

p = process(['./darim', target_string])

print(p.recvall().decode())
print(target_string)

 

결과

 

 

 

flag 값이 마지막에 _가 2개가 있다고 하니

flag값은 joker값인 _uC0n_이다

 

 

flag : DARIM{ _uC0n_ }

 

 

문제를 좀 헷갈리네 넣었네;;

'시스템해킹' 카테고리의 다른 글

[드림핵] Bypass SECCOMP-1 풀이  (0) 2024.11.18
[드림핵] No mov풀이  (1) 2024.11.10
[드림핵] mmapped 풀이  (0) 2024.11.03
[드림핵] cpp_string 풀이  (1) 2024.10.14
[드림핵] Cherry 풀이  (1) 2024.09.12