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 |