Es wäre interessant, welcher Compiler eingesetzt wird (samt Optionen) 
CL 16.00.xx (VS 10) generiert bei mir per Default einen Stack-Cookie:
MS VC:
Code:
CPU Disasm
Address Hex dump Command Comments
01271013 |. 68 40812701 PUSH OFFSET 01278140 ; ASCII "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
01271018 |. 8D85 30FFFFFF LEA EAX, [EBP-0D0]
0127101E |. 50 PUSH EAX
0127101F |. E8 EC000000 CALL 01271110
01271024 |. 83C4 08 ADD ESP, 8
01271027 |. 8D8D 30FFFFFF LEA ECX, [EBP-0D0]
0127102D |. 51 PUSH ECX
0127102E |. 68 EC822701 PUSH OFFSET 012782EC ; ASCII "Buffer: %s"
01271033 |. E8 13000000 CALL 0127104B
01271038 |. 83C4 08 ADD ESP, 8
0127103B |. 33C0 XOR EAX, EAX
0127103D |. 8B4D FC MOV ECX, DWORD PTR SS:[EBP-4]
01271040 |. 33CD XOR ECX, EBP
01271042 |. E8 C1010000 CALL 01271208 ; Stackcheck
...
Stackcheck:
01271208 /$ 3B0D 00B02701 CMP ECX, DWORD PTR DS:[127B000]
0127120E |.- 75 02 JNE SHORT 01271212 <-- patcht man diesen JMP, wird der EIP überschrieben
01271210 \. F3:C3 REP RETN
der GCC 4.5.2 generiert folgenden Code:
Code:
CPU Disasm
Address Hex dump Command Comments
004013D1 |. C74424 08 AC0 MOV DWORD PTR SS:[LOCAL.54], 1AC ; /count => 428.
004013D9 |. C74424 04 643 MOV DWORD PTR SS:[LOCAL.55], OFFSET 0040 ; |src => a.403064 -> 'A'
004013E1 |. 8D4424 18 LEA EAX, [LOCAL.50] ; |
004013E5 |. 890424 MOV DWORD PTR SS:[LOCAL.56], EAX ; |dest => OFFSET LOCAL.50
004013E8 |. E8 B3080000 CALL <JMP.&msvcrt.memcpy> ; \MSVCRT.memcpy
004013ED |. 8D4424 18 LEA EAX, [LOCAL.50]
hier gibt es schon den Fehler beim memcpy, da die "Stackspitze" zu wenig Platz bietet. Setzt man statt 428 255 ein, klappt es (sofern GCC nicht per Default -fstack-protector nutzt, dann gibt es einen ähnlichen Check, wie im VC compilat)
PS: ASLR/DEP "greifen" erst bei dann ein, wenn man versucht den Code auszuführen.