리버싱/모두를 위한 리버싱 지침서 요약 3

1.7 스택

1. 명령어 PUSH X : ESP/RSP/SP 에서 4혹은 8을 빼고 오퍼랜드의 내용을 ESP/RSP/SP가 가리키는 메모리 주소에 기록한다.(스택 맨 위에 X의 값을 넣는다. -> ESP/RSP/SP가 가리키는 메모리 주소에 기록한다는 말은 이 레지스터들은 스택의 가장 위를 가리키므로 즉 오퍼랜드의 값을 스택에 넣는다는 말이다. PUSH 100 을 실행하기 전 스택 PUSH 100을 실행후 스택 상태 : POP은 ESP/RSP가 가리키는 메모리에서 데이터를 가져와 오퍼랜드에 저장한 후 스택포인터에 4또는 8을 더한다. 의 상태에서 pop eax 명령어를 실행하면, esp가 가리키는 메모리 (스택 가장 위의 메모리)0x18FED8의 값 100을 가져와 eax레지스터에 저장한다. 그 후 ESP/RSP에 ..

1.6 함수 프롤로그와 에필로그

아직 초보라 오류가 있을 수 있습니다! 오류 수정은 언제나 환영입니다. 함수 프롤로그의 예 (32bit) 1 : push ebp 2 : mov ebp, esp 3 : sub esp, X 1행 : ebp레지스터의 값을 스택에 저장한다. 2행 : ebp레지스터의 값을 esp의 값으로 설정 3행 : 지역변수용 스택 공간 할당 이때 ebp는 지역 변수나 인자에 접근할 때 사용한다. 함수 에필로그의 예 (32bit) mov esp, ebp pop ebp ret 0 는 아마 밑의 작동방식으로 이해하면 될 것 같다. 예전에 대체 이게 뭐 하는 거지? 했는데 직접 스택을 그려보면서 이해하니 이해가 쉽다.

1장 1.4 리턴값 x86

주의 : 혼자 공부중이여서 틀린 내용이 있을수도 있습니다. 그럴 경우에 언제든지 말씀해주세요! 예제1 C코드 어셈블리1 코드 2~3행 : 함수의 프롤로그이다. 원래 sub esp, ? 가 되어야 하는데, main함수에는 변수가 없기 때문에 없는듯 하다. 4행 : eax레지스터에 리턴값 10을 저장한다. 이건 리턴값을 저장하기 위해 수행된다. 5행 ~ 6행 : 함수의 에필로그이다. ret 명령어는 함수 호출자로 리턴값을 리턴한다.