맨위로

이 글은 코드엔진(http://codeengn.com/) 에서 제공하는 리버스 엔지니어링 관련 다양한 문제들을 풀어보면서 리버스 엔지니어링을 공부하는 목적으로 작성되었습니다. 이글을 작성하는 필자도 리버스 엔지니어링에 흥미를 가지고 공부하는 입장이므로 잘못된 내용이 있을수도 있습니다. 잘못된 내용이 있다면 댓글이나 방명록에 알려주세요 :)

Challenges : Basic 12 


Author : Basse 2002

Korean : 

Key를 구한 후 입력하게 되면 성공메시지를 볼 수 있다 

이때 성공메시지 대신 Key 값이 MessageBox에 출력 되도록 하려면 파일을 HexEdit로 오픈 한 다음 

0x???? ~ 0x???? 영역에 Key 값을 overwrite 하면 된다. 

문제 : Key값과 + 주소영역을 찾으시오 

Ex) 7777777???????? 

English : 

You will see a success message after finding the key. 

If you would want the Key itself to replace the success message in the MessageBox, 

open up a Hex Editor and overwrite the key value in the offset range 0x???? ~ 0x????. 

Q : find the key value and the offset range and write the solution in this format : key???????? 

(first ???? for the start and the next 4 ?s for the end). 

문제를 읽어보니 key 값을 구하고 key 값을 입력한후 나오는 성공메시지에 key 값을 출력시키게 하라는 문제같습니다. 문제를 확인했으니 일단 프로그램을 실행시켜보도록 하겠습니다.

실행시켜보니 위와같이 key 값을 입력받고 인증하는 전형적인 시리얼 프로그램입니다. 여기서 체크 버튼을 눌렀을때 나오는 메시지를 수정하라는게 이번 문제의 목표겠군요. (잘못된 키값을 입력하면 아무런 메시지도 나타나지 않습니다.)

본격적으로 키값을 찾아내기 위해서 올리디버거를 통해서 열어보도록 하겠습니다.

어셈블리어로 작성되어서 그런지 프로그램이 깔끔한게 눈에들어옵니다. 키값을 찾기위해서 일단 이프로그램에서 사용된 함수들을 확인해보겠습니다. (Search For -> All intermodular calls 을 통해서 쉽게 확인할수 있습니다.)

보아하니 GetDlgItemInt 함수를 이용해서 사용자가 입력한 값을 가져와 키값과 비교를 하는 방식임을 예측할수 있습니다. 그러므로 GetDlgItemInt 함수에 BP를 걸어 사용자 입력값이 어디에 저장되는지 확인하면 보다 쉽게 키값을 찾을수 있을것입니다. 

BP를 설정하고 실행시켜보니 아래의 부분에서 멈추는것을 확인할수 있습니다. 

프로그램의 시리얼 입력칸에 임의의 값을 입력하고 한단계 실행시켜보니 아래 그림처럼 EAX값에 저장되는것을 확인할수 있습니다. (저같은 경우는 5를 입력해보았습니다.)

이제 사용자 입력값이 EAX의 저장된다는것을 확인했으니 EAX와 시리얼값을 비교해서 성공메시지를 출력하는곳으로 분기하는 분기점을 찾아보도록 하겠습니다. 코드를 좀읽다보면 아래와 같이 수상해보이는 코드들이 보입니다.

보아하니 ESI 값에 이상한 값을넣고 그값에서 4 바이트씩 연산을 해서 EBX 에 넣고하는 패턴같습니다. 하나하나 분석하려면 너무복잡하므로 한줄씩 실행시켜보았다. 실행시켜보니 00401068 ~ 00401078 을 반복하다가 결국 EAX 값과 7A2896BF를 비교해서 분기하는 코드였다. 위의 알고리즘은 일종의 낚시 코드라고 볼수있습니다.

결국 이 프로그램의 키값은 7A2896BF 의 10진수값인 2049480383 이 된다. 확인을 위해서 입력해보니 아래와 같이 메시지 박스를 출력한다. 

키값은 찾았으니 이제 성공메시지를 수정하기 위해서 HxD 를 이용해서 열어주도록 하겠습니다. HxD 의 검색기능을 이용해서 쉽게 문자열 (Congratulation, you found the right key)이 있는곳으로 이동할수 있습니다. 

(HxD 는 http://stih.tistory.com/58 에서 다운받을수 있습니다.)

확인결과 0D3B ~ 0D62 까지 문자열이 위치하고 있는것을 확인할수 있습니다. 이저 이주소에 overwrite를 해서 수정해보도록 하겠습니다.

위와 같이 0D3B 부터 0D45 까지 (null 문자 포함) 수정해주면 아래와 같이 성공메시지를 키값으로 변경할수 있습니다.



Posted by STIH

댓글을 달아 주세요