Hi,
ich hab grad der Übung halber nen paar Experimente mit Überläufen gemacht. Hab mir dazu folgendes Programm gebastelt:
Nun wollte ich in Level 2 gehen und hab das ganze OHNE /GS- kompiliert. Dabei musste ich aber feststellen, dass es immernoch hervorragend funktioniert. Hab sogar explizit mit /GS kompiliert.
Das Result war immer das gleiche:
Hab auch noch nen paar Modifikationnen getestet (buf als char[];daten aus user input) und hab immernoch kein Canary gefunden. Hab danach auch mal komplexere Programme durchsucht und bin nicht fündig geworden.
Ich verwende Visual Studio 9. Meinem Halbwissen zufolge müsste der schon seit Version 8 per Default Canaries einbauen. Nur wie krieg ich den dazu?
ich hab grad der Übung halber nen paar Experimente mit Überläufen gemacht. Hab mir dazu folgendes Programm gebastelt:
Code:
#include <windows.h>
#include <string>
void function(void* src,unsigned length);
char buf[256];
const char* message = "success";
int main()
{
FARPROC retAddr;
char* writePtr = buf+4; //local var
retAddr = GetProcAddress(LoadLibraryA("User32.dll"),"MessageBoxA");
memcpy(writePtr,&retAddr,4);//funcAddr //that lands at the retAddr
writePtr+=4;
//clean return
retAddr = GetProcAddress(GetModuleHandleA("Kernel32.dll"),"ExitProcess");//clean exit
memcpy(writePtr,&retAddr,4);//retaddr 2
writePtr+=4;
memset(writePtr,0,4);//hwnd
writePtr+=4;
memcpy(writePtr,&message,4);//text
writePtr += 4;
memset(writePtr,0,8);//dmy params
writePtr+=8;
memset(writePtr,0,8);//4bytes allign + exit code
writePtr+=8;
function(buf,writePtr-buf);
MessageBoxA(0,"usual behavior",0,0);
return 0;
}
_declspec(noinline) void function(void* src,unsigned length)//4 bytes local vars
{
void* buf;
_asm mov buf,esp
memcpy(buf,src,length);
}
Nun wollte ich in Level 2 gehen und hab das ganze OHNE /GS- kompiliert. Dabei musste ich aber feststellen, dass es immernoch hervorragend funktioniert. Hab sogar explizit mit /GS kompiliert.
Das Result war immer das gleiche:
Code:
00401090 51 push ecx
00401091 89 24 24 mov dword ptr [esp],esp
00401094 8B 14 24 mov edx,dword ptr [esp]
00401097 50 push eax
00401098 51 push ecx
00401099 52 push edx
0040109A E8 05 08 00 00 call memcpy (4018A4h)
0040109F 83 C4 10 add esp,10h
004010A2 C3 ret
Hab auch noch nen paar Modifikationnen getestet (buf als char[];daten aus user input) und hab immernoch kein Canary gefunden. Hab danach auch mal komplexere Programme durchsucht und bin nicht fündig geworden.
Ich verwende Visual Studio 9. Meinem Halbwissen zufolge müsste der schon seit Version 8 per Default Canaries einbauen. Nur wie krieg ich den dazu?