[어셈블리어] 어셈블리 언어 중요한 부분 2번째

Date:     Updated:

카테고리:

태그:

  • gdb_ex1
  • 위는 c언어로 작성된 코드이다. 이 코드를 어셈블리어로 변경하여 해석해보자 !

1. gdb를 사용한 어셈블리어

  • gdb_to_assem

1-1. push %epb / mov %esp, %ebp / sub $0x8, %esp

push %epb
mov %esp, %ebp
sub $0x8, %esp

여기까지 해석을 해보자.
그리고 왜 3번째 줄은 8을 빼야했을까?
정답
  • gdb_1~3
    32비트에서 포인터 변수의 크기는 4바이트이기때문에
    char형 포인터 변수의 배열 하나당 크기는 4바이트씩이다.
    name의 길이가 2개이므로 4바이트 x 2 = 8바이트의 메모리를 할당한 것 !
    

1-2. movl $0x8071548, 0xfffffff8(%ebp)

어디에 무엇을 넣으려고 했을까?
정답
  • gdb_4
    epb에서 8을 뺀 곳(배열의 첫번째 요소)에 0x8071548의 값(/bin/sh)을 넣어준다.
    

1-3. movl $0x0, 0xfffffffc(%ebp)

어디에 무엇을 넣으려 했을까?
정답
  • gdb_5
  • 배열의 2번째인 name[1]에 0이란 값을 넣기 위함이다 !

1-4. 매개변수

  • gdb_argv
    위와 같이 push와 mov, lea를 한 이유가 무엇일까?
    그리고 mov와 lea의 차이는 무엇일까?
    
정답
  • gdb_argv_sol
    execve의 함수의 매개변수는 3개이다.
    const char* filename, char* const argv[], char* const envp[]
    각각의 매개변수에 대입을 하기 위한 메모리 확보를 하고자 push를 3번 하였고,
    lea를 쓴 이유는 배열의 값을 넣어주기 위해서이고,
    mov를 한 것은 name[0]의 주소 값을 위해서 쓰였다.
    그리고 매개변수는 뒤부터 들어가기때문에 먼저 NULL부터 push된 것 !
    

OS 카테고리 내 다른 글 보러가기

댓글 남기기