728x90
링크 : https://dreamhack.io/wargame/challenges/14
rev-basic-0
Reversing Basic Challenge #0 이 문제는 사용자에게 문자열 입력을 받아 정해진 방법으로 입력값을 검증하여 correct 또는 wrong을 출력하는 프로그램이 주어집니다. 해당 바이너리를 분석하여 correct를 출
dreamhack.io
문제 설명
이 문제는 사용자에게 문자열 입력을 받아 정해진 방법으로 입력값을 검증하여 correct 또는 wrong을 출력하는 프로그램이 주어집니다.
해당 바이너리를 분석하여 correct를 출력하는 입력값을 찾으세요!
획득한 입력값은 DH{} 포맷에 넣어서 인증해주세요.
예시) 입력 값이 Apple_Banana일 경우 flag는 DH{Apple_Banana}
문제 풀이
문제 실행 화면
정적분석
1. ida 실행 후 chall0.exe 실행
- 바이너리의 아키텍처 : AMD64 (x86-64)
- 파일 포맷 : PE 구조
더보기

- 바이너리에 디버깅 정보를 담고 있는 심볼 경로가 존재 -> 이를 찾아서 로드 하겠냐
- 문제에는 별도의 심볼 (.pdb)를 제공 안함 -> no

2. 문자열 검색
- 문자열 검증 -> wrong나 correct를 출력
- View - Open subviews -> Strings
3. 함수 분석
1) 상호 참조를 통해 correct 문자열이 어떤 함수에서 참조되는지 확인 가능
- View - Open subviews - Cross References, 단축키 x
- main에서 correct 문자열 참조
2) f5를 사용해서 디컴파일
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;
}
- sub_140001190
- va_start : 가변 인자를 처리하는 함수
- __acrt_iob_func (1) : 스트림을 가져올 때 사용되는 함수 ( 1 : 표준 출력 스트림에 대한 포인터. stdout )
-> 문자열 인자를 받고, stdout 스트림을 내부적으로 사용하는 가변 함수임
-> printf
- sub_1400011F0
- va_start : 가변 인자를 처리하는 함수
- __acrt_iob_func (0) : 스트림을 가져올 때 사용되는 함수 ( 0 : 표준 입력 스트림에 대한 포인터. stdin )
-> 문자열 인자를 받고, 사용자로부터 입력된 문자열을 v4에 저장
-> scanf - sub_140001190 로 input 문자열 출력 -> sub_140001190 로 사용자의 입력을 v4에 저장
-> v4에 저장한 입력값을 sub_140001000의 인자로 사용해 호출 -> 반환 값에 따라 wrong나 correct 출력
-> sub_140001000이 입력값을 검증하는 함수임
- sub_140001000
- strcmp로 문자열(Compar3_the_str1ng)과 비교
-> 문자열과 인자가 같으면 1 반환 -> correct
-> 문자열과 인자가 다르면 0 반환 - wrong
728x90
'CTF' 카테고리의 다른 글
[WHS2 CTF_포렌식] BadGuy2 (1) | 2024.06.11 |
---|---|
[드림핵_포렌식] Reversing Basic Challenge #1 (0) | 2024.05.20 |
[picoCTF_포렌식] information (0) | 2024.02.17 |
[드림핵_포렌식] Enc-JPG (0) | 2024.01.16 |
[H4CKING GAME] Easy (0) | 2024.01.16 |