반응형

 

Write-up 쓴 날짜 : 2022-09-30 01:35

 

artgem11.exe
1.37MB
patched_ArtGem.exe
0.66MB

 

주제 - Debugging with W32Dasm, RVA, VA and offset, using LordPE as a hexeditor

 


분석 1

 

 

프로그램을 관리자 모드로 실행하면 설치가 진행되고, 설치된 프로그램을 실행하면 위와 같이 화면이 뜨는데

 

프로그램이 시작되자마자 "UNREGISTERED! REGISTER NOW!" 가 뜬다.

 

 

이 프로그램은 뭔가를 그리고 편집하고 그런 프로그램인 것 같다.

 

 

그림을 그리고 Ctrl + C를 누르니 위와 같이 등록되지 않은 버전에서는 사용 불가능 하다고 뜬다.

 

 

왼쪽 상단에 있는 Info 메뉴 -> Register 메뉴에 들어가면

 

 

위와 같이 뜬다.

 

프로그램 설치 시 입력했던 sean이 그대로 입력되어 있다.

 

 

위와 같이 Key-Code 부분에 입력하고 OK 버튼을 누르면

 

 

위와 같이 Invalid Key! 문자열이 뜬다.

 


분석 2

 

 

바탕화면에 ArtGem 바로가기가 있는데 이 바로가기의 속성에서 ArtGem.exe 파일이 설치된 경로를 확인한다.

 

 

위의 경로에 있는 ArtGem.exe 파일로 분석한다.

 

 

x32dbg로 ArtGem.exe 파일을 열고 문자열 검색을 통해 "Invalid Key!" 문자열을 검색하면 43860E 주소에서 해당 문자열을 참조한다는 것을 알 수 있다.

 

 

43860E 주소 부분으로 가보면 위와 같다.

 

올바른 키를 입력했을 때의 문자열 부분과 올바르지 않은 키를 입력했을 때의 438601 주소로 점프하는 조건 분기문이 있을 것이다.

 

 

위로 스크롤을 쭉 올려서 438578 주소를 보면 같을 때 즉, ZF 플래그가 1일 때 438601 주소로 점프한다.

 

ZF 플래그가 설정되는 부분은 438576 주소의 test 명령어인데, eax 레지스터는 43856E 주소에서 호출하는 함수의 반환값이 들어있을 것이다.

 

43856E 주소에 BP를 걸고 F9로 실행한다.

 

 

위와 같이 Key-Code에 1234512345를 입력한다.

 

 

그러면 위와 같이 43856E 주소에서 멈추게 되고, 함수를 호출하기 전 레지스터들의 값은 위와 같다.

 

esp+28에는 1234512345가 들어있고, 이 값을 ecx에 담은 뒤 스택에 넣는다.

 

이는 434c00 주소에 있는 함수의 인자값이다.

 

즉, 함수의 인자를 레지스터에 담은 뒤 스택에 넣고 함수를 호출하는 것이다.

 

 

434C00 주소의 함수 내부로 들어가면 위와 같다.

 

 

위의 부분은 Key 값으로 입력된 문자열을 4byte씩 잘라 esp+24, esp+28, esp+2C, esp+30 주소에 저장하고, 13번째 자리의 값이 2D(' - ')인지와 그 다음 자리가 0인지 검사하여 값이 같다면 함수를 종료한다.

 

 

1. key 값에서 한 글자씩 가져와 cl에 담는다.
2. eax의 값을 0으로 초기화한다.
3. key 값에 eax 번째 자리의 값이 cl의 값과 같은지 비교한다.
4. 같지 않으면, eax를 증가하여 key 값에서 cl의 값과 맞을 때까지 최대 32번 반복한다.
5. 3번의 결과가 같으면, 증가된 eax의 값을 key 값에서 가져온 한 글자 자리에 넣는다.

 

위 과정을 13번 반복한다.

 

 

위의 알고리즘으로 위와 같이 메모리 공간의 값이 변한다.

 

 

위의 루틴으로 19ED5C 주소의 데이터는 또 변하게 된다.

 

그리고 또 다른 어떠한 연산들을 거친 뒤 함수는 종료하게 된다.

 


풀이

 

 

43856E 주소에서 어떤 함수를 호출한 후 함수의 반환값이 0이면 점프를 해서 "Invalid Key"를 띄운다.

 

그렇다면 함수의 반환값이 1이게 하면 등록 성공 문자열이 나온다.

 

 

434C00 함수 내부에서 마지막에 434D92 주소에서 eax에 값을 담는 부분을 보면 xor로 eax 레지스터의 값을 0으로 만들고 있다.

 

 

위와 같이 NOP으로 채우고 패치된 내용을 저장한다.

 

mov eax, 1과 같은 명령어를 할 수 있으면 좋겠지만 xor eax, eax 명령어보다 길이가 길어서 안된다.

 

 

패치된 파일을 실행하면 위와 같이 나오지만

 

 

? -> Register 메뉴로 가서 위와 같이 입력하면 등록에 성공했다는 메세지가 나온다.

 

프로그램을 껐다가 다시 켠다.

 

 

반응형

'전쟁 > lena tuts4you' 카테고리의 다른 글

[Lenatuts4you] 10-1. Tut.ReverseMe1  (0) 2022.11.02
[Lenatuts4you] 9. pc2am2p  (0) 2022.11.02
[Lenatuts4you] 7. MrBills  (1) 2022.11.02
[Lenatuts4you] 6. pcsurgeon  (0) 2022.11.02
[Lenatuts4you] 5. Visualsite Designer  (0) 2022.11.02

+ Recent posts