일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- E - Hanging Hearts
- Div. 2
- expand item
- Hello 2023
- django
- 기본키 변경
- 넥토리얼
- 알고리즘 대회
- Round 866
- 밑바닥부터 시작하는 딥러닝 1
- Flutter
- Codeforces Round 831 (Div. 1 + Div. 2)
- 카카오 API
- 코드포스
- 앳코더
- 2022
- 리버싱
- idpiframe_initialization_failed
- 인하대 프로그래밍 경진대회
- list_display
- shake!
- 레지스터
- vue3
- vue-google-login
- 1557
- iupc
- Graph Cost
- Good Bye 2022: 2023 is NEAR
- dart
- 카카오 로그인
- Today
- Total
목록리버싱 (3)
pseong
__cdecl : 함수를 호출한 곳에서 스택을 보정한다. (ex: add esp 8, 함수 호출 전에 푸시해줬던 인자들 스택에서 제거) __stdcall : 함수 내에서 리턴할 때 스택을 보정한다. (ex: ret 16, 함수 호출 전에 푸시해줬던 인자들 스택에서 제거) __fastcall : 인자가 2개 이하일 경우 인자를 푸시하지 않고 edx와 ecx 레지스터를 이용해서 전달한다. __thiscall : __stdcall과 동일하지만 ecx레지스터에 현재 객체 포인터를 전달하고 함수를 호출한다. (class내의 함수에서 사용된다.) TIP) 함수 내의 시작 부분에서 레지스터를 푸시하는 행위는 그 레지스터를 함수 내 연산에 사용하기 위해 이전값을 잠시 저장하는 용도로 자주 해석된다. TIP) void형..

32비트 컴퓨터 기준으로 설명합니다. 함수 호출 시 실행되는 어셈블리어 코드는 다음과 같다. push 세 번째 인자 push 두 번째 인자 push 첫 번째 인자 call 함수 주소 push ebp mov ebp, esp sub esp, 100h (100h는 지역변수 할당 크기, 상황에 따라 달라진다. 함수 종료 시 mov esp, ebp pop ebp 아래 그림을 보면 ebp+8이 첫 번째 인자고, ebp+12가 두 번째 인자, ebp+16이 세 번째 인자이다. 이렇게 증가시키면서 인자 순서를 사용하기 위해 메모리가 감소하는 방향으로 자라나는 스택 메모리 특징 상 세 번째 인자, 두 번째 인자, 첫 번째 인자 이렇게 반대 순서로 스택에 푸시하게 된다. 인자 푸시가 전부 끝나면 함수를 콜 하고 이때 리턴..

같은 레지스터라 해도 사용하는 공간마다 명칭이 다르다. 8 비트 : AH, AL (Higt, Low) 16 비트 : AX 32 비트 : EAX 64 비트 : RAX 레지스터의 역할 레지스터에는 8가지 종류가 있다. 각 각 주로 쓰이는 용도가 존재하고 다른 용도로 사용해도 된다. EAX 산술 계산, 리턴 값 전달 (Accumulator) EDX 산술 계산 (Data) ECX 반복문 카운팅, 주로 몇 번 반복할지 숫자를 저장하고 다운 카운트한다. (Count) EBX 아무 용도로 쓰임 ESI 메모리 복사 시작 인덱스 (Source) EDI 메모리 복사 목적지 인덱스 (Destination) EBP 현재 스택 프레임의 시작 주소(Base) ESP 현재 스택 프레임의 마지막 주소(Stack)