rev-basic-2 풀이
1. 문제.
이 문제는 사용자에게 문자열 입력을 받아 정해진 방법으로 입력값을 검증하여 correct 또는 wrong을 출력하는 프로그램이 주어집니다.
해당 바이너리를 분석하여 correct를 출력하는 입력값을 찾으세요!
획득한 입력값은 DH{} 포맷에 넣어서 인증해주세요.
예시) 입력 값이 Apple_Banana일 경우 flag는 DH{Apple_Banana}
2. Detect it Easy 사용
다운받은 chall2.exe 파일의 정보를 추출하기 위해 실행시킨다.
내부를 확인하면 PE64로 컴파일 되었을 뿐 별다른 정보는 존재하지 않는다.
3. PE VIEWER
우선 DOS_HEADER와 다른 분석은 끝난 상태에서 rdata, data, pdata를 확인하게 된다.
물론 PE 파일에서 data 와 같은 세션명을 변경해서 쓸 수 있지만, 프로그램의 입출력 변수를 담당하고 있으니 우선적으로 확인한다.
현재 Characteristics에서는 MEM_READ 까지 2개의 Value가 존재하는 것을 확인할 수 있다.
해당 Characteristics에서는 IMAGE_SCN_MEM_WRITE가 존재하는 것을 확인할 수 있다.
쓰기 가능한 세션이 존재하니 더욱 유심히 확인해야 한다.
문제의 표시되어있던 Input 과 Correct, Wrong이 적혀져 있는 것을 확인할 수 있다.
위 그림에는 4바이트 문자가 들어있는 것이 보인다.
이게 정답일 수도 있을 것이라 생각하고 넘어가도록 한다.
4. IDA
현재 IDA에서 해당 프로그램을 확인하면 Correct 와 Wrong 으로 가는 분기를 가지고 있다.
아래는 위의 코드를 디컴파일 했을때의 로직을 보여주고 있다.
아래는 sub_140001000( ) 함수의 내부 로직이다.
__int64 __fastcall sub_140001000(__int64 a1)
{
int i; // [rsp+0h] [rbp-18h]
for ( i = 0; (unsigned __int64)i < 0x12; ++i )
{
if ( *(_DWORD *)&aC[4 * i] != *(unsigned __int8 *)(a1 + i) )
return 0;
}
return 1;
}
간단히 유추를 하자면 aC[4*i] 는 4바이트 문자를 하나씩 의미하는 것으로 보인다.
우측의 a1+i 는 0x12로 적혀져있는 것으로 보니 18자(10진수)의 값으로 구성되어 있으며 이 문자들을 비교하는 것으로 보인다.
5. x64dbg
디버깅을 시작한다.
우선 조건분기를 요청하는 곳까지 실행을 시키도록 한다 조건분기는 아래와 같다.
함수를 호출한 7FF608EF1120 내부를 확인해보도록 한다.
Call chall2.7FF608EF1000
test eax, eax
je chall2.7FF608EF1186
여기서 위 코드를 이해해야한다.
7FF608EF1000을 호출하고 함수에 대한 return이 0 일 경우 0끼리 AND 연산을 해 0이 되어 1186으로 넘어간다.
혹여 1000번에 대한 리턴 값이 있을 경우, je를 넘어 EF1177로 넘어가게 된다.
이제, 우리는 FRIDA 에서 봤던 2FF608EF1000의 내부를 확인해보도록 한다.
이 로직을 확인하면 위의 IDA 가 분석한 로직이 생각날 것이다.
__int64 __fastcall sub_140001000(__int64 a1)
{
int i; // [rsp+0h] [rbp-18h]
for ( i = 0; (unsigned __int64)i < 0x12; ++i )
{
if ( *(_DWORD *)&aC[4 * i] != *(unsigned __int8 *)(a1 + i) )
return 0;
}
return 1;
}
이 로직을 통해 우리가 추리해 볼 수 있는 것은 aC는 문자 하나를 4바이트로 저장하는 형식을 쓰는 테이블 형식이다.
※ 테이블이란?
4바이트로 확장된 값들이 배열된 것을 테이블이라 부른다.
그 맞은편 = a1+i 은 a1[i] 로 유추해볼 수 있다. 그러면 a1은 버퍼를 담고 출력하므로 1바이트를 소비하는 것으로 볼 수 있는 이유는 DWORD와 unsigned_int8로 4바이트와 1바이트의 차이로 인해서 유추해볼 수 있다.
정답
Comp4re_the_arr4y 이다.
유추할 수 있는 방법이 많았던 만큼 쉬웠던 문제였다.
'Dreamhack > Dreamhack(1단계)' 카테고리의 다른 글
rev-basic-4 (Reversing) (1) | 2025.06.13 |
---|---|
rev-basic-3 (Reversing) (1) | 2025.06.04 |
File Vulnerability Advanced for linux (웹 해킹) (0) | 2024.10.25 |
Command Injection Advanced (웹 해킹) (0) | 2024.10.23 |
error based sql injection (웹 해킹) (0) | 2024.10.23 |