2014-03-14 2 views
0

어셈블리에서 strcpy 함수를 작성한 다음 Firefox, emacs와 같은 여러 프로그램을 시작하려고했습니다 ... 하지만 사본에 문제가있어 어디에서 문제가 있습니다.NASM에서 strcpy를 실행하여 파이어 폭스를 시작합니다.

어셈블리 코드 :

: 난 내 공유 라이브러리와 파이어 폭스를 시작하려고 할 때

s1 = hello 
s2 before copy = 
s2 after copy = hello 

결과 : 난 내 공유 라이브러리와 작은 프로그램을 실행하려고

global strcpy 

section .text 

strcpy: 
    push rbp 
    push rdx 
    mov rbp, rsp 
    mov rdx, 0 
strcpy_loop: 
    cmp byte [rsi + rdx], 0 
    je strcpy_end 
    mov al, byte [rsi + rdx] 
    mov byte [rdi + rdx], al 
    inc rdx 
    jmp strcpy_loop 
strcpy_end: 
    mov rax, rdi 
    mov rsp, rbp 
    pop rdx 
    pop rbp 
    ret 

결과

/usr/bin/firefox: line 52: $'basenamex\326g\002Lame $0`': command not found 
/usr/bin/firefox: line 57: bad substitution: no closing "`" in `x�gL 
/usr/bin/firefox: line 63: $'[\340\n\002': command not found 
/usr/bin/firefox: line 73: fileL: command not found 
/usr/bin/firefox: line 75: echoL: command not found 
grep: invalid option -- 'g' 
Usage: grep [OPTION]... PATTERN [FILE]... 
Try 'grep --help' for more information. 
/usr/bin/firefox: line 78: $'[\351\n\002L': command not found 
/usr/bin/firefox: line 83: export: `MOZILLA_FIVE_HOME�gL': not a valid identifier 
/usr/bin/firefox: line 91: $'[\257\n\002': command not found 
/usr/bin/firefox: line 95: /dev/null�gL: Permission denied 
/usr/bin/firefox: line 97: $'[\t\v\002': command not found 
/usr/bin/firefox: line 108: $'[\006\v\002': command not found 
/usr/bin/firefox: line 131: $'[\023\v\002': command not found 
/usr/bin/firefox: line 138: exec: =0 
           : not found 

작은 프로그램이 작동하지만 파이어 폭스는 작동하지 않습니다.

+2

: 널 종료 바이트를 포함 _는 "strcpy를() 함수를 복사 문자열 SRC가 가리키는 ** ** ('\ 0')에 버퍼는 dest가 가리키고 있습니다. "_ – Michael

+0

감사합니다. 문제가 해결되었습니다. –

답변

0

실제로 문자열 종료자인 \0을 문자열 끝 부분에 복사하지 않습니다. 즉, 대상 문자열이없이 문자열이 남아 있음을 의미합니다.

char buff[] = "Hello there"; 
strcpy (buff, "Bye");   // your strcpy, not a 'real' one. 

다음이 될 겁니다 : 즉, 당신이 뭔가를 할 경우

당신이 원하는 것을하지
Byelo there 

. 이 문제를 해결하기 위해, 당신은 같은 것을 함께 할 수 있습니다 또는

strcpy_end: 
    xor al, al     ; force al to `\0`. 
    mov byte [rdi + rdx], al ; and store it. 

    mov rax, rdi    ; rest of original 
    mov rsp, rbp    ; code here ... 
    pop rdx 
    pop rbp 
    ret 

, 당신은 그것을 오히려 do-X-while-condition하고,있는 그대로 마무리 코드를 떠나 메인 루프로 최종 전송을 통합 할 수 while-condition-do-X (A)보다 다음`strcpy` 문서에서

strcpy_loop: 
    mov al, byte [rsi + rdx] 
    mov byte [rdi + rdx], al 
    inc rdx 
    cmp al, 0 
    jne strcpy_loop 

    mov rax, rdi    ; rest of original 
    mov rsp, rbp    ; code here ... 
    pop rdx 
    pop rbp 
    ret