2012-03-10 3 views
1

누군가 내 strcat이 이것을하는 이유를 설명 할 수 있습니까?strcat overflow?

소스 문자열의 일부분을 왜 다시 쓰는지 알 수없는 것 같습니다.

결과는 다음과 같다 : 새로운 문자열 : HelloThis은 str1과에 str1h 0 내 백 슬래시 0 후에해야한다

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 

종료 :

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] 좀 ASM를 작성하는 목적을 패배 당신이 그들에로드하기 전에 등록을 비우기 JMP의 FINALIZE_END – Skyline

+0

이 ... –

+0

난 그냥하려고했다 8 비트 또는 16 비트를 사용했는지 여부에 관계없이 문제가 발생하지 않도록하고, 나쁜 습관이되어 버렸다고 생각하지만 간접적 인 조언에 감사드립니다. – Skyline

답변

4

strcat()는 다른 문자열을 하나의 문자열에서 문자를 추가합니다. 대상 문자열이 수정됩니다. 그래서 strcat(str1, str2)은 의 내용도 포함하도록 str1을 수정합니다.

str1에 두 문자열의 문자가 포함될만큼 메모리가 충분하지 않으므로 오버플로가 발생합니다.

+0

그 점에 감사드립니다. 당신은 내가 \ 0으로 간단하게 문제를 향한 것임을 깨달았습니다. – Skyline

+0

네, 고맙습니다. 하지만 어떻게 str1에 대한 메모리를 증가합니까? – anon58192932

+0

늘리지 마십시오. strcat()은 한 문자열에서 다른 문자열로 문자를 추가하기 때문에 할 수있는 일은 strcat()을 사용하기 전에 필요한 공간을 알아야하고 넘치지 않도록 적절하게 할당해야합니다. 자세한 정보는 http://linux.die.net/man/3/strcat을 참조하십시오. – Skyline