본문 바로가기

카테고리 없음

2024.8.7 리버싱 공부(나뭇잎 책)

스택 프레임

함수 호출하려면 인자를 역순으로 스택에push하고 call한다. (call하면 함수 리턴 시 복귀할 주소가 스택에 push됨.)

함수에 들어가면 EBP(베이스 스택)을 push해서 저장해 두고 ESP(스택 포인터)를 EBP로 만들어서 새로운 스택 프레임에서 EBP를 기준으로 계산하여 사용함 EBP - x 는 local 변수 EBP + x 는 parameter( 스택은 거꾸로 자라서, 즉 스택은 push되면 주소가 작아지고 pop하면 주소가 커져서)

 

스택 늘릴때 SUB ESP, x(할당할 크기)

 

return할때 ESP를 EBP 로 바꿔주고 EBP에 POP하면 이전 EBP가 들어옴.

PUSH POP은 ESP기준

호출 함수에서 return 된 후

파라미터로 넘겨준 크기만큼 ADD ESP, (파라미터들 데이터 크기)

 

XOR EAX, EAX - 0으로 만들때 사용 MOV EAX,0 보다 빨라서 사용.

 

내 이해 정리 ESP는 POP, PUSH, SUB, ADD로 스택에 IO

EBP는 코드에서 사용할때 BASE가 되어서 EBP +- x 로 변수 접근 , 복귀 주소, 접근의 기준,책갈피, 북마크 느낌

 

test 명령어

test eax, eax              - eax가 0이면 zf = 1 , eax가 0이 아니면 zf=0

 

jne 명령어 

zf가 0이면 점프

 

 

https://learn.microsoft.com/ko-kr/sysinternals/downloads/process-explorer#download

 

Process Explorer - Sysinternals

프로세스가 열어 둔 어떤 파일, 레지스트리 키, 기타 개체, 로드한 DLL 등을 찾으세요.

learn.microsoft.com

 

process explorer

프로세스의 트리구조, pid, cpu점유율, 로딩된 DLL 정보 등 표시

 

함수 호출 규약

 

cdecl

-caller가 스택에 입력한 파라미터 정리

-가변길이 파라미터 전달 쉬움

 

stdcall

-callee가 스택에 입력된 파라미터 정리

-코드가 짧아짐

-다른 언어에서 API 호출할때 호환성이 좋음

 

fastcall

-stdcall 방식이랑 같은데 파라미터 일부를 레지스터를 이용해서 전달

-좀 더 빠른 함수 호출