[codeengn] basic #07

·2025년 6월 26일

CodeEngn 바로가기


문제

컴퓨터 C 드라이브의 이름이 CodeEngn 일경우 시리얼이 생성될때 CodeEngn은 '어떤것'으로 변경되는가


1. 프로그램 실행


프로그램을 실행하면 시리얼 번호를 입력할 수 있는 창이 나타난다. 정답이 아닌 시리얼 번호를 입력하고 check 버튼을 누를 경우 위와 같이 "The serial ... not correct!" 문장이 출력된다.


문제 5번, 6번과 마찬가지로 Search for 기능을 이용해 오류 발생 시 확인할 수 있는 문자열을 검색해 주소를 찾는다. (문제 7번의 경우엔 에러 문자열이 엔트리 포인트에서 멀지 않은 위치에 있어서 스크롤 내려서 찾아도 무방해보인다.)


2. 흐름 파악

각 함수의 동작은 구글링, 혹은 CALL 구문 내부로 들어가 구문을 분석해보면 알 수 있다. 각 함수의 동작은 다음과 같다.

GetDigItemTextA 		-> 사용자 입력 문자열을 00402324에 저장
GetVolumeInformationA 	-> 현재 드라이브 이름을 0040225C에 저장
lstrcatA				-> 두 문자열을 연결 (concatString 문자열이 앞으로 온다.)
lstrcmpiA				-> 두 문자열을 비교

시리얼 번호를 비교하는 전체적인 흐름은 다음과 같다.

GetDigItemTextA			->사용자 입력값을 오프셋 00402324에 저장
GetVolumeInformationA	->현재 드라이브 이름을 오프셋 0040225C에 저장
①lstrcatA				-> 두 문자열을 연결해서 오프셋 0040225C에 저장 (드라이브 이름+4562-ABEX)


MOV DL,2					-> 반복 횟수 지정
ADD DWORD PRT DS:[40225C],1	
....
ADD DWORD PRT DS:[40225F],1	-> 각 자리수마다 4바이트씩 더하기
							   lstrcatA 함수로 더해진 문자열 앞 4글자(드라이브 이름 앞 4글자) 가 변경된다.                         
JNZ SHORT 07.004010AF		-> DL이 0이 아니면 ADD 문으로 점프
							   ADD문을 2회 반복

②lstrcatA					-> "L2C-..." 문자열을 오프셋 00402324에 저장
③lstrcatA					-> L2C... 문자열과 드라이브 이름+4562... 문자열을 연결
							   결과: L2C-5781변형된드라이브명4562-ABEX
lstrcmpiA					-> 사용자 입력 문자열과 최종 연결된 문자열을 비교
							   일치할 경우 리턴값 EAX=0
CMP EAX,0					
JE	SHORT 00401117			-> 일치할 경우 "Yep ... correct serial" 문자열 출력

3. 정답확인

lstrcatA 함수를 이용해 드라이브 이름과 4562-ABEX 문자열을 연결하고, 앞 4글자에 8바이트씩 더하는 로직이 존재한다.

드라이브 이름이 CodeEngn일 경우 ①lstrcatA을 통해 시리얼 번호는 CodeEngn4562-ABEX 가 된다. 이 문자열에서 앞 네 글자에 각 4바이트를 2번씩 더하므로, EqfgEngn4562-ABEX와 같이 변형된다.

③lstrcatA 를 통해 앞단에 L2C-5781문자열이 연결되므로, 드라이브 이름이 CodeEngn일 때 최종 시리얼 번호는 L2C-5781EqfgEngn4562-ABEX가 된다.

직접 드라이브 이름을 CodeEngn으로 변경해도 되지만, IDA 연습을 위해 IDA에서 VolumeNameBuffer의 값을 직접 CodeEngn으로 변경해서 시리얼 번호를 확인해보았다.


아이다를 실행하고 07.exe 파일을 열어준다.

화면을 열어주고 space bar를 한 번 눌러주면 Ollydbg처럼 텍스트 모드로 확인할 수 있다.


단축키는 Ollydbg와 유사하게 사용하는 것 같다. F2 단축키로 lstrcatA 함수를 실행하기 전에 Break Point를 설정하고, F9단축키로 프로그램을 실행한다.

프로그램을 실행하면 시리얼 번호를 입력하는 윈도우 창이 나타난다. 추측한 시리얼 번호 L2C-5781EqfgEngn4562-ABEX를 입력하고 Check 버튼을 누른다.

VolumeNameBuffer 문자열을 더블클릭하면 VolumeNameBuffer 값이 저장된 데이터 영역으로 이동한다.
해당 코드의 의미는 다음과 같다.

; 						-> 주석
VolumeNameBuffer		-> 변수 이름
dd						-> define double word(DWORD)
0						-> 데이터 (드라이브 이름)

VolumeNameBuffer에 저장된 값을 CodeEngn으로 변경해보자. 수정할 라인 0040225C 오프셋을 클릭하고, Edit > Patch Program > Change Byte

CodeEngn 문자열을 hex값으로 변환해 입력한다. (ascii to hex)

43 6F 64 65 45 6E 67 6E

데이터를 CodeEngn으로 변환했다. 상단 Convert to String 버튼을 누르면 문자열로 CodeEngn을 확인할 수 있다. ESC를 누르면 다시 명령어 영역으로 되돌아간다.


이어서 코드를 실행해보면 다음과 같이 성공 알림창을 확인할 수 있다.


기타

아이다 사용은 처음이라 더 좋은 방법이 있다면 공유 부탁. ^^.

코드엔진 깃허브에 가면 다양한 풀이를 확인할 수 있다.

profile
🔥

0개의 댓글