본문으로 바로가기

abex Crackme 1번

category Wargame/etc 2017. 8. 24. 07:00


abex 크랙미 첫번째 문제다 실행시켜보자




나의 하드디스크가 CD-Rom인것처럼 인식하도록 만들어야하는것 같다




확인을 누르자 바로 CD롬이 아니라고 뜬다


디버거를 통해 분석해보자




주요 코드들을 찾아볼 수 있었다


위에서부터 분석해보자






MessageBox라는 API 함수를 통해 처음 보았던 창을 띄우는것을 알 수 있다


그다음에 C:\\라는 문자열을 스택에 넣고 GetDriveType 함수를 호출한것을 보아


변수로 넘어간 드라이브명을 가지고 CD롬인지 아닌지 확인하는것 같다


여기서 첫번째 풀이법을 생각해볼 수 있다


push하는 값을 실제 CD롬의 이름으로 바꾸어 주는것이다


다시 코드로 돌아와서 eax를 건드리는 것을 보아 GetDriveType에서 리턴한 값이 CD롬인지 아닌지 판단할 수 있게 해줌을 추측할 수 있다


알아보니 GetDriveType 함수는 드라이브의 종류에 따라 정수를 반환했다


알수없는 디스크 = 0

없는 디스크 = 1

이동식 디스크 = 2

고정 하드디스크 = 3

네트워크 가상드라이브 = 4

CD-ROM = 5

램 = 6


여기서 두번째 풀이법을 생각해볼 수 있다


GetDriveType 함수호출이 끝난 후 반환된 eax의 값을 5로 바꾸어주는것이다


다시 코드로 돌아와서 아래에 몇가지 연산이 존재함을 알 수 있다


어떤 연산을 통해 참거짓을 판별하는지 알아보자


아래 사진은 CD-ROM이 아닌 상황에서 연산직전까지 정상진행한 모습이다



inc esi ---> eax, esi+1

dec eax ---> eax-1, esi+1

inc esi ---> eax-1, esi+2

inc esi ---> eax-1, esi+3

dec eax ---> eax-2, esi+3


결론적으로 eax에서 2를 뺀 값과 esi에서 3을 더한 즉 상수 3과 같은지 비교하게된다


여기서 세번째 풀이법을 생각해볼 수 있다


연산을 수행하기전 eax는 3이었으므로 eax를 감소시키는 연산을 모두 nop으로 바꾸어주면 된다


또한 점프문을 이용하여 네번째 풀이법을 생각해볼 수 있다


je는 ZF가 set 되었을때 동작하기 때문에 해당 위치에서 ZF를 임의로 세팅해주면 된다







마지막으로 전체적인 프로그램의 흐름을 정리해보았다





이렇게 다양한 방법으로 문제를 풀어보았다


물론 위에 적힌 방법 외에도 풀 수 있는 방법이 있으니 조금 더 공부해서 푸는것도 좋을것 같다



'Wargame > etc' 카테고리의 다른 글

abex Crackme 4번  (0) 2017.09.24
abex Crackme 3번  (0) 2017.09.23
[Reversing.kr]Easy Crack  (0) 2017.09.23
[xcz.kr]Web Basic  (0) 2017.08.03
[pwnable.kr]fd  (0) 2017.07.14