누군가 내 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);
}
~
죄송합니다. Printf가 \ 0도 찾은 것처럼 보이지만 대상 문자열의 끝에 \ 0을 설정하지 않았으므로 오버플로됩니다. END : MOV [EDI + ECX, 바이트 0B mov 인 EAX, [EBP가 + 8] 좀 ASM를 작성하는 목적을 패배 당신이 그들에로드하기 전에 등록을 비우기 JMP의 FINALIZE_END – Skyline
이 ... –
난 그냥하려고했다 8 비트 또는 16 비트를 사용했는지 여부에 관계없이 문제가 발생하지 않도록하고, 나쁜 습관이되어 버렸다고 생각하지만 간접적 인 조언에 감사드립니다. – Skyline