
해당 프로그램에서 메세지박스를 띄우는 주소로 이동해봅시다.


우선 내가 입력한 시리얼인 CodeEngn 문자열이 담기는 주소가 보입니다.
대충 보았을때 매개변수로 들어가는 걸 보아하니 또 문자열을 비교후 분기하는 내용 같습니다.

우선 lstrcmpiA 함수가 무슨 함수인지 구글에 검색해보았습니다.

두 문자열을 비교하는 함수이며 반환값은

문자열 크기를 비교하여 작으면 음수를 반환하고 크면 양수를 같으면 0을 반환하네요.

후에 반환값이 0인지 체크후 0이면 성공 문으로 가는 코드를 확인 할 수 있습니다.
그럼 해당 프로그램의 시리얼은 07.exe+2000 주소에 담긴 문자열이 시리얼이 되겠네요.
하지만 문제는 내 C 드라이브가 CodeEngn일떄 시리얼을 획득 하는 것입니다.

확인을 위해 C드라이브 명을 CodeEngn으로 변경했습니다.

C드라이브가 CodeEngn일 경우 시리얼은 L2C-5781EqfgEngn4562-ABEX 가 되네요.
이제 L2C-5781EqfgEngn4562-ABEX 시리얼이 어떻게 추출되는지 확인해봅시다.

위로 스크롤 해보니 GetVolumeInformationA 함수를 호출 하는것을 볼 수 있습니다.
해당 함수를 구글에 검색해봅시다.

지정된 디렉토리의 이름에서 부터 볼륨 정보를 가져오는 함수인 것 같네요.
들어가는 매개변수를 확인해봅시다.

들어가는 매개변수를 확인해봤을때 VolumeNameBuffer를 통해
드라이브 명을 가져옴을 알 수 있습니다.
그럼 2번째로 들어가는 매개변수인 VolumeNameBuffer인 주소
07.exe+225C 값에는 내 C드라이브 명이 들어간다는 애기가 됩니다.


후에 4562-ABEX와 CodeEngn 문자열이 KERNEL32.lstrcat 함수를 통과함으로써
07.exe+225C 주소의 값은 CodeEngn4562-ABEX로 바뀌는 것을 확인 할 수 있습니다.


후에 DL에 2를 넣고 메모리주소 07.exe+225C~07.exe+225F
주소의 값을 참조해 +1 연산 시키고 총 2회를 반복 후 07.exe+10AF로 점프하는 구문입니다.
후에 연산을 진행하면 1번째에 DpefEngn 로 변환되는 것을 볼 수 있고

2번째 연산 시에

EqfgEngn 로 최종적으로 변환되는 것을 확인했습니다.

이로써 내 C드라이브명인 CodeEngn가 EqfgEngn로 변환되어 시리얼로 등록됬다는 걸 알 수 있네요.

'Reversing > CTF' 카테고리의 다른 글
| CodeEngn Basic RCE 09 문제 풀이 (0) | 2022.05.08 |
|---|---|
| CodeEngn Basic RCE 08 문제 풀이 (0) | 2022.05.08 |
| CodeEngn Basic RCE 06 문제 풀이 (0) | 2022.05.07 |
| CodeEngn Basic RCE 05 문제 풀이 (0) | 2022.05.07 |
| CodeEngn Basic RCE 04 문제 풀이 (0) | 2022.05.07 |