Reverse Engineering
이무송
Contents
• 변수
• 제어문
• 함수
변수
변수
• 지역변수
• 전역변수
• 구조체
• 동적할당한 변수
• 배열
지역변수
지역변수
지역변수
• 지역변수는 주로 스택([EBP - X])에 MOV 명
령어를 이용해 저장한다.
• MOV □ PTR SS:[EBP-X],2 는 EBP-X가
가리키는 □ byte 공간에 2를 저장한다는 뜻
이다.
전역변수
전역변수
구조체
구조체
구조체
• 구조체 지역변수는 일반 지역변수와 마찬가
지로 MOV 를 통해 저장한다.
• 어셈블리에서는 구조체를 구분하지 못하는
것 같다.
구조체
• 일반변수와 구조체를 구분하기 위해 소스코
드를 작성해보자
구조체
구조체
구조체
st.st2
st.st1
lv
구조체
• 구조체의 자료형은 요소가 붙어있는게 특징
이다.
전역변수
• 올리디버거가 gv(변수명)을 알고 있다는건
어딘가에 전역 변수명이 저장되어있는 공간
이 있다는 것이다.
• 전역변수는 코드 영역 근처에 있는것 같다
동적 할당한 변수
동적 할당한 변수
리턴값이 void * --> 주소값
동적 할당한 변수
동적 할당한 변수
리턴값이 void * --> 주소값
배열
배열
배열
IMUL ECX,EAX,0 --> ECX = EAX * 0
SHL EDX,0 --> EDX = EDX >> 0
제어문
제어문
• 플래그 레지스터 (EFLAGS)
• if
• if ~else
• switch
• while
• for
• do ~ while
플레그 레지스터(EFLAGS)
• 컴퓨터의 산술연산이나 어떤 특정한 사건이
발생할때 플래그가 set이되고 clear가 되는
레지스터다.
플레그 레지스터(EFLAGS)
• CF (Carry Flag) - 산술 연산을 할 때, 자리올림이나
자리 내림할때 set(1) 된다.
• PF (Parity Flag) - 산술 연산을 할 때, 하위 1byte중
1bit가 짝수개면 set(1) 그렇지않으면 clear(0) 된다
• ZF (Zero Flag) - 산술 연산결과가 0이면 set(1) 된다.
제어문에서 많이 사용한다.
• SF (Sign Flag) - 최상위 bit(MSB)의 결과와 같은 결
과로 set(1) 또는 clear(0) 된다
• OF (Overflow Flag) - 연산결과가 Overflow가 될때
set(1)된다.
if
if
if
CMP - 오른쪽에 있는값이 왼쪽에 있는 값을
빼서 Flag를 세팅하는 명령어다.
*TEST - 오른쪽에 있는값이 왼쪽에 있는 값과 AND 연산을 하여 Flag를
세팅하는 명령어다.
CMP,TEST 명령어를 수행할 때, 두 피연산자
의 값은 바뀌지 않는다
if
• JMP [주소값] - 해당 주소값의 명령어로 이
동한다(점프한다)
• JLE - CMP 나 TEST를 할때 세팅되는
FLAG에 따라 점프를 한다.
(JLE는 CMP를 할때 왼쪽이 오른쪽보다 작거나 같을때 JMP를 한다)
if ~ else
if ~ else
switch
switch
switch
switch
while
while
for
for
do ~ while
do ~ while
함수
• 스택 프레임
• 예제(인자값 ,리턴값 없는함수)
• 인자값을 넘겨 함수를 호출 할 때
• 예제(인자값 있고,리턴값 없는함수)
• Retrun 값이 있을때
• 예제(Return 값이 있는 함수)
스택 프레임
• 프로그램에서 어떤 함수를 호출할 경우 그
함수는 자신만의 변수 공간을 갖는다.
• 그 변수 공간을 스택 프레임이라고 부른
다.(스택 영역에 변수를 저장하므로)
스택 프레임
• 그 스택 프레임안에는 호출한 함수가 기능
을 수행한 후 돌아갈 RETURN 주소와 돌아
갈때 복구해야할 EBP값(EBP값으로 함수의
지역변수 참조)이 저장되 있다.
스택 프레임
• 각 함수마다 스택 프래임을 생성하거나 해
제하는 명령어가 있는데 이것을 함수 프롤
로그(PUSH EBP /MOV EBP ESP), 함수 에필로그(MOV
ESP,EBP/ POP EBP /RET)라 한다. 이것으로 함수의
시작과 끝을 알 수 있다.
스택 프레임
• 함수를 호출하면서 스택 프래임이 어떻게
생성되고 생성된 스택 프레임이 어떻게 변
수를 참조하는지 보자!!
예제(인자없는,리턴값 없는 함수)
예제(인자없는,리턴값 없는 함수)
스택
main함수를 호출한 함
수로 복귀할 주소값
0x0018ff48 ESP
예제(인자없는,리턴값 없는 함수)
스택
main함수를 호출한 함
수의 EBP값
main함수를 호출한 함
수로 복귀할 주소값
0x0018ff44 ESP
PUSH EBP 실행
예제(인자없는,리턴값 없는 함수)
스택
main함수를 호출한
함수의 EBP값
main함수를 호출한
함수로 복귀할 주소값
0x0018ff44 ESP
MOV EBP,ESP 실행
//main함수의 스택프레임 생성
EBP
예제(인자없는,리턴값 없는 함수)
스택
fucntion 함수를 호출한
함수로 복귀할 주소값
main함수를 호출한 함
수의 EBP값
main함수를 호출한 함
수로 복귀할 주소값
0x0018ff40 ESP
CALL function 실행
EBP
예제(인자없는,리턴값 없는 함수)
스택
function 함수를 호출한
함수의 EBP 값
fucntion 함수를 호출한
함수로 복귀할 주소값
main함수를 호출한 함
수의 EBP값
main함수를 호출한 함
수로 복귀할 주소값
0x0018ff3C ESP
PUSH EBP 실행
EBP
예제(인자없는,리턴값 없는 함수)
스택
function 함수를 호출한
함수의 EBP 값
fucntion 함수를 호출한
함수로 복귀할 주소값
main함수를 호출한 함
수의 EBP값
main함수를 호출한 함
수로 복귀할 주소값
0x0018ff3C ESP
MOV EBP,ESP 실행
//funtion 함수의 스택프레임 생성
EBP
예제(인자없는,리턴값 없는 함수)
스택
function 함수를 호출한 함수의 EBP
값
fucntion 함수를 호출한 함수로 복귀
할 주소값
main함수를 호출한 함수의 EBP값
main함수를 호출한 함수로 복귀할
주소값
0x0018ff34 ESP
SUB ESP,8 실행
//function 함수의 지역변수 공간 마련
EBP
예제(인자없는,리턴값 없는 함수)
스택
1
function 함수를 호출한 함수의 EBP
값
fucntion 함수를 호출한 함수로 복귀
할 주소값
main함수를 호출한 함수의 EBP값
main함수를 호출한 함수로 복귀할
주소값
0x0018ff34 ESP
MOV DWORD PTR SS:[EBP-4],1 실행
EBP
예제(인자없는,리턴값 없는 함수)
스택
2
1
function 함수를 호출한 함수의 EBP
값
fucntion 함수를 호출한 함수로 복귀
할 주소값
main함수를 호출한 함수의 EBP값
main함수를 호출한 함수로 복귀할
주소값
0x0018ff34 ESP
MOV DWORD PTR SS:[EBP-8],2 실행
EBP
예제(인자없는,리턴값 없는 함수)
스택
2
1
function 함수를 호출한 함수의 EBP
값
fucntion 함수를 호출한 함수로 복귀
할 주소값
main함수를 호출한 함수의 EBP값
main함수를 호출한 함수로 복귀할
주소값
0x0018ff3C ESP
MOV ESP,EBP 실행
//function 함수 스택프레임 해제 과정
EBP
예제(인자없는,리턴값 없는 함수)
스택
2
1
function 함수를 호출한 함수의 EBP
값
fucntion 함수를 호출한 함수로 복귀
할 주소값
main함수를 호출한 함수의 EBP값
main함수를 호출한 함수로 복귀할
주소값
0x0018ff40 ESP
POP ESP 실행
//function 함수 스택프레임 해제 과정2
EBP
예제(인자없는,리턴값 없는 함수)
스택
2
1
function 함수를 호출한 함수의 EBP
값
fucntion 함수를 호출한 함수로 복귀
할 주소값
main함수를 호출한 함수의 EBP값
main함수를 호출한 함수로 복귀할
주소값
0x0018ff40 ESP
RET(RETN) 실행
//function 함수 종료
EBP
인자값을 넘겨 함수를 호출 할 때
• 어셈블리어에선 인자값을 PUSH로 넘겨준
다.
• PUSH를 넘겨줄 때 C언어의 순서와 반대로
넘겨준다
• EBP를 기준으로해서 인자값을 사용 할 수
있다.
예제(인자값 있고,리턴값 없는함수)
예제(인자값 있고,리턴값 없는함수)
스택
main함수를 호출한 함
수로 복귀할 주소값
0x0018ff38 ESP
예제(인자값 있고,리턴값 없는함수)
스택
main함수를 호출한 함
수의 EBP값
main함수를 호출한 함
수로 복귀할 주소값
0x0018ff34 ESP
PUSH EBP 실행
예제(인자값 있고,리턴값 없는함수)
스택
main함수를 호출한 함
수의 EBP값
main함수를 호출한 함
수로 복귀할 주소값
0x0018ff34 ESP
MOV EBP,ESP실행
//main의 스택프레임 생성
EBP
예제(인자값 있고,리턴값 없는함수)
스택
2
main함수를 호출한 함
수의 EBP값
main함수를 호출한 함
수로 복귀할 주소값
0x0018ff30 ESP
PUSH 2 실행
//인자값 전달
EBP
예제(인자값 있고,리턴값 없는함수)
스택
1
2
main함수를 호출한 함
수의 EBP값
main함수를 호출한 함
수로 복귀할 주소값
0x0018ff2C ESP
PUSH 1 실행
//인자값 전달
EBP
예제(인자값 있고,리턴값 없는함수)
스택
fucntion 함수를 호출한
함수로 복귀할 주소값
1
2
main함수를 호출한 함수
의 EBP값
main함수를 호출한 함수
로 복귀할 주소값
0x0018ff28 ESP
CALL function실행
//인자값 전달
EBP
예제(인자값 있고,리턴값 없는함수)
스택
function 함수를 호출한 함수의 EBP 값
fucntion 함수를 호출한 함수로 복귀할
주소값
1
2
main함수를 호출한 함수의 EBP값
main함수를 호출한 함수로 복귀할 주소
값
0x0018ff24 ESP
PUSH EBP 실행
EBP
예제(인자값 있고,리턴값 없는함수)
스택
function 함수를 호출한 함수의 EBP 값
fucntion 함수를 호출한 함수로 복귀할
주소값
1
2
main함수를 호출한 함수의 EBP값
main함수를 호출한 함수로 복귀할 주소
값
0x0018ff24 ESP
MOV EBP,ESP 실행
//function 함수의 스택프레임 생성
EBP
예제(인자값 있고,리턴값 없는함수)
스택
function 함수를 호출한 함수의 EBP 값
fucntion 함수를 호출한 함수로 복귀할
주소값
1
2
main함수를 호출한 함수의 EBP값
main함수를 호출한 함수로 복귀할 주소
값
0x0018ff24 ESP
MOV EAX,DWORD PTR SS:[EBP+C] 실행
//EAX = 2
EBP
예제(인자값 있고,리턴값 없는함수)
스택
function 함수를 호출한 함수의 EBP 값
fucntion 함수를 호출한 함수로 복귀할
주소값
1
2
main함수를 호출한 함수의 EBP값
main함수를 호출한 함수로 복귀할 주소
값
0x0018ff24 ESP
ADD EAX,1 실행
//EAX = 3
EBP
예제(인자값 있고,리턴값 없는함수)
스택
function 함수를 호출한 함수의 EBP 값
fucntion 함수를 호출한 함수로 복귀할
주소값
3
2
main함수를 호출한 함수의 EBP값
main함수를 호출한 함수로 복귀할 주소
값
0x0018ff24 ESP
MOV DWORD PTR SS:[EBP+8],EAX 실행
//EAX = 3
EBP
예제(인자값 있고,리턴값 없는함수)
스택
function 함수를 호출한 함수의 EBP 값
fucntion 함수를 호출한 함수로 복귀할
주소값
3
2
main함수를 호출한 함수의 EBP값
main함수를 호출한 함수로 복귀할 주소
값
0x0018ff28 ESP
POP EBP 실행
//function 함수 스택프레임 해제 과정1
EBP
예제(인자값 있고,리턴값 없는함수)
스택
function 함수를 호출한 함수의 EBP 값
fucntion 함수를 호출한 함수로 복귀할
주소값
3
2
main함수를 호출한 함수의 EBP값
main함수를 호출한 함수로 복귀할 주소
값
0x0018ff2C ESP
RET(RETN) 실행
EBP
예제(인자값 있고,리턴값 없는함수)
스택
function 함수를 호출한 함수의 EBP 값
fucntion 함수를 호출한 함수로 복귀할
주소값
3
2
main함수를 호출한 함수의 EBP값
main함수를 호출한 함수로 복귀할 주소
값
0x0018ff34 ESP
ADD ESP,8 실행
//인자값으로 넘길때 사용한 스택 정리
EBP
예제(인자값 있고,리턴값 없는함수)
• 참고로 스택을 정리하는 주체에 따라 어셈
블리어가 바뀐다 (함수 콜링 컨벤션 참조)
Retrun 값이 있을때
• 함수에 리턴값이 있을때 EAX 레지스터를 통
해 리턴값을 넘겨준다.
예제(Return 값이 있는 함수)
예제(Return 값이 있는 함수)
스택
main함수를 호출한 함
수로 복귀할 주소값
0x0018ff48 ESP
예제(Return 값이 있는 함수)
스택
main함수를 호출한 함
수의 EBP 값
main함수를 호출한 함
수로 복귀할 주소값
0x0018ff44 ESP
PUSH EBP 실행
예제(Return 값이 있는 함수)
스택
main함수를 호출한 함
수의 EBP 값
main함수를 호출한 함
수로 복귀할 주소값
0x0018ff44 ESP
MOV EBP,ESP 실행
//main 함수의 스택프레임 생성
EBP
예제(Return 값이 있는 함수)
스택
function 함수를 호출한
함수로 복귀할 주소값
main함수를 호출한 함수
의 EBP 값
main함수를 호출한 함수
로 복귀할 주소값
0x0018ff40 ESP
CALL function 실행
EBP
예제(Return 값이 있는 함수)
스택
function 함수를 호출한
함수의 EBP값
function 함수를 호출한
함수로 복귀할 주소값
main함수를 호출한 함수
의 EBP 값
main함수를 호출한 함수
로 복귀할 주소값
0x0018ff3C ESP
PUSH EBP 실행
EBP
예제(Return 값이 있는 함수)
스택
function 함수를 호출한
함수의 EBP값
function 함수를 호출한
함수로 복귀할 주소값
main함수를 호출한 함수
의 EBP 값
main함수를 호출한 함수
로 복귀할 주소값
0x0018ff3C ESP
MOV EBP,ESP 실행
//function 함수의 스택프레임 생성
EBP
예제(Return 값이 있는 함수)
스택
function 함수를 호출한
함수의 EBP값
function 함수를 호출한
함수로 복귀할 주소값
main함수를 호출한 함수
의 EBP 값
main함수를 호출한 함수
로 복귀할 주소값
0x0018ff3C ESP
MOV EAX,5 실행
//리턴값 저장 --> C에서 return 5; 부분
EBP
예제(Return 값이 있는 함수)
스택
function 함수를 호출한
함수의 EBP값
function 함수를 호출한
함수로 복귀할 주소값
main함수를 호출한 함수
의 EBP 값
main함수를 호출한 함수
로 복귀할 주소값
0x0018ff40 ESP
POP EBP
//function 함수 스택프레임 해제 과정1
EBP
예제(Return 값이 있는 함수)
스택
function 함수를 호출한
함수의 EBP값
function 함수를 호출한
함수로 복귀할 주소값
main함수를 호출한 함수
의 EBP 값
main함수를 호출한 함수
로 복귀할 주소값
0x0018ff44 ESP
RET(RETN) 실행
EBP
예제(Return 값이 있는 함수)
스택
function 함수를 호출한
함수의 EBP값
function 함수를 호출한
함수로 복귀할 주소값
main함수를 호출한 함수
의 EBP 값
main함수를 호출한 함수
로 복귀할 주소값
0x0018ff44 ESP
XOR EAX,EAX 실행
//main 함수의 리턴값 저장 --> C에서 return 0; 부분
EBP
예제(Return 값이 있는 함수)
스택
function 함수를 호출한
함수의 EBP값
function 함수를 호출한
함수로 복귀할 주소값
main함수를 호출한 함수
의 EBP 값
main함수를 호출한 함수
로 복귀할 주소값
0x0018ff48 ESP
POP EBP실행
//main 함수의 스택프레임 해제 과정
예제(Return 값이 있는 함수)
RET (RETN)실행
//main 함수 종료
수고하셨습니다!

Reverse Engineering 2015.02.09