[12] 어셈블리 mkdir 구현 ( SystemCall )

2017. 10. 31. 21:15SystemHacking/Assembly



 

 

[ System Call 형식 ]

 

표를 참고해서 레지스터에 어떤 값을 넣어야 할지 확인하자     


[ mkdir C언어 표현 ]

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
31
32
int main(){
 
  char path[1024];
 
  int len=0;
 
  
 
  write( 1"path: " , 6 )                          // write( fd , 문자 , 출력할 길이 ) , fd=1 : 표준출력
 
  len = read( 0, path, 1024 ) ;                     // read( fd, 저장할 변수, 입력받을 길이 ) , fd=0 : 표준 입력
 
  path[len-1= 0                                   // 사용자로부터 문자열을 입력받는다, 마지막의 뉴라인을 제거해야한다
 
 
  ret = mkdir( path, 0755 )                          // mkdir ( 파일명, 권한 ) , 디렉터리를 생성한다. 생성성공시 0을 반환한다
 
  
 
  if( ret != 0 ){
 
    write( 1"Failed",6 );
 
  } else{
 
    write( 1"Success\n",8);
 
  }
 
  return 0;
 
}
cs

    

[ 어셈블리로 구현 ]


section .data

prompt_msg: db 'path: ',00

success_msg: db 'Success',10,00

file_msg: db 'failed',10,00

section .text

global _start

_start:

push ebp

mov ebp, esp

sub esp, 1024


mov dword [ebp-1028], 0                    ; 입력받는 파일명을 저장할 공간 ( = path변수 )

mov dword [ebp-1032], 0                    ; mkdir 성공여부를 저장 공간 ( = ret 변수 )

mov eax, 4

mov ebx, 1

mov ecx, msg

mov edx, 6d

int 80h                                            write( 1, "path: ", 6 )


mov eax, 3

mov ebx, 0

lea ecx, [ebp-1024]

mov edx, 1024

int 80h                                            read( 0 , address , 1024 )


mov [ebp-1028], eax                        ; 시스템콜 실행 후 리턴값은 eax 레지스터에 저장된다 !

mov byte [ebp-1024+eax-1], 0           ; 입력한 파일명의 마지막 뉴라인을 제거한다

mov eax, 39

lea ebx, [ebp-1024]

mov ecx, 0755o

int 80h                                                                mkdir ( 파일명 , 0755( )


mov [ebp-1032], eax                                            ; mkdir 의 리턴값을 저장한다

cmp eax,0                                                          ; 성공여부 확인

jz end ; jump zero end


mov eax,    4                                                      ; not zero , 실패

mov ebx,    1

mov ecx,    fail

mov edx,    13d

int 0x80


mov eax,    1

mov ebx,    0

int 0x80



end: ; 디렉터리 생성에 성공하면 0을 반환

mov eax,    4

mov ebx,    1

mov ecx,    success

mov edx,    11d

int 0x80

 

mov eax,    1

mov ebx,    0

int 0x80


mov eax,    1

mov ebx,    0

int 0x80



[ 결과 ]