2017. 10. 31. 21:15ㆍSystemHacking/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 |
[ 결과 ]
'SystemHacking > Assembly' 카테고리의 다른 글
[15] gdb 디스어셈블러 사용법,예제 ( C와 어셈블리 ) (0) | 2017.11.03 |
---|---|
[13] 어셈블리 cat구현 ( SystemCall ) (0) | 2017.11.01 |
[11] 어셈블리 argc, argv 이해하기 (0) | 2017.10.30 |
[10] 어셈블리 스택메모리를 이용한 변수 저장 및 사용 (0) | 2017.10.27 |
[9] 어셈블리 스택 메모리를 이용한 간단한 덧셈 ( leave, ret, call ) (0) | 2017.10.27 |