본문 바로가기

리버스엔지니어링/프로그램 분석

랜덤 뽑기 프로그램 버그 수정

학교에서 가끔 자리를 제비뽑기로 결정하는데요, 일부 종이가 사라져서 2학기부터는 랜덤 뽑기 프로그램을 쓰고있습니다.

그중에 우리 반이 쓰는 프로그램은 베이직 And C님께서 만드신 프로그램을 쓰고있습니다.

이렇게 생겨서 리스트에 번호를 추가한다음 뽑기를 해서 나온 순서대로 앞에서 부터 앉습니다.


근데 왜 이걸 제가 예기하냐고요? 설마 제가 그냥 다른분께서 만드신 프로그램을 소개하려고 포스팅을 할까요.

바로 맨 마지막 리스트가 안뽑히는 버그가 발견되어서 한번 프로그램을 분석해본 후에 직접 리버싱을 통해 버그를 고쳐보았습니다.


일단 맨처음에 바로 뽑기가 어떤식으로 이루어지는지 보겠습니다.

뽑기로 가는방법은 아무런 리스트도 추가하지 않은채 시작을 누르면 나오는 창에 back to user mode를 통해 그 근처로 금방 가실수 있습니다.



뽑기 근처를 보면 이런 부분이 있는데요,

2번째 파란색으로 색칠된 call dword ptr ds:[ecx+D8]이 리스트의 갯수를 구하는 함수입니다.

그러므로 

노란색으로 색칠된 맨 위 jmp구문부터 차례대로 해석을 해보면 리스트의 갯수가 0개 이상이면  jmp구문이 활성화됩니다.

(왜 만든거지??)

두번째로는 리스트의 갯수가 0개일때 jmp구문이 비활성화되서 리스트가 없을경우 "뽑을 리스트에 내용을 추가해주세요"란 메시지창이 뜨게 합니다.


여기서도 마찬가지로 맨 위의 call dword ptr ds:[edx+D8]함수가 리스트의 갯수를 구하는 함수입니다.

그래서 그 밑 jmp구문은 이 뽑기를 했을때 나머지가 0개일때 활성화가 됩니다.

-실제로 같은 주소를 가리킵니다.

그리고 그밑 jo가 가리키는 주소를 따라 가봤더니 overflow를 체크하는 부분입니다.

004066b3주소의 함수를 통해 eax에는 현재 리스트의 갯수가 들어있고, 004066d1주소에서 vbaHresultCheckObject함수때문에 eax값이 바뀌게 되서 그 밑 004066d7주소에서 다시 ax에 리스트의 갯수를 넣어줍니다.

만약 이 값이 0일경우에는 004066de주소의 sub ax,1 명령을 통해 underflow가 발생하므로 

이것을 체크하는것이 바로 jo Random_1.00406a56이네요. 

우리는 평범하게 오버플로우를 일으키지 않고 뽑기를 했으니 그냥 004066E8주소 밑으로 계속 내려가면 되겠습니다.



밑으로 내려가다보면 00406753주소에서 0012f3d4스택 주소에서 랜덤으로 뽑힌 문자가 나오게 됩니다.

그럼 저희는 이 004066e8부터 00406752까지를 보면 되는데요, 아무리 계속 봐도 리스트 갯수를 바꾸거나 하는 일은 일어나지 않습니다.

그래서 다시 곰곰히 생각해본 결과 overflow를 체크할때 1이 빼진상태의 리스트의 갯수가 다시 +1을 통해 복구가 되지 않았다는 것을 알아냈습니다.

그래서 이제 이 버그를 고치기 위해서는 중간에 inc ax명령어를 넣어주면 되겠네요.

근데 중간에 inc ax명령어를 넣기위한 공간이 존재하지 않아서 일단 이건 코드 내용이 변경이 됬나를 체크하는 안티리버싱기법이 없기 때문에 간단하게 끝내기 위해서 jmp구문을 통해 프로그램 맨 뒤의 빈공간으로 보내서 그곳에서 일을 처리하겠습니다.



간단하게 jmp구문과 nop sledding을 넣어주고, jmp된 주소에서는 실제로 작동해야 되는 명령어들을 넣어주면 됩니다.




그 다음에는 dump부분으로 들어가서 오른쪽 클릭-Copy to executable file을 눌러서 새로운 이름의 파일로 저장을 합니다.

그리고 버그가 고쳐진 파일로 프로그램을 잘 이용하면 끝이 납니다.



아 이렇게 해서 랜덤 뽑기 프로그램 버그 수정이 끝이 났습니다.

역시 응용프로그램 수정은 크랙미들과는 다르게 어디서 부터 고쳐야 할지 힌트가 없어서 조금 삽질도 했었네요.

열심히 썻는데 잘 봐주셨으면 좋겠습니다.


※후기


어차피 overflow가 발생할때는 현재 리스트의 갯수가 0일때인데, 0일때는 따로 메시지를 띄우도록 처리를 해놨기 때문에 쓸모가 없는 기능이라 그냥 빼버리신것 같습니다.

http://deun3181.blog.me/140203123324

좀 귀찮게 해서 죄송합니다.. 새로운 버전이 올라왔습니다.


'리버스엔지니어링 > 프로그램 분석' 카테고리의 다른 글

아아 닷지크롬이 막혔습니다.  (1) 2015.01.14
upx 언팩  (0) 2013.04.13