IDA declares local variables as var_XXX at the start of function
In the paste below var_108 is declared as dword ptr -108h
So 0x10c - 108 = 4
If You hit K
ida would show you
.text:0040115C lea eax, [esp+4]
If I find it confusing and prefer [esp+4] to [esp + x + (-y) ] I use the script in my answer to this question
https://stackoverflow.com/questions/23199403/differences-in-ollydbg-and-ida-pro-for-movsx-edx-byte-ptr-especx8-command/23604013#23604013
.text:00401150 sub_401150 proc near ; CODE XREF: sub_4011BC+53p
.text:00401150
.text:00401150 var_108 = dword ptr -108h
.text:00401150 arg_0 = dword ptr 8
.text:00401150
.text:00401150 push ebx
.text:00401151 add esp, 0FFFFFEF8h
.text:00401157 push 105h
.text:0040115C lea eax, [esp+10Ch+var_108]
As RedLexus commented there is a reason why the local vars are negative
when you push arguments and call a function the stack layout will be like this
esp+0x00 -> return addrss
esp+0x04 _. arguments that were pushed follows from here
every thing that are negative like
esp-0x4 upto stack top address viz esp - 0xxxx
are utilizable by the function to store temporary variables that are specific only in the scope of function
that is if you have a function
rettype calling convention somefunction (args 1.2,....,n)
{
local vars
char foo[0x100]
ulong blah
int bar;
function body follows
}
the compiler/assembler would theoretically provide space for int bar at esp -0x108