Reversing - 스택(Stack), abex' crackme #1 분석
1. 스택(Stack)
// 높은 주소 -> 낮은 주소 (스택에 값을 입력하면 ESP가 감소하고, 값을 꺼내면 ESP는 증가한다)
- 함수 내의 로컬 변수 임시 저장
- 함수 호출 시 파라미터 전달
- 복귀 주소(return address) 저장
2. abex' crackme #1 분석
* 어셈블리 명령어 설명
- PUSH : 스택에 값을 입력
- CALL : 지정된 주소의 함수를 호출
- INC : 값을 1 증가
- DEC : 값을 1 감소
- JMP : 지정된 주소로 점프
- CMP : 주어진 두 개의 operand 비교 ( SUB와 비슷하지만, CMP는 operand의 값이 변경되지 않고,
EFLAGS 레지스터만 변경됨. 두 operand의 값이 동일 하면 ZF=1이다.)
- JE : 조건 분기(Jump if equal), ZF=1이면 점프
* 스택에 파라미터를 전달하는 방법
// MessageBoxA() 함수를 호출하기 전에 4번의 PUSH 명령어를 사용하여 필요한 파라미터를 역순으로 입력.
------------------------------ c 언어로 변환 ------------------------------------------------
MessageBoxA(NULL, "Make me think your HD is CD-ROM.", "abex' 1st crackme", MB_OK | MB_APPLMODAL );
하지만, 받는입장에서 생각하면 Stack은 FIFO이기때문에 역순이 아닌 제대로 받는 것.