FILE_HEADER file_header;
DWORD NumberOfBytesRead;
ReadFile(
hFile,
&file_header,
sizeof( FILE_HEADER ),
&NumberOfBytesRead,
NULL
);
if( NumberOfBytesRead == sizeof( FILE_HEADER ) )
{
// Integer Overflow (file_header.size is DWORD)
size_t length = sizeof( FILE_HEADER ) + file_header.size;
// length is used for malloc argument
char *dst = ( char * ) malloc( length );
if( dst )
{
memcpy( dst, &file_header, sizeof( FILE_HEADER ) );
…
}
}
Trustworthy Computing
Start of trace
(start node)
Memory of 1st
argument for malloc
(memory node)
push eax is the argument
pushing instruction from
vulnerable code
(instruction node)
Execu
tio
n o
rder
Tra
cin
g b
ack
ward
fro
m t
he m
all
oc
arg
um
en
t
Memory
transfer
operations
Memory free
operations
(free)
Execu
tio
n o
rder
Tra
cin
g b
ack
ward
• We can get a very straightforward
memory trace result
Memory allocation
operations (malloc)
Memory transfer
operations
Execu
tio
n o
rder
Tra
cin
g b
ack
ward
Crash
case
Normal
case
Memory free
operations
Memory allocation
operations
Memory
transfer
operations Memory
transfer
operations
Crash case Normal case
Address ntdll!RtlpInterlockedPushEntrySL
ist+0xc
3difr!E3DLLFunc+0x7c08
Instruction mov dword ptr [ebx], eax mov dword ptr [ecx+ebx*4h], eax
(Key Instruction)
Analysis Ntdll!RtlpInterlockedPushEntrySL
ist is called from free API.
So, ebx is a part of the heap
management data structure,
which means the crash comes
from a use-after-free style
vulnerability.
[ecx+ebx*4h] is the address of an
array, the array base is ecx and ebx is
the index of the array.
Eax is coming from a malloc API.
We need to figure out why this
instruction is not hit and what is the
closest hit around this key instruction.
• The difference in the control flow is made by
the test instruction at the red block.
• Now you can trace the register eax value back
to where it comes from.
Green: Common blocks hit
Red: Key block that determines the control flow differences
Yellow: Blocks only covered with normal case
Memory content is 0x00000000
The 4 bytes data is coming from the memcpy
function.
If you track down more, you can see
that this is coming from the file contents
File Contents
Trustworthy Computing
Now we can pinpoint
the exact location of
the data that is causing
the vulnerability.
Data Flow
Analysis
Find the source of
data that is passed to
the target variable
Data Flow
Differential
Analysis
Find the first node
that is making the
difference in the flow
Control Flow
Differential
Analysis
Find the key
instruction making
the data flow
differences
Visualization