2019. 10. 3. 03:48ㆍReversing
스택의 역할
1. 함수의 로컬 변수 저장
2. 함수의 return address 저장
3. 함수 매개변수 전달
스택의 특징
1. 높은 주소 -> 낮은 주소
... pop -> ESP 증가
... push -> ESP 감소
ESP의 초기 값: 스택 메모리의 아래쪽에 있다.
abex' crackme 1 분석
확인을 한 번 눌러봅시다.
이 글만 보고는 뭘 어떻게 크랙하라는건지 잘 모르겠습니다.
ollydbg로 한 번 뜯어봅시다.
오홍
※ crackme 샘플은 보통 serial key를 맞추는 것이 대부분인데 abex #1이
조금 특이하다고 합니다.
ollydbg로 실행시켜 본 파일의 디스 어셈블리(기계어-> 어셈블리어 코드) 코드입니다.
EP 코드가 매우 짧은데 그 이유는 abex' crackme 파일이
어셈블리 언어로 만들어진 실행 파일이기 때문입니다.
따라서 stub code가 많이 없습니다.
잘 모르는 함수가 나왔습니다.
GetDriveTypeA( )
: 이 함수는 지정한 DISK가 어떤 형태의 저장소인지를 판단한다고 합니다.
Return code | Return value | Description |
DRIVE_UNKNOWN | 0 | 드라이브 유형을 확인할 수 없음 |
DRIVE_NO_ROOT_DIR | 1 | 루트 경로가 잘못됨 |
DRIVE_REMOVABLE | 2 | 제거 가능한 드라이브 ex) USB |
DRIVE_FIXED | 3 | 고정 하드디스크 ex) C drive, D drive |
DRIVE_REMOTE | 4 | Network Drive |
DRIVE_COROM | 5 | DVD/ CD-Rom drive |
DRIVE_RAMDISK | 6 | RAM 디스크 |
따라서 이 함수를 실행하면 인자값으로 'C:\'(C drive)가 들어가므로
EAX(window api에서 반환값을 담는 장소)가 3이 될 것입니다.
함수를 호출 한 후 레지스터 윈도우(register window)를 보면
EAX = 3, ESI = 401000으로 세팅이 됩니다.
INC ESI -> ESI 1 증가
DEC EAX -> EAX 1 감소
JMP SHORT abex'cra.00401021 -> 401021은 바로 다음 줄이므로 의미없는 명령입니다.
->리버서들을 혼란 주기 위한 코드
INC ESI -> ESI 1 증가
INC ESI -> ESI 1 증가
DEC EAX -> EAX 1 감소
------------------------------------------------------
EAX=1, ESI =401003
따라서 지금 EAX와 ESI의 값이 다른데 그래서 이 문제를 풀 수 있는 방법은
1) 조건 분기 변경
2) EAX 또는 ESI 값 변경
과 같이 있을거 같습니다.
저는 조건 분기 변경을 사용하겠습니다.
CMP에서 EAX와 ESI를 비교하는데
둘의 값이 다르므로 ZF(Zero Flag)는 0이 됩니다.
따라서 JE(JMP if Equal)를 실행하지 않는데,
JMP는 그냥 무조건 점프를 하기 때문에 위와 같이 바꿔주면 패치가 됩니다.
JE, JMP?
JE(JMP if Equal): 만약 ZF가 1이라면 점프
JMP: 무조건 점프
파일을 저장하면
다음과 같이 잘 패치가 된것을 보실 수 있습니다.
수고하셨습니다.!!
참고
스택에 파라미터를 전달하는 방법
이를 c언어로 변환한다면 다음과 같습니다.
잘 보면 파라미터가 역순으로 들어간다는 것을 보실 수 있습니다.
그 이유는 스택의 자료구조 FILO 때문인데요.
따라서 파라미터를 역순으로 넣어주면 받는 쪽(MessageBoxA) 함수내부에서는
올바른 순서로 꺼낼 수 있습니다.
스택은 프링글스 통과 같아서(아래 있는 과자를 위에 과자를 빼지 않고 먹을 수 없음)
순차적으로 값을 접근 할 수 밖에 없습니다.
따라서 위로 접근할 때는 역순으로 받아야 하는 것 입니다.
비유가 적절했는지는 모르겠네요. ㅎ
긴 글 봐주셔서 감사합니다.
'Reversing' 카테고리의 다른 글
IA-32 Register 설명 (0) | 2019.09.10 |
---|---|
컴퓨터 구조 01 -제어장치와 명령어 (0) | 2019.06.25 |
컴퓨터 메모리&레지스터 구조 (0) | 2019.06.19 |