문제) Reversing Basic Challenge #4
이 문제는 사용자에게 문자열 입력을 받아 정해진 방법으로 입력값을 검증하여
correct 또는 wrong을 출력하는 프로그램이 주어집니다.
해당 바이너리를 분석하여 correct를 출력하는 입력값을 알아내세요.
획득한 입력값은 DH{} 포맷에 넣어서 인증해주세요.
예시) 입력 값이 Apple_Banana일 경우 flag는 DH{Apple_Banana}
문제와 같이 chall4.exe 파일을 제공한다.
이전 rev-basic 문제들과 비슷하기에 ida를 이용해서 로직을 먼저 확인했다.
이번에도 동일하게 sub_140001000 함수에서 비교가 이루어지는것을 확인할 수 있다.
이번에는 sub_140001000 함수의 Pseudo code를 확인하였다.
__int64 __fastcall sub_140001000(__int64 a1)
{
int i; // [rsp+0h] [rbp-18h]
for ( i = 0; (unsigned __int64)i < 0x1C; ++i )
{
if ( ((unsigned __int8)(16 * *(_BYTE *)(a1 + i)) | ((int)*(unsigned __int8 *)(a1 + i) >> 4)) != byte_140003000[i] )
return 0i64;
}
return 1i64;
}
코드를 대략적으로 분석해보니 Left Shift, 자릿수 소거 등을 이용해서
최종적으로 hex값의 앞뒤가 바뀌는것을 확인할 수 있다.
만약 0010 1100 이 입력으로 들어가면 출력으로 1100 0010이 나온다.
이를 토대로 a1 배열값을 찾아 위 알고리즘에 맞게 변환해주면 FLAG를 얻을 수 있다.
a1 배열의 값이 있는곳은 위에 sub_140001000 함수에서 확인할 수 있다.
byte_140003000[i] 에 있는 값을 참조하므로 Hex View에서 해당 위치를 조회해 보았다.
그렇다면 a1 배열의 값은
{ 24 27 13 C6 C6 13 16 E6 47 F5 26 96 47 F5 46 27
13 26 26 C6 56 F5 C3 C3 F5 E3 E3 } 임을 확인할 수 있다.
나는 16진수값을 텍스트로 변환해주는 사이트를 이용했다.
물론 위 sub_140001000 알고리즘을 기반으로 c언어나 python을 사용해 작성해도 된다.
여기서 주의해야할 점은 위 알고리즘에 따라 (XXXX YYYY → YYYY XXXX)
a1 배열 16진수 값의 앞, 뒤를 서로 바꿔 변환해주어야 한다.
이 점에 유의해서 변환하니 FLAG를 얻을 수 있었다.