В какие пункты [esp + 2Ch]?


2

Я анализирую исполняемый файл Windows (формат PE), возможно, написанный в Borland Delphi. Программа начинается со следующими инструкциями:

pusha      (1) 
    pushf      (2) 
    xor ebp, ebp 
    jmp add_eh 

add_eh: 
    mov eax, ss:off_4025E5[ebp] 
    mov dword ptr ss:(loc_402159+1)[ebp], eax 
    push offset loc_40215f    (3) 
    push dword ptr fs:0 
    mov fs:0, esp      (4) 
    mov eax, [esp+2Ch]     (5) 
    cmp [eax+IMAGE_DOS_HEADER.e_magic], 'ZM' 
    jnz short loc_40206C 

я воспроизвел на бумаге стек до инструкции, помеченной (5), кажется, что в (5) ЭСП + 2Ch указывает выше первого регистра (AX) подталкивается (1).

Где находится esp + 2Ch и что может быть его значением?

Спасибо!

2

на основе скорректированной последовательности, инструкция извлекает двойное слово перед всеми толчками

pusha pushes 8 general purpose register = 0x20 = 0x20 
pushf pushes 1 flag register    = 0x04 = 0x24 

НОП 0
MOV EAX, есть/может/может быть нежелательной в любом случае не изменяет стек
следующий Instuction также оленья кожа изменить из стека

the next 2 pushes alter the stack  = 0x08 = 0x2c 

следующая команда устанавливает обработчик SEH

так извлекает DWORD из стека до Пущи

, если это было началом вызова этого типа DWORD может быть обратным адресом на вызов, это может быть из ранее нажимной инструкции или перемещено в стек до Пущи

просто уточнить я собрал Instuction на месте где-то в OllyDbg и прослежены через него увидеть результат ниже

main ntdll.76E96F51 NOP 
main ntdll.76E96F52 NOP 
main ntdll.76E96F53 NOP 
main ntdll.76E96F54 NOP 
main ntdll.76E96F55 PUSH 0BA0000 [0020F99C]=00000000 ESP=0020F99C 
main ntdll.76E96F5A PUSHAD  ESP=0020F97C 
main ntdll.76E96F5B PUSHFD [0020F978]=76E212AD ESP=0020F978 
main ntdll.76E96F5C XOR  EBP, EBP 
main ntdll.76E96F5E MOV  EAX, DWORD PTR SS:[EBP+calc.0BA25E5] [00BA25E5]=0F087E3B EAX=0F087E3B 
main ntdll.76E96F64 MOV  DWORD PTR SS:[EBP+calc.ULongAdd], EAX [00BA215A]=0F087E3B 
main ntdll.76E96F6A PUSH 0BA215F [0020F974]=0020F9F4 ESP=0020F974 
main ntdll.76E96F6F PUSH DWORD PTR FS:[0] [7FFDF000]=0020F9A0 ESP=0020F970 
main ntdll.76E96F76 MOV  DWORD PTR FS:[0], ESP [7FFDF000]=0020F9A0 
main ntdll.76E96F7D MOV  EAX, DWORD PTR SS:[ESP+2C] [0020F99C]=00BA0000 EAX=00BA0000 
+1

Если оп не испортили некоторые инструкции (однако, кажется, что он сделал, глядя на этот странный толчок реферирования 'fs'), [esp + 2C] не находится в' fs'. Без фактического расчета смещений я бы предположил, что это восстанавливает 'eax', который раньше разгромил несколько инструкций. В подобных случаях гораздо проще одноэтапный отладчик несколько раз, чем пытаться выяснить вручную. 05 июн. 162016-06-05 23:00:46

  0

Я добавил две новые инструкции, которые могут облегчить понимание фрагмента ASM. 07 июн. 162016-06-07 08:27:24

  0

Добавлена ​​правильная последовательность инструкций, извините за ошибку. 08 июн. 162016-06-08 06:37:22

  0

@ ner0x652 отредактировал мой ответ, вам нужно знать, что было в стеке до pusha, чтобы знать, что будет в eax после всей этой инструкции 08 июн. 162016-06-08 09:45:10