이번 문제는 조금 특이한 문제인것 같습니다.
일단 시리얼번호가 생성되는 과정에서 C드라이브의 이름이 쓰이는것같으므로
먼저, C 드라이브의 이름을 CodeEngn 으로 바꿔줬습니다.
우선 exeinfope를 통해서 까보면
별다른 패킹은 되어있지 않고, 어셈블리어로 직접 작성한 프로그램인것으로 파악됩니다.
우선 프로그램을 실행해보면
저번 문제와 비슷한 구조를 가지고 있습니다.
그리고 임의의 값을 넣어보면
다음과 같은 메세지가 출력되면서 프로그램이 종료되는것을 확인할수 있습니다.
이것들을 이용해서 분석을 해보도록 하겠습니다.
이번에도 저번 문제 처럼, 알고있는 문자열을 통해서 분석을 시작할곳을 찾아내야합니다.
문자열 검색을 해보면, 아까전에 뜬 실패메세지창에 뜬 문자열이 보입니다.
이 문자열이 위치한 함수를 따라가보면
살짝 복잡해 보이는 함수가 있습니다. 위에서 부터 천천히 분석해보겠습니다.
일단 어셈블리를 읽어보면, String 이란 곳에 입력한 시리얼번호가 들어가고
GetVolumeInfomationA 함수를 통해서 C 드라이브의 이름을 가져올거 같습니다.
하지만 정적분석만으로는 분석에 한계가 보입니다. 그러므로 동적분석을 진행해서 좀더 자세히 분석해보겠습니다.
우선 임의의 값으로 1111 을 넣고서 경과를 지켜보면
저의 예상대로 String으로 1111이라는 문자열이 아스키코드에 따른 16진수값이 들어갑니다.
그리고 GetVolumeInfomationA 함수가 호출되면 C 드라이브의 이름이 2번째 인자에 반환됩니다.
그러므로 2번째인자인 VolumeNameBuffer 에는 CodeEngn 이라는 문자열이 저장되어있습니다.
그 다음으로는 아까전에 얻었던 VolumeNameBuffer 문자열과 "4562-ABEX"라는 문자열이 저장된 String2 을 lstrcatA 라는 함수에 인자로 넘깁니다.
이 함수는 두 문자열을 붙힌후 1번째 인자에 반환하는 함수이므로, 최종적으로 VolumeNameBuffer에는 다음과 같은
문자열이 저장됩니다.
이후 이 배열의 첫번째 값에 대한 증감연산을 거치면 첫번째 값은 다음과 같은 값으로 변합니다.
참고로 이 프로그램은 리틀엔디언 구조이므로 0x67667145 = \x45\x71\x66\x67 과 같은 방식으로 저장되어있습니다.
이 값을 문자열로 표현하면, "Eqfg" 라는 문자열이 나옵니다.
그러므로, VolumeNumberBuffer의 최종 문자열은 "EqfgEngn4562-ABEX" 입니다.
그 다음은 이 부분입니다.
먼저 아무것도 없는 바이트 배열과 "L2C-5781"이라는 문자열을 lstrcatA 함수에 인자로 넘기므로 결과적으로
바이트 배열에 "L2C-5781"이라는 문자열이 16진수 형태로 들어가게 됩니다.
그리고 나서 VolumeNumberBuffer에 있는 문자열과 아까 얻은 바이트 배열을 또 lstrcatA 함수에 인자로 넘깁니다.
그러므로 결과적으로 두개의 문자열이 합쳐진 형태는 "L2C-5781EqfgEngn4562-ABEX"이 됩니다.
그리고 이 문자열과 제가 입력한 1111 이라는 문자열을 비교후, 같으면 성공메세지, 다르면 실패메세지를 출력합니다.
그러므로 C 드라이브 이름이 CodeEngn 일때 시리얼값은 L2C-5781EqfgEngn4562-ABEX 입니다.
'워게임 > CodeEngn' 카테고리의 다른 글
[CodeEngn] Basic RCE L09 (0) | 2022.05.19 |
---|---|
[CodeEngn] Basic RCE L08 (0) | 2022.05.19 |
[CodeEngn] Basic RCE L06 (0) | 2022.05.12 |
[CodeEngn] Basic RCE L05 (0) | 2022.05.08 |
[CodeEngn] Basic RCE L04 (0) | 2022.05.04 |