티스토리 뷰

안녕하세요!

 

지난 시간에 실습 환경 구축이 완료되었으니 오늘은 프로그램을 한번 만들어보는 시간을 가져보도록 하겠습니다.

 

실습에 앞서 앞으로 사용할 Vim 편집기와 이번 시간에 사용할 어셈블러인 NASM을 설치하도록 하겠습니다.

 

저는 앞으로 모든 실습을 root 권한을 얻은 상태에서 진행할 것이기 때문에 여러분들은 감안하셔서 보시면 됩니다.

 

vim 설치 : apt-get install vim

 

 

이미 설치를 완료했기 때문에 여러분들과 결과가 조금 다를 수 있어요.

 

nasm 설치 : apt-get install nasm

 

 

필요한 도구들을 설치해보았습니다.

 

기본적으로 우분투에 내장되어있는 vi 에디터가 있지만 저는 개인적으로 마음에 들지 않아서 vim 에디터를 사용하겠습니다.

 

실습을 진행할 디렉토리는 여러분들이 자유롭게 생성하셔서 진행해보시길 바랍니다.

 

이번 시간에는 막 돌려보는 프로그램을 하나 짜보도록 하겠습니다.

 

 

hello.asm 이라는 파일을 생성하여 편집해보겠습니다.

 

i를 누르시면 편집이 가능한 상태로 변경됩니다.

 

 

위의 코드를 따라서 치시고 esc 를 누르신다음 wq로 저장하셔서 나오시기 바랍니다.

 

 

'nasm -felf32 hello.asm' -> nasm을 사용할 것이고 elf32 형식으로 파일을 뽑아낼 것이다. hello.asm 파일을 돌리겠다.

'ld -I/lib/ld-linux.so.2 -lc --entry main hello.o' -> nasm을 돌리고 난 결과인 오브젝트 파일을 링크를 하겠다.

 

자 이제 a.out 파일을 실행을 해보도록 하겠습니다.

 

 

결과로 hello, world!가 출력되었습니다.

 

그럼 이번에는 작성한 프로그램을 다시 수정해서 돌려볼게요.

 

 

 

 

이번에도 hello, world! 가 출력이 되긴 했는데 Segmentation fault 에러가 뜨네요.

 

이상한 기계어들을 삭제하고 돌려보니 저런 결과가 발생하네요.

 

우리가 삭제해본 이상한 기계어들은 무엇일까요??

 

일단은 궁금증을 가지시고 넘어가셔도 됩니다.

 

PUSH : 스택에 데이터를 삽입한다.

# push word/dword

# push 명령어는 자동으로 esp를 4바이트 감소시킴.

POP : 스택에서 데이터를 꺼낸다.

# 스택에서 4바이트를 꺼내와서 지정한 레지스터에 삽입한다.

# pop 명령어는 자동으로 esp를 4바이트 증가시킴.

 

자 그럼 프로그램을 하나 더 짜보겠습니다.

 

 

'global main' - >프로그램을 시작하면 가장 먼저 main 섹션을 보겠다.

'section' -> 지금부터는 코드 영역이다.

 

자 위와 같은 프로그램을 하나 짜보았는데요, 결과가 어떻게 나올까요??

 

컴파일과 링크를 한 뒤에 프로그램을 실행시켜볼게요.

 

 

이 프로그램은 아무런 결과도 없고 프로그램이 어떻게 돌아가는지도 잘 모르겠네요..

아까와 같은 Segmentation fault가 발생합니다.

 

다음시간에는 이 프로그램이 실행되는 동안 그 실행되는 내부에서 어떠한 일이 발생하는지 알아보기 위해서 gdb를 사용해서 이 프로그램을 분석해보겠습니다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함