Not really sure why this is a useful exercise, any application that actually does anything useful is going to load at least a couple of Windows .DLLs and that will probably increase the memory usage quite a bit.
108kb does not tell us much when you don't say which application you measured it with.
The memory footprint also depends on the Windows version. On Windows 7 and later there are 3 core .DLLs; ntdll, kernelbase and kernel32 while previous versions only have ntdll and kernel32. If you are running a 32-bit app on 64-bit Windows you also get wow64, wow64cpu and wow64win loaded in your process. On every version except Windows 2000 the loader will load kernel32 and its dependencies automatically for you. There is some unavoidable overhead for each .DLL. There is a linked list of loaded .DLLs stored in the PEB and the loader will probably modify the import table in each .DLL (unless this is a fresh never updated Windows install) even if all other pages can be shared with other processes.
In theory the only thing you really have control over in a "do nothing" .EXE is the SizeOfStackCommit
and SizeOfHeapCommit
members of the optional header but the default for the stack is usually just one page and these values are rounded up so setting them lower will not gain you anything. You cannot control the size of the PEB and TEB(s) and I don't think you can avoid creating the default process heap.
Most people tend to focus on smaller file size, not memory footprint. The smallest usable PE EXE file you can create is 133 bytes on 32-bit Windows. If you don't import anything you can get it down to 97 bytes but then it will not run on Windows 2000 because it assumes that you import something from kernel32. These files are hacks and place the PE header on top of the DOS header etc.
If you goal is simply to get under 108kb then I would try the 97 byte EXE file on Windows 95 or perhaps NT 4. On Windows 95 all the major system .DLLs are shared by all processes.