일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 기초 100문제
- easycrack
- hacking
- downunder
- reversing.kr
- RAM 구조
- tjdmin1
- 세명컴퓨터고등학교
- rev
- Reverse Engineering
- foobar ctf
- 247ctf
- wargame
- easy aseembly
- pwnable
- pwnable.tw
- system hacking
- yawa
- Dreamhack
- Beginner
- 메모리 구조
- 코드업
- rop
- simple-operation
- misc
- CodeEngn
- downunderctf
- rev-basic-1
- rev-basic-0
- format-string-bug
- Today
- Total
Tjdmin1
[Dreamhack] rev-basic-0 본문
https://dreamhack.io/wargame/challenges/14
rev-basic-0
Reversing Basic Challenge #0 이 문제는 사용자에게 문자열 입력을 받아 정해진 방법으로 입력값을 검증하여 correct 또는 wrong을 출력하는 프로그램이 주어집니다. 해당 바이너리를 분석하여 correct를 출
dreamhack.io
Analysis
main function
int __fastcall main(int argc, const char **argv, const char **envp)
{
char v4[256]; // [rsp+20h] [rbp-118h] BYREF
memset(v4, 0, sizeof(v4));
sub_140001190("Input : ", argv, envp);
sub_1400011F0("%256s", v4);
if ( (unsigned int)sub_140001000(v4) )
puts("Correct");
else
puts("Wrong");
return 0;
}
main 함수를 보면 처음에 memset으로 v4를 0으로 size만큼 초기화하게 됩니다.
그리고 sub_140001190 함수를 호출하게 되는데, 이때 이 함수 내부에는 va_start, _acrt_iob_func, sub_140001060 이런 함수들이 호출되고 있습니다.
sub_140001060에선 sub_140001040, _stdio_common_vfprintf 이런 함수들을 호출합니다.
주어진 코드에서 보이는 것처럼, 함수들이 가변 인자를 사용하여 포맷된 문자열을 처리하고 출력하는 기능을 수행하고 있습니다.
이는 C 언어에서 흔히 볼 수 있는 printf 함수의 작동 방식과 유사합니다.
따라서 sub_140001190을 printf라고 하고 비슷한 맥락으로 sub_1400011F0을 scanf로 고쳐보겠습니다.
그리고 또한 sub_140001000이 함수의 return 값으로 인해 맞는 문자인지 틀린 문자인지 검사를 하기 때문에 이 함수를 check_flag라고 고쳐보겠습니다.
int __fastcall main(int argc, const char **argv, const char **envp)
{
char v4[256]; // [rsp+20h] [rbp-118h] BYREF
memset(v4, 0, sizeof(v4));
printf("Input : ");
scanf("%256s", v4);
if ( check_flag(v4) )
puts("Correct");
else
puts("Wrong");
return 0;
}
정말 간단한 로직이 되었습니다.
이제 check_flag 함수를 분석해 보겠습니다.
_BOOL8 __fastcall check_flag(const char *a1)
{
return strcmp(a1, "Compar3_the_str1ng") == 0;
}
인자 값으로 받은 a1의 값이 Compr3_the_string이라는 값과 같은지 비교합니다.
※strcmp는 return 값으로 두 문자가 똑같으면 0을 주고 비교하는 문자가 크면 0, 비교하는 문자가 작으면 1을 반환합니다.
따라서 a1이 Compar3_the_string과 같으면 0을 반환하게 되고 0과 같으니 check_flag의 return 값은 1이 되게 됩니다.
main 함수의 조건문을 봤을 때 1이 조건문에 들어가게 되면 Correct를 출력하는 것을 볼 수 있습니다.
Exploit
입력으로 Compar3_the_str1ng라는 값을 주면 strcmp가 맞게 되고, 조건문에 걸려 Correct를 출력하게 될 것입니다.
'Reverse engineering' 카테고리의 다른 글
[reversing.kr] Easy Crack (0) | 2025.03.13 |
---|---|
[CodeEngn] RCE Basic L01 (0) | 2025.03.11 |
[Dreamhack] simple-operation (1) | 2024.07.03 |
[Dreamhack] rev-basic-1 (1) | 2024.07.03 |
[Dreamhack] Easy Assembly (0) | 2024.07.03 |