2012-03-10 246 views
1

有人可以解释为什么我的strcat这样做?strcat溢出?

我似乎无法找出为什么我重写源字符串的一部分。

输出是这样的:新的字符串:HelloThis应是我的反斜线0后STR1H 0 STR1

global strcat 
      extern strlen 

的strcat:

push ebp 
    mov  ebp, esp 
    push ecx 
    push esi 
    push edi 
    push ebx 
    push edx 
    xor  edx, edx 
    xor  edi, edi 
    xor  ebx, ebx 
    xor  esi, esi 
    xor  ecx, ecx 
    mov  edi, [ebp + 8] 
    mov  esi, [ebp + 12] 
    push edi 
    call strlen 
    pop  edi 
    mov  ecx, eax 
    xor  eax, eax 
    push esi 
    call strlen 
    pop  esi 
    mov  ebx, eax 
    xor  eax, eax 
    cmp  [edi + ecx], byte 0b 
    je  PUT_LINE 
    jmp  FINALIZE_END 

PUT_LINE:

cmp  ebx, eax 
    je  END 
    mov  dl, [esi + eax] 
    mov  [edi + ecx], dl 
    xor  edx, edx 
    inc  eax 
    inc  ecx 
    jmp  PUT_LINE 

END:

mov  eax, [ebp + 8] 
    jmp  FINALIZE_END 

FINALIZE_END:

pop  edx 
    pop  ebx 
    pop  edi 
    pop  esi 
    pop  ecx 
    mov  esp, ebp 
    pop  ebp 
    ret 

int  main(int argc, char** argv) 
{ 
     (void)argc; 
     (void)argv; 
     char* str1; 
     char* str2; 

     str1 = strdup("Hello"); 

     str2 = strdup("This shall be after my backslash 0 in str1"); 
     printf("New String : %s\n", strcat(str1, str2)); 
     return (0); 
} 

+1

对不起,我刚刚解决了它,好像Printf也查找\ 0,但是因为我没有在目标字符串末尾设置\ 0,所以它溢出了。 END: MOV [EDI + ECX],字节0B MOV EAX,[EBP + 8] JMP FINALIZE_END – Skyline 2012-03-10 12:33:11

+0

归零寄存器加载到他们面前有点失败写汇编的目的... – 2012-03-10 12:39:05

+0

我只是想为了避免我是否使用8位或16位的问题,并且猜测它成了一个坏习惯,但是要感谢间接建议。 – Skyline 2012-03-10 12:44:13

回答

4

strcat()从一个串到另一个字符串追加字符。目标字符串被修改。所以strcat(str1, str2)修改str1也包含str2的内容。

由于没有足够的内存分配给str1以包含来自两个字符串的字符,因此会导致溢出。

+0

谢谢你,你让我意识到我只是用\ 0来解决问题。 – Skyline 2012-03-10 12:51:52

+0

是的,谢谢你。但是如何增加str1的内存呢? – anon58192932 2012-05-05 08:39:49

+0

你不能增加它。由于strcat()只会将字符串附加到另一个字符串中,因此在使用strcat()之前,您必须知道需要的空间并正确分配,以避免溢出。获取更多信息http://linux.die.net/man/3/strcat – Skyline 2012-05-12 13:41:19