ShellStart0 LABEL DWORD
pushad ; 外壳入口点
call next0
;**********************************************************
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
; 以下是自构造的外壳的输入表
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ImportTableBegin LABEL DWORD
ImportTable DD AddressFirst-ImportTable ;OriginalFirstThunk
DD 0,0 ;TimeDataStamp,ForwardChain
AppImpRVA1 DD DllName-ImportTable ;Name
AppImpRVA2 DD AddressFirst-ImportTable ;FirstThunk
DD 0,0,0,0,0
AddressFirst DD FirstFunc-ImportTable ;指向IMAGE_tHUNK_DATA
AddressSecond DD SecondFunc-ImportTable ;指向IMAGE_tHUNK_DATA
AddressThird DD ThirdFunc-ImportTable ;指向IMAGE_tHUNK_DATA
DD 0
DllName DB 'KERNEL32.dll'
DW 0
FirstFunc DW 0
DB 'GetProcAddress',0
SecondFunc DW 0
DB 'GetModuleHandleA',0
ThirdFunc DW 0
DB 'LoadLibraryA',0
ImportTableEnd LABEL DWORD
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
; 以下是自构造的假重定位表(处理DLL时用)
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
RelocBaseBegin LABEL DWORD
RelocBase DD 0
DD 08h
DD 0
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
; 以下是需要由加壳程序修正的变量
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
SHELL_DATA_0 LABEL DWORD
ShellBase DD 0
ShellPackSize DD 0
TlsTable DB 18h dup (?)
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
; 外壳引导段使用的变量空间
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Virtualalloc DB 'VirtualAlloc',0
VirtualallocADDR DD 0
imagebase DD 0
ShellStep DD 0
ShellBase2 DD 0
;**********************************************************
next0:
pop ebp
sub ebp,(ImportTable-ShellStart0)
执行到pop ebp;时ebp里就有pop ebp这条指令的VA地址,下面这句sub ebp,(ImportTable-ShellStart0);求外壳入口点地址,为什么不是sub ebp,(next0-ShellStart0);呢?
[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界