War Game/misc

[Rev] Abex' CrackMe 1 w/ DLL Injection

ReTeu 2023. 5. 22. 14:54

  리버싱 초심자들에게 필수 코스인 Abex CrackMe 1단계 (CD ROM 그 문제)를 대상으로 간단한 DLL Injection을 이용하는 방법으로 해결한 풀이를 발견해 정리해봤다. DLL Injection을 처음으로 시도해보는 컨셉이기에 DLL 내용 자체가 대단하진 않고 이러한 방식으로 DLL을 짜서 공격을 수행해볼 수 있다 정도의 체험을 해봤다는 느낌으로 봐주길 바란다.

0x40103D에 로드된 함수의 실행 결과에 따라 ESI 값과 비교하여 성고 또는 실패 다이얼로그를 띄우는 코드로 점프하는 분기가 0x401026에 담겨있다. DLL을 이용해 저 부분의 코드를 조작할 수 있다면 디버거에 의한 개입 없이 프로그램을 무력화할 수 있게된다. 물론 이 경우, DLL의 목표는...

  0x401026의 opcode를 eax 값과 esi 값이 다를 때에 성공 분기로 점프하도록 만드는 것이겠다. (물론 JMP로 바꿔도 되지만, 직접 결과가 의도한대로 바뀌었는지 확인해볼 수 있도록 JE의 반대 의미인 JNE로 바꿔보겠다.)

 

  DLL은 Notepad.exe를 대상으로 실습했던 코드를 그대로 긁어왔다. GetModuleHandleA(NULL)의 경우, 해당 모듈을 호출한 프로세스의 핸들 값을 리턴한다. CrackMe.exe에서 해당 DLL을 호출할 것이므로, CrackMe.exe의 핸들 값이 반환된다. 이후 해당 핸들 값에 타겟 주소인 0x401026만큼 더해주면 문제의 분기점에 도달할 수 있게된다. 그런데 해당 메모리 공간에 대하여 읽기 권한만을 가지고 있기 때문에, VirtualProtect()를 통해 쓰기 권한까지 다시 부여받을 필요가 있다.

읽기/쓰기 권한을 모두 획득한 다음에는 비로소 공격자가 원하는 코드로 수정해줄 수 있게된다. 참고로 주석에 명시한 바와 같이 0x75는 opcode JNE를 의미한다.

 

 

 

 

 

 

DLL을 주입한 이후 프로그램을 실행하고 디버거에 물려보니 0x401026에 조작한 명령어가 담긴 상태로 메모리에 로드된 것을 확인할 수 있었다. 끗!

 

'War Game > misc' 카테고리의 다른 글

[Rev] Crack Me (Serial Authentication) Write-up  (0) 2023.04.15