
문제에는 해당 바이너리를 분석하라고 되어있는데, 막상 첨부파일엔 .exe파일밖에 없다.
따라서, IDA를 이용해서 정적 분석을 해보고, 안되면 OllyDBG로 동적 분석을 진행하겠다.
main()함수의 내용이다.
사실 rev-basic-8이랑 겉으로 보기에는 구조가 똑같아 보인다.
어셈블리를 완벽하게 해석하진 않았지만, 문자열들과 aInput 등이 보인다.
눈으로 당장 확인 가능한 문자열이 Input, %256s, Correct, Wrong 등이 있는 것을 보아,
Input을 통해 어떤 값을 입력 받고,
그 값이 올바른 값이면 Correct, 아니면 Wrong을 출력하는 프로그램이라고 유추가 가능하다.

이번에도 rev-basic-8와 같이 sub_140001000() 함수를 확인해 보겠다.

_BOOL8 __fastcall sub_140001000(const char *a1)
{
int i; // 블록 인덱스(바이트 오프셋)
int v3; // 입력 길이(널 미포함)
v3 = strlen(a1); // 널 문자 제외한 길이
if ( (v3 + 1) % 8 ) // (길이+널)이 8의 배수가 아니면 탈락
return 0;
// (길이+널) 전체를 8바이트씩 변환한다. 널 문자를 포함시키는 것이 포인트.
for ( i = 0; i < v3 + 1; i += 8 )
sub_1400010A0(&a1[i]); // 8바이트 블록 단위 변환(제자리)
// 변환된 결과의 '앞 25바이트'가 정답 테이블과 동일한지 비교
return memcmp(a1, &unk_140004000, 0x19u) == 0;
}
(strlen(a1) + 1) % 8 == 0 → 입력 길이가 7, 15, 23, 31, … 처럼 7 mod 8 이어야 한다.
널 문자까지 포함해서 정확히 8바이트 배수 블록을 맞춘 뒤 변환하는 구조다.
sub_1400010A0는 8바이트를 받아 제자리로 덮어쓴다.
(상수 테이블, 회전, 덧셈/뺄셈 등을 쓰는 간단한 블록 변환 또는 TEA류일 가능성)
검증: 변환이 끝난 버퍼의 처음 25바이트와 unk_140004000을 memcmp로 비교한다.
따라서, 이 소스코드를 완벽하게 해석하려면 sub_1400010A0 함수에 대한 정보가 추가로 필요하다.