today : 2018_10_13
# include <stdio.h>
# include <stdlib.h>
int main(void) {
int* ptrV = (int*)malloc(sizeof(int));
(*ptrV) = 11;
return 0;
}
리버싱 공부 01
'Reverse Eng' 카테고리의 다른 글
today : 2018_10_13 (0) | 2018.10.13 |
---|---|
리버싱 (0) | 2018.10.07 |
리버싱 공부 (0) | 2018.01.22 |
그냥 공부_1 (0) | 2017.11.30 |
Rev_3 (0) | 2017.11.20 |
리버싱
'Reverse Eng' 카테고리의 다른 글
today : 2018_10_13 (0) | 2018.10.13 |
---|---|
리버싱 공부 01 (0) | 2018.10.10 |
리버싱 공부 (0) | 2018.01.22 |
그냥 공부_1 (0) | 2017.11.30 |
Rev_3 (0) | 2017.11.20 |
리버싱 공부
# include <stdio.h>
int f(int, int);
int main(void) {
int x = 0x0;
x = f(10, 20);
return 0;
} // end of main function
int f(int p1, int p2) {
int t = 0x0;
t = p1 + p2;
return t;
} // end of f function
그냥 공부_1
레지스터 집합
RAX [64bit => 8byte]/ EAX [32bit => 4byte]/ AX [16bit => 2byte]/ AH [8bit => 1byte]/ AL [8bit => 1byte]
RBX/ EBX/ BX/ BH/ BL
RCX/ ECX/ CX/ CH/ CL
RDX/ EDX/ DX/ DH/ DL
RBP/ EBP/ BP/ BH/ BL
RSP/ ESP
IA-32 레지스터
------------------------------------------------------------------------------------------------------------------------
EAX :: Accumulator :: 누산기
EBX :: Base :: 베이스
ECX :: Counter :: 카운터, 반복을 요구하는 명령의 경우 반복 횟수 지정
EDX :: Data :: 데이터
EBP :: Base Pointer :: 프레임 포인터
ESI :: Source index :: 송신 측 번지 지정
EDI :: Destination index :: 수신 측 번지 지정
ESP :: Stack Pointer :: 스택 top의 번지 지정, 스택 관리
------------------------------------------------------------------------------------------------------------------------
EAX 가 실제 누산에 관여하는지 확인해 보았다.
[실제 원본 코드]
# include <stdio.h>
int main(void) {
int v1 = 0x10;
int v2 = 0x11;
int v3 = 0x0;
v3 = v1 + v2;
return 0;
}
스택 포인터 (stack pointer , RSP(64bit), ESP(32bit))
[1] 스택의 시작을 기저 (Bottom) 또는 베이스(Base) 라고 함
[2] Push(푸시) : 데이터 삽입 :: (데이터를 삽입하기 전에 Is_Full 이라는 함수를 먼저 호출한다. (왜냐하면 스택의 크기는 무한정 크지 않기 때문이다.))
[3] Pop(팝) : 데이터 제거 :: (데이터를 제거하기 전에 Is_Empty 이라는 함수를 먼저 호출한다.)
스택의 특징
[1] LIFO (후입 선출, Last In First Out) // FILO (First In Last Out)
: 스택 포인터의 감소는 스택 자체가 늘어나는 것을 의미 ( "스택은 거꾸로 자라난다." )
스택 포인터의 증가는 스택 크기가 감소하는 것을 믜미
(* 32비트인 경우는 4바이트, 64비트의 겨우는 8바이트 단위로 스택 포인터가 증가 또는 감소)
ebp : 0019FF04
esp : 0019FEB4 : 10 00 00 00 (little endian)
============================================
ebp : 0019FF04
esp : 0019FEB0 : 11 00 00 00
============================================
ebp : 0019FF04
esp : 0019FEAC : 12 00 00 00
============================================
ebp : 0019FF04
esp : 0019FEA8 : 13 00 00 00
============================================
ebp : 0019FF04
esp : 0019FEAC
ebx : 00000013
============================================
ebp : 0019FF04
esp : 0019FEB0
ebx : 00000012
============================================
ebp : 0019FF04
esp : 0019FEB4
ebx : 00000011
============================================
ebp : 0019FF04
esp : 0019FEB8
ebx : 00000010
============================================
Rev_3
Rev_2
# include <stdio.h>
int f(int param1, int param2);
int main(void) {
int v1 = 10;
int v2 = 11;
int result = 0;
result = f(v1, v2);
return 0;
}
int f(int param1, int param2) {
int tmpSum = 0;
tmpSum = param1 + param2;
return tmpSum;
}