誰かが私の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);
}
〜
申し訳ありませんが、私はそれを解決しました.Printfも\ 0を探すようですが、宛先文字列の最後に\ 0を設定しなかったため、オーバーフローしました。 END: MOV [EDI + ECX]、バイト0B のMOV EAX、[EBP + 8] JMP FINALIZE_END – Skyline
あなたがそれらにロードする前に、レジスタをゼロにはちょっとASMを書くの目的に反し... –
私はちょうどしようとしていました私が8ビットか16ビットを使用するかどうかにかかわらず、それが悪い習慣になってしまったかどうかにかかわらず、間接的アドバイスに感謝します。 – Skyline