3-2/정보보호론

Buffer Overflow - 기본적인 어셈블리어(push, pop)(1)

개발자 덕구🐾 2021. 9. 7. 20:32
728x90

*/ 학교 수업을 바탕으로 배운 내용을 정리합니다. 오류가 있을수 있습니다. /*

 

 

 

정보보호 - Buffer Overflow에 대해서 배운다. 

이것을 이해하기위해서는 어셈블리어의 이해가 있어야한다. < 특히, call 과 return>

 

간단한 c언어

이것의 실행파일을 만들고 실행하면 

당연하게도 x is 30이 출력된다.

 

vi 명령어를 이용해 ex1의 txt를 볼수있다. 

txt에는 main의 기계어, 명령어를 볼수있다.

컴파일러가 ex1.c의 코드를 기계어로 바꾼다. (아래 사진에서 55, 89, e5,...등)

그리고 그 기계어들이 해당하는 어셈블리 명령어가 존재한다.

 

 

 

 

-> 예를 들면 55는 push ebp에 해당하고  89 e5는 mov ebp, esp에 해당한다.

 

 

여기서 이해해야하는 것은 각 명령어가 실행될때, 시스템에는 어떤 변화가 발생하느냐 이다.

 

일단 push, pop 을 살펴보겠다,.

 

1) push x

->  이 명령어의 뜻은 x를 저장하라는 뜻이다!

 

2step으로 이루어져있는데

1 step : esp = esp - 4

2 step : mem[esp] = x 이다.

 

esp는 스택의 어떤 영역을 가리키고있다. 

그 공간은 위로 갈수록 주소가 커진다. 

 

esp = esp - 4 -> 이것을 4를 줄인다는 것은 4byte의 공간을 stack에 만드는 것이다.

mem[esp] = x   -> 이것은 방금 만든 esp가 가리키는 공간에 x를 넣겠다는 뜻이다.

esp = esp - 4  

 

숫자는 모두 16진수이면 2개의 16진수는 1byte이다.

만약 x가 20 이라면 

 

mem[esp] = x   

esp가 가리키는 공간( mem[esp] )에 0x20을 넣는다.

 

->  이것이 바로 push!

stack에 esp가 가리키는 공간을 4byte를 확보하고, 16진수의 수를 리틀 엔디안 방식으로 넣는다

 

 

 

2) pop x

 

-> 이 명령어의 뜻은 y에 데이터를 넣고 stack에서는 제거하는 의미이다.

 

2step으로 이루어져있는데

1 step :  y = mem[esp]

2 step : esp = esp + 4 이다.

 

esp가 가리키고 있는 주소의 값 (mem[esp]) 을 y라는 변수에 저장한다.( y = 0x20)

 

 

pop

 

 

그 값을 빼면서 esp가 가리키는 주소의 값을  4 증가시킨다.

앞서 push에서 확보한 4 byte의 공간을 없애는 것이다! 

 

 

 

 

간단하게 오늘은 push, pop을 배웠다. 

다음 포스팅에는 mov, sub, and, call, ret을 다뤄볼것이다.

반응형