2012-03-10 5 views
1

誰かが私のstrcatがこれをやっている理由を説明できますか?strcatオーバーフロー?

なぜソース文字列の一部に書き直しているのかわかりません。

出力はこのようなものです:新しい文字列: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 

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

+0

あなたがそれらにロードする前に、レジスタをゼロにはちょっとASMを書くの目的に反し... –

+0

私はちょうどしようとしていました私が8ビットか16ビットを使用するかどうかにかかわらず、それが悪い習慣になってしまったかどうかにかかわらず、間接的アドバイスに感謝します。 – Skyline

答えて

4

strcat()は、別の文字列に1つの文字列から文字を追加します。ターゲット文字列が変更されます。したがってstrcat(str1, str2)は、の内容も含むようにstr1を変更します。

str1に両方の文字列の文字を格納するのに十分なメモリが割り当てられていないため、オーバーフローが発生します。

+0

ありがとうございます、あなたは私が\ 0で問題を覚えていたことに気づきました。 – Skyline

+0

ありがとうございます。しかし、どのようにしてstr1のメモリを増やしますか? – anon58192932

+0

あなたはそれを増やしてはいけません。 strcat()はある文字列から別の文字列に文字を追加するだけなので、できることはstrcat()を使用する前に必要なスペースを認識し、オーバーフローを避けるために適切に割り当てる必要があります。詳細はhttp://linux.die.net/man/3/strcatを参照してください。 – Skyline