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이기때문에 역순이 아닌 제대로 받는 것.
'리버싱 > 리버싱의 핵심원리' 카테고리의 다른 글
PE구조 헤더 (0) | 2019.03.20 |
---|---|
Reversing - 스택프레임 (0) | 2018.12.26 |
Reversing - 바이트 오더링, IA-32 Register 기본 설명 (0) | 2018.12.13 |
Reversing - Hello World! (0) | 2018.12.08 |
Reversing - 시작<기본> (0) | 2018.12.08 |