이메일을 적으시면 보안관련 소식을 받을수 있습니다.
이메일:

안녕하세요 팀블로그 3기 호환입니다. 주말도 아닌데 무슨일로 포스팅을 하나 하시는 분들이 계실까요?ㅎㅎ
다름이 아니라 제가 수요일엔 자기전에 리버싱공부를 조금씩 하고 있는데요 정리해서 제 블로그에 포스팅 하다가
여기에도 같이 올려봅니다. 일단 기본적인 올리디버거 설치와 사용법등은 다른분들께서 워낙에 잘해주셔어 저는 바로문제풀이를 해보겠습니다. 앞으로도 종종 정리한거나 크랙미 문제풀이 같은것 올려볼게요 전 실무는 잘 모르니
그저 흔히들 푸시는 문제들로 구성해 보겠습니다.

일주일만에 리버스엔지니어링에 관한 포스팅을 하는군요 일주일동안 잠잠하다 하더니 그제 어제 갑자기 대형사건들이 터져버리네요. 대한민국에 이제 큰어른들께서 전부다 떠나신거 같습니다. 이제 국민들이 정신적으로 의지하고 따를 지도자는 누구일까요? 저는 마땅히 떠오르는 분들이 안계시네요. 아 조금 젊지만 손석희 아나운서 정도 될까요??
 후..우울하지만 시작해 보겠습니다.

오늘은 저번에 Olly 를 이용해서 풀었던 문제를 WinApi를 참조하여서 푸는 방식으로 진행해 보도록 하겠습니다.
일단 저번에 풀었던 크랙미문제 링크 걸어드립니다.

Crack ME(abexcm1.exe) 다운

저번시간에는 그저 Olly를 이용하여서 조건분기가 걸려있는 부분의 어셈소스문구를 무조건분기가 일어나게 함으로써 문제를 해결했는데요 이번엔 역시 Olly를 사용하긴 하지만 내부 레지스터의 값의 변화방식을 알아내어 수정하여 문제를 해결해 보도록 하겠습니다.

일단 우리의 Olly~!!!를 켜봅시다 이론정리하느라 근 한달만에 열어보니 반갑군요..


File ->  Open을 클릭하여서 abexcm1.exe 파일을 열어보도록 하겠습니다. 일단 열면 CPU 모드 창들이 뜨겠죠?
파일이 열리게되면 상단에 하늘색 버튼중에 'E' 라고 써진걸 눌러서 실행모드로 들어갑니다.


눈에 잘띄게 붉은색 네모로 표시를 해놓은 부분입니다.지금 제가 문제를 먼저 풀어본 상태에서 열었던거라 Breakpoint 설정등(아래 CPU 모드의 붉은표시부분들)이 보이는데 처음 여신다면 아무표시도 없는것이 정상입니다.
E 키를 누르면 또다른 창이 뜨고 아래있는 텍스트중 맨위에 우리가 풀문제의 경로가 써져있는 부분이 있을겁니다.
그부분을 오른클릭 해서 뜨는 메뉴중 View names 라고 되어있는 부분을 눌러주세요.

그럼 다음과 같은 창이 또하나 뜨게되는데요. 사용되고 있는 api 함수의 목록을 볼 수 있습니다. 저희가 지금 풀고 있는문제는CD인식을 우회해야 하는 것이므로 보아야 할 api는 바로GetDriveTypeA 가 될것입니다.
다시 오른클릭을하고 Help on symbolic name을 눌러주세요.

 
Help on symbolic name을 누르게된다면 맨처음 Olly를 설치할때 플러그인에 추가했던 Win32api.hlp 파일과 연동되어 해당 api를 검색해서 보여줍니다. 다음과 같이 말이죠.


DRIVE_CDROM 이라는 부분이 보이시죠? CDROM 관련 api가 맞다는 것을 알 수 있습니다.
창을 닫으시고 다시 Olly로 돌아와서 Plugin 메뉴를 누르신 후 Command line을 실행시켜줍니다.
command line 이라는 조그만 창이 뜨면 입력하는부분에 bpx GetDriveTypeA 를 입력해 줍니다. 이 명령은
GetDriveTypeA 라는 레퍼런스를 가진 모든 부분에 Breakpoint를 설정하여 디버깅을 할 때 그 부분 에서 멈춰주게 하는것입니다. 일일히 레퍼런스를 찾을 필요가 없어 시간이 많이 단축됩니다.


다시 Olly 창으로 돌아와서 F9 을 눌러 프로그램을 실행시켜줍니다. 그럼 Breakpoint 가 설정된 부분에서 정지를 하게되는데 이때 F8 을 눌러 Step over 를 하여줍니다.
해당부분을 수행하면 EAX 레지스터의 값이 3이 된것을 알 수 있군요.


오른쪽상단에 글씨가 작아서 잘 안나오긴 했지만 여기까지 무난히 오신 분들이라면 EAX 값이 3이 된것을
확인 하실 수 있을겁니다. 계속해서 F8을 누르면서 한단계씩 진행하다 보면은 DEC EAX 란 부분이 보이고
그 바로 다음줄에 CMP EAX,ESI 라고 적힌 부분을 발견 할 수 있습니다. 바로 이부분이 CDROM을 인식하는거죠
여기서 EAX레지스터의 값을 1만큼 감소시킨후에 CMP(compare의 약자입니다) 명령을 사용하여 ESI 레지스터와 비교후 값이 같으면(JE = Jump Equal)통과를 하게되는것이지요.


하지만 레지스터의 값을 보면 DEC(decrease) 명령때문에 EAX 레지스터의 값이 1만큼 감소하여 2라는 값을 가지고 있는 ESI 레지스터와 값이 다름을 알수있습니다. 그렇다면 우리는 이부분을 어떻게 회피해야하느냐??
바로 EAX레지스터를 DEC로 1만큼 감소시키는것을 없애거나 무력화 시키게 된다면 다음라인에서는
EAX 와 ESI 가 모두 2값을 가지므로 조건분기문을 무사히 통과할 수 있게되겠죠?  DEC 부분을 더블클릭한후
NOP를 입력하고 Assemble 버튼을 한번 눌러줍니다. 그런후 확인하면 소스가 바뀐것을 알 수 있습니다.


다시 F9를 눌러 실행파일을 재시작해 주시면 문제가 해결 된 것을 알 수 있습니다.


오늘은 디버거를 통해서 레지스터값이 어셈블리 언어에 의해 어떻게 변경되는지를 살펴보고 직접 레지스터의 값이
변하지 않도록 조작함으로써 문제를 해결하였습니다. 막상 해보니 무척 쉽다고 느끼시는 분들도 계실테지만, 많이
헤매는 분들도 계실겁니다. 그런 분들은 다시 처음부터 찬찬히 F8을 눌러가며 오른쪽상단의 레지스터값들이 왼쪽상단의 CPU창의 라인이 바뀔때마다 어떻게 변화하는지 비교하면서 보신다면 훨씬 이해가 쉬우실 겁니다.
이상 호환이었습니다 ^^

이포스팅은 호환의IT이야기(http://tigernet.tistory.com)에 공동기재되고 있습니다.
****************************************************************************************************

본 포스팅의 저작권은 보안인닷컴과 작성자에 있으며 상업적 이용을 배제하며 콘텐츠 이용시에는 반드시 출처와 링크를 이용해 주시기 바랍니다. 무단도용은 저작권법에 저촉을 받습니다..

****************************************************************************************************

Posted by 53PE
,