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

+ Recent posts