본문 바로가기

Hacking & Security/Exploit

Basic of pwnable

Shellcode



- shellcode란 , 명령 shell을 실행시켜 공격자가 해당 시스템을 제어하는 코드다.

- machine code로 작성된 작은 크기의 프로그램으로 일반적으로 어셈블리어로 작성후 기계어로 변경된다.



 Shellcode를 개발하기 위해서는 다음과 같은 지식을 필요로 한다.

- 우리가 주로 사용하는 많은 프로그램들은 대부분 C언어와 같은 High-level의 언어를 컴파일 과정에 의해 
   Assembly , Machine Language 등과 같은 저수준 언어로 변경된 파일이다.

   (C code는 해당 시스템에 맞는 Assembly Code로 변환 -> 변환된 Assembly code를 Machine code로 표현 )


- 위와 같은 방식으로 Machine code는 메모리에 로드되어 코드를 실행하게 된다.

   즉 , 공격자는 해당 프로그램의 취약점을 이용하여 shell을 획득하기 위해서는 direct한 contact을 위하여 low-level의 언어로 개발된 코드가 필요하다.


- 즉 , Shellcode는 Assembly , Machine-Language같은 저수준 언어로 개발되어야 한다.


 High-level 언어와 Low-level언어 사이에는 어떠한 관계가 있는지를 눈으로 보기 위하여 C언어를 Assembly code로 바꿔보자.




C Code 



해당 C code를 gcc를 통하여 컴파일 후 gdb를 통하여 디버깅 한 결과


이와같이 C언어와 Assembly code는 relation을 갖고 있음을 확인할 수 있다.



우리는 Assembly code를 마음대로 주무르진 못하더라도 흐름을 파악할 수 있는 능력이 필요하다.


Assembly code에서 주로 쓰이는 Instruction에 대해 알아보자.


Instruction 

 Meaning

 mov dest , src

 명령어 이름 그대로 출발지의 value를 도착지에 복사한다.

 push value

 stack value 값을 저장한다.

 pop register

 stack 상단에 위치하는 값을 레지스터에 저장한다.

 call addr

 해당 명령 실행 후 리턴을 위해 call 명령어 다음 명령주소를 스택에 저장한 후 , 함수를 실행시키기 위하여 해당 addr로 점프한다.

 ret

 스택으로 부터 리턴 주소를 pop하고 그 곳으로 점프하여 함수에서 리턴한다.

 inc  dest

 dest 피연산자를 1 증가 시킨다 .  ( increase )

 dec dest

 dest 피연산자를 1 감소 시킨다 .  ( decrease )

 add dest , value

 dest 피연산자에 value 값을 더한다.

 sub dest , value

 dest 피연산자에 value 값을 뺀다.

 or dest, value

 dest 피연산자 값과 value값을 OR 연산한다. 
연산의 결과는 dest에 저장된다.

 and dest , value 

 dest 피연산자 값과 value값을 AND 연산한다.
연산의 결과는 dest에 저장된다.

xor dest, value 

dest 피연산자 값과 value값을 XOR 연산한다.

연산의 결과는 dest에 저장된다. 

lea dest, src 

dest에 src 피연산자의 유효 주소를 로드한다.
( C언어의 포인터 개념과 유사 ) 






'Hacking & Security > Exploit' 카테고리의 다른 글

diff 32bit vs 64bit  (0) 2019.11.20
Return To Libc ( RTL )  (0) 2018.12.29
Return to Shellcode  (0) 2018.12.27
BOF 기초문서  (0) 2018.11.03