1. 프로그램 개발 언어 알아내기
Detect It Easy 프로그램을 설치하고 실행하여 개발 언어, 패킹 여부를 알아내려는 프로그램을 연다.
그렇다면 이런 창이 뜰 건데 여기 빨간 줄이 쳐져 있는것이 그 프로그램의 언어이다.
(패킹 여부는 필자가 이 시점에서 배우지 않아 일단 생략한다.)
패킹 여부와 프로그램의 언어를 알아내는 것은 프로그램을 분석하기에 앞서 중요하다고 하니 꼭 습관을 들여야겠다.
2. 함수 호출 규약
함수를 호출할 때 인자를 전달하는 방식으로 "cdecl", "stdcall", "fastcall"
cdecl : 매개변수가 오른쪽에서 왼쪽으로 스택으로 전달된다.
예를 들어 매개변수가 a,b인 sum 함수를 호출하면...
sum(a,b); b와 a순서로 스택에 전달된다는 의미이다.
또한 종료될 때 호출자가 피호출자의 스택 프레임을 정리한다.
stdcall : 스택으로의 전달방법은 전자와 같고 피호출자 스스로 스택 프레임을 정리한다.
fastcall : 레지스터를 사용하여 전달하고 별도로 스택을 정리할 필요가 없다.
3. abex crackme 3 풀이
일단 위 사진은 프로그램을 실행했을때 뜨는 창이다. 여기서 확인을 누르면
아래 창이 뜨고 프로그램이 종료된다. 이제 ollydbg로 프로그램을 분석해보자
1단계 : 문제의 제시 파일 생성하기
0040_1034와 0040_1039부분을 잘 보자. 여기서 EAX의 값이 -1이라면 위의 실패화면이 뜨게 된다.
그렇다면 이 1차 문제를 해결하려면 abex.l2c라는 파일이 abexcrackme3예제가 있는 곳에 있어야 한다는 의미이다.
그러므로 위 이름의 파일을 생성한다. 그렇다면 저 점프 명령어는 실행되지 않고 0040_1049로 가서 멈추게 된다.
2단계 : 파일의 조건에 맞게 용량 변경하기
브레이크 포인트가 걸려 있는 명령어 위의 0040_1046을 잘 보자 EAX값이 12와 같으면 성공화면이 뜨고 같지 않으면
0040_1060으로 이동하여 2단계 실패 화면이 뜨게 된다.
이 문제를 해결하려면 EAX에 저장되어 있는 값과 (abex.l2c의 용량) 12가 같아야 하는데.
여기서 12는 16진수이므로 10진수로 나타내면 18 즉 18의 크기를 가져야 한다.
크기를 18로 가지게 하려면 일단 메모장을 열어서 숫자 0을 18번 입력하고 저장하자.
그러면 성공화면이 다음과 같이 뜨게 된다.
'리버싱 > 리버싱 입문' 카테고리의 다른 글
리버싱 입문_6장 지뢰찾기 게임 (0) | 2021.04.13 |
---|---|
리버싱 입문 4장 리버싱 좀더 깊숙이 128~139쪽 (0) | 2021.03.23 |
abexcrackme1 풀이 (0) | 2021.03.14 |
리버싱 입문 1장 6. 어셈블러 기초 지식 (0) | 2021.03.10 |
리버싱 입문 1장 4. PE 파일 (0) | 2021.03.07 |