1. 실습 운영체제 : 우분투 계열 리눅스, x86프로세서
- 해공예 OS에서 사용하는 프로세서는 x86아키텍쳐이다. 각 아키텍쳐는 별개의 기계어를 가진다.
firstprog.c
----------------------------------------------------------
#include <stdio.h> // 컴파일러에게 stdio라는 표준 입출력(I/O) 라이브러리 헤더를 추가하라는 C 문법, 이 헤더 파일은 컴파일될 때 프로그램에 추가된다.
// /usr/include/stdio.h 에 위치하고 표준 입출력 라이브러리용 함수 프로토타입과 일부 변수가 정의되어 있다.
int main() // C 프로그램의 실행은 main() 함수에서부터 시작
{
int i;
for(i=10; i<10; i++)
{
printf("Hello, world!\n");
}
}
---------------------------------------------------------
- 리눅스에서는 gcc(GNU 컴파일러 컬렉션, GNU Compiler Collection)를 사용해 컴파일 및 실행이 가능하다.
- GCC는 C로 작성된 코드를 프로세서가 이해할 수 있게 기계어로 변환해주는 C 컴파일러이다.
- 해공예 제공 라이브OS에서 위 코드를 컴파일하면 a.out이라는 실행 가능한 바이너리 파일이 생성된다.
$ gcc firstprog.c
$ ll
-> a.out (기계어로 변환된 바이너리 파일)
이제 이 a.out을 역어셈블하여 보자.
objdump 명령어는 컴파일하여 실행 가능한 바이너리 파일(파일명.c)을 살펴보는(역어셈블) 명령어이다.
위와 같은 소스를 컴파일한 binary(object 파일 또는 실행 파일) 파일이 있을 때,이 binary 파일을 역어셈블할 때 objdump를 사용하면 된다.
------------------------------------------------------------------------------------------------------------------------------------------------
$ gcc -c -g hello.c
-c로 object 파일만 생성하면서, 소스 코드를 같이 보기 위해 -g 옵션으로 디버그 정보를 추가해서 컴파일했다.
$ objdump -d -S hello.o
-d는 disassemble을 하겠다는 옵션이고, -S는 가능하면 소스와 같이 출력하라는 뜻이다.
컴파일할 때 -g 옵션으로 컴파일하지 않았다면 소스는 출력되지 않는다.
-S 대신 -l 옵션도 사용할 수 있는데, 이 경우 소스 코드 대신 소스 코드의 몇 번째 라인인지가 출력된다.
아래는 그 실행 결과이다.
위의 결과처럼 한줄 단위로 C 소스 코드와 어셈블 코드를 비교할 수 있다.
object 파일이 아닌 실행파일을 objdump로 역어셈블하면 위의 내용이 포함된 더 많은 코드를 볼 수 있다.
'Cyber Security' 카테고리의 다른 글
프로세스 무 응답일 경우 (pchunter, proexp으로 Lower Pane 확인) (0) | 2017.08.16 |
---|---|
워드프레스 취약점 실습_sqlmap (0) | 2017.06.08 |
AT&T 문법과 인텔 문법의 차이 (0) | 2017.06.04 |
[Kali Linux] - Samba 3.5.0 - Remote Code Execution (0) | 2017.05.31 |
Metasploit을 활용한 Windows 7 취약점 스터디 (0) | 2017.05.31 |