일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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문제
- easy aseembly
- rev-basic-1
- pwnable
- Reverse Engineering
- fuzzing 개념
- fuzzing 아키텍처
- tjdmin1
- downunderctf
- ghidra
- 247ctf
- wargame
- downunder
- fuzzing 기법
- Dreamhack
- simple-operation
- easycrack
- 환경 세팅
- aarch64
- rev-basic-0
- hacking
- 코드업
- yawa
- RAM 구조
- format-string-bug
- pwnable.tw
- x64dbg
- reversing.kr
- system hacking
- foobar ctf
- Today
- Total
Tjdmin1
[Dreamhack] rev-basic-1 본문
https://dreamhack.io/wargame/challenges/15
rev-basic-1
Reversing Basic Challenge #1 이 문제는 사용자에게 문자열 입력을 받아 정해진 방법으로 입력값을 검증하여 correct 또는 wrong을 출력하는 프로그램이 주어집니다. 해당 바이너리를 분석하여 correct를 출
dreamhack.io
Before Reading
rev-basic-0을 풀어보지 않았다면 rev-basic-0부터 풀어보기를 추천한다.
2024.07.03 - [Reverse engineering] - [Dreamhack] rev-basic-0
[Dreamhack] rev-basic-0
https://dreamhack.io/wargame/challenges/14 rev-basic-0Reversing Basic Challenge #0 이 문제는 사용자에게 문자열 입력을 받아 정해진 방법으로 입력값을 검증하여 correct 또는 wrong을 출력하는 프로그램이 주어집니
tjdmin1.tistory.com
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));
printf("Input : ");
scanf("%256s", v4);
if ( (unsigned int)check_flag(v4) )
puts("Correct");
else
puts("Wrong");
return 0;
}
전에 분석했던 rev-basic-0 코드와 로직이 같아 IDA로 디컴파일하고 함수 이름을 바꾼 코드이다.
마찬가지로 v4에 입력을 받고 check_flag에 들어가 플래그가 맞는지 확인을 하게 된다.
check_flag function
_BOOL8 __fastcall check_flag(_BYTE *a1)
{
if ( *a1 != 'C' )
return 0LL;
if ( a1[1] != 'o' )
return 0LL;
if ( a1[2] != 'm' )
return 0LL;
if ( a1[3] != 'p' )
return 0LL;
if ( a1[4] != 'a' )
return 0LL;
if ( a1[5] != 'r' )
return 0LL;
if ( a1[6] != '3' )
return 0LL;
if ( a1[7] != '_' )
return 0LL;
if ( a1[8] != 't' )
return 0LL;
if ( a1[9] != 'h' )
return 0LL;
if ( a1[10] != 'e' )
return 0LL;
if ( a1[11] != '_' )
return 0LL;
if ( a1[12] != 'c' )
return 0LL;
if ( a1[13] != 'h' )
return 0LL;
if ( a1[14] != '4' )
return 0LL;
if ( a1[15] != 'r' )
return 0LL;
if ( a1[16] != 'a' )
return 0LL;
if ( a1[17] != 'c' )
return 0LL;
if ( a1[18] != 't' )
return 0LL;
if ( a1[19] != '3' )
return 0LL;
if ( a1[20] == 'r' )
return a1[21] == '\0';
return 0LL;
}
입력한 값과 문자를 하나씩 비교하며 내려오는 것을 볼 수 있다.
a[19]까지는 같지 않으면 retrun 0를 해주고 a1[20]은 같으면 return 값으로 a1[21] == '\0'값을 넘겨준다.
조건문들을 만족하게만 만들면 풀리는 쉬운 문제이다.
Exploit
조건문들의 값을 만족하는 값을 뽑아내보면 Compar3_the_ch4ract3r이 되게 된다.
'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-0 (0) | 2024.07.03 |
[Dreamhack] Easy Assembly (0) | 2024.07.03 |