kkamagi's story

IT, 정보보안, 포렌식, 일상 공유

Cyber Security

[해킹공격의예술] 1. 직접 해보기 [0x250]

까마기 2017. 6. 7. 22:12
728x90
반응형

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로 역어셈블하면 위의 내용이 포함된 더 많은 코드를 볼 수 있다.





반응형