문제 파일을 다운로드 받고 IDA Pro 7.5를 실행하면 위 그림과 같이 디스어셈블할 수 있다. Correct를 출력하기 쉬해서는 sub_140001000(v4) 함수가 참을 반환해야 Correct가 출력된다.
sub_140001000 함수로 들어가서 코드를 분석하겠다.
for ( i = 0; (unsigned __int64)i < 0x18; ++i ) -> 24번 반복한다.
if ( byte_140003000[i] != (i ^ *(unsigned __int8 *)(a1 + i)) + 2 * i )
return 0i64;
byte_140003000[i] 과 ((i ^ *(unsigned __int8 *)(a1 + i)) + 2 * i )가 같으면 if 문이 거짓이 되어 return 0; 을 실행하지 않는다.
위 그림은 x64dbg 툴을 사용하여 이전에 설명한 byte_140003000에 저장된 문자열을 찾을 것이다. x64dbg의 CPU 창에서 해당 주소 값에 마우스 우클릭하여 덤프에서 따라가기를 클릭하면 해당 위치로 이동할 수 있다. 해당 위치로 가면 24개의 Hex 값이 존재한다. 따라서 현재 조건식에서 입력할 문자열을 제외한 나머지 값들을 모두 알고 있으므로 입력할 문자열을 추출하겠다.
#include <stdio.h>
#include <string.h>
void main()
{
char buf[] ={
0x49, 0x60, 0x67, 0x74, 0x63, 0x67, 0x42, 0x66, 0x80, 0x78, 0x69, 0x69, 0x7B, 0x99, 0x6D, 0x88,
0x68, 0x94, 0x9F, 0x8D, 0x4D, 0xA5, 0x9D, 0x45
};
for (int i = 0; i < 24; i++)
{
buf[i] = buf[i] - i * 2;
buf[i] = buf[i] ^ i;
}
printf("%s", buf);
}
위 C 코드는 입력할 문자열을 추출하기 위해 작성한 코드이다. 해당 코드는 xor을 두번하면 원상태로 돌아온다는 점을 이용하였다.
코드를 실행하면 플래그가 출력된다.
플래그: I_am_X0_xo_Xor_eXcit1ng
'Reversing > 드림핵' 카테고리의 다른 글
[Dreamhack] rev-basic-8 (0) | 2021.04.12 |
---|---|
[Dreamhack] rev-basic-7 (0) | 2021.03.30 |
[Dreamhack] rev-basic-5 (0) | 2021.03.30 |
[Dreamhack] rev-basic-4 (0) | 2021.03.30 |
[Dreamhack] rev-basic-0 (0) | 2021.03.24 |
댓글