首页
社区
课程
招聘
[旧帖] [求助](问题已经解决)PE文件头(顺便申请邀请码)(邀请码已经发放) 0.00雪花
发表于: 2009-12-28 23:06 1342

[旧帖] [求助](问题已经解决)PE文件头(顺便申请邀请码)(邀请码已经发放) 0.00雪花

2009-12-28 23:06
1342
最近看了一下论坛上关于PE文件头的描述也跟着写了一个BIN文件,可是不知道为什么一运行就出异常,想了很久不明白,求高手指教!
;DOS文件头
DOS_Header:
.e_magic dw 'MZ';DOS头标志
.e_dblp dw 0
.e_cp dw 0
.e_crlc dw 0
.e_cparhdr dw 0
.e_minalloc dw 0
.e_maxalloc dw 0xffff
.e_ss dw 0
.e_sp dw 0
.e_csum dw 0
.e_ip dw 0
.e_cs dw 0
.e_lfarlc dw 0
.e_ovno dw 0
.e_res dw 0,0,0,0
.e_oemid dw 0
.e_oeminfo dw 0
.e_res2 dw 0,0,0,0,0,0,0,0,0,0
.e_lfanew dd PE_Header
PE_Header:
.Signature db 'PE',0,0
.machine dw 0x014c
.numberofsections dw 0x0001
.timedatestamp dd 0
.pointertosymboltable dd 0
.numberofsymbols dd 0
.sizeofoptionalheader dw 0x00e0
.characteristics dw 0x010f
Optional_Header:
.Magic dw 0x010b
.MajorLinkerVersion db 0
.MinorLinkerVersion db 0
.SizeOfCode dd 0
.SizeOfInitializedData dd 0
.SizeOfUninitialzedData dd 0
.AddressOfEntryPoint dd code+0xe00
.BaseOfCode dd 0x1000
.BaseofData dd 0x200
.ImageBase dd 0x00040000
.SectionAlignment dd 0x00001000
.FileAlignment dd 0x00000200
.MajorOperatingSystemVersion dw 0
.MinorOperatingSystemVersion dw 0
.MajorImageVersion dw 0
.MinorImageVersion dw 0
.MajorSubsystemVersion dw 4
.MinorSubsystemVersion dw 0
.Win32VersionValue dd 0
.SizeOfImage dd 0x00002000
.SizeOfHeaders dd start
.CheckSum dd 0
.Subsystem dw 2
.DllCharacteristics dw 0
.SizeOfStackReserve dd 0x10000
.SizeOfStackCommit dd 0x100
.SizeOfHeapReserve dd 0x10000
.SizeOfHeapCommnit dd 0x100
.Loaderflags dd 0
.NumberOfRvaAndSizes dd 0x10
;下面就是16个表的偏移和大小,因为我基本没有用到表所以都写为0了
dd 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
sections:
.SectionName db '.text',0,0,0
.VirtualSize dd 0x1000
.VirtualAddress dd 0x1000
.SizeOfRawData dd end-start
.PointerToRawData dd start
.PointerToRelocations dd 0
.PointerToLinenumbers dd 0
.NumberOfRelocations dw 0
.NumberOfLinenumbers dw 0
.Characteristics dd 0xe00000e0;表示段中有可执行属性,可读属性,可写属性,有代码,有初始化数据,有未初始化数据
align 0x200,db 0
start:
kernel32_Address resd 1
user32_Address resd 1
GetProcAddress_Address resd 1
ExitProcess_Address resd 1
MessageBoxA_Address resd 1
LoadLibraryA_Address resd 1
Title db 'Hello',0
Content db 'Hello World!',0
GetProcAddress db 'GetProcAddress',0
ExitProcess db 'ExitProcess',0
LoadLibraryA db 'LoadLibraryA',0
user32 db 'user32.dll',0
MessageBoxA db 'MessageBoxA',0
code:
mov eax,[fs:0x30]
mov eax,[eax+0xc]
mov eax,[eax+0x1c]
mov eax,[eax]
mov eax,[eax+0x8];eax里面是kernel32的基地址
mov [kernel32_Address],eax
mov ebx,[eax+0x3c];ebx中是PE头的相对地址
mov ebx,[ebx+eax+0x78]
add ebx,eax;引出表地址
mov ecx,[ebx+0x20]
add ecx,eax
xor edx,edx
push edx
CompareNext:
pop edx
inc edx
mov edi,[ecx]
add edi,eax
add ecx,4
push edx
mov esi,GetProcAddress
CompareName:
mov dl,[edi]
mov dh,[esi]
cmp dl,dh
jne CompareNext
inc edi
inc esi
cmp byte [esi],0
je GetAddress
jmp CompareName
GetAddress:
pop edx
dec edx
shl edx,1
mov ecx,[ebx+0x24]
add ecx,eax
add ecx,edx
xor edx,edx
mov dx,[ecx]
shl edx,2
mov ecx,[ebx+0x1c]
add ecx,eax
add ecx,edx
add eax,[ecx];eax里面就是getprocaddress
mov [GetProcAddress_Address],eax
push ExitProcess
push dword [kernel32_Address]
call eax
mov [ExitProcess_Address],eax
push LoadLibraryA
push dword [kernel32_Address]
call dword [GetProcAddress_Address]
mov [LoadLibraryA_Address],eax
push user32
call eax
mov [user32_Address],eax
push MessageBoxA
push eax
call dword [GetProcAddress_Address]
mov [MessageBoxA_Address],eax
push 0
push Title
push Content
push 0
call eax
push 0
call dword [ExitProcess_Address]
end:
备注除了文件头部分,在把.text节属性改为0e00000e后代码运行正常,应该可以说明代码本身不存在问题,问题出在PE文件头里所以想请高手给指正

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 32
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
为什么没有人理呢?
2009-12-29 09:25
0
雪    币: 47
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
这个很基础的。
2009-12-29 09:51
0
雪    币: 72
活跃值: (52)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
学习中。。。。
2009-12-29 11:56
0
雪    币: 15
活跃值: (48)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
给点图形化的资料,这样一堆代码贴上来,连注释都没有,让我等怎么看啊?
2009-12-29 13:28
0
雪    币: 175
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
图形化得一招一大把
2010-1-2 19:51
0
雪    币: 32
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我觉得图形化的东西没有必要粘上来了吧,因为如果只是看图形化的东西没有用的,我里面用的label都是和图形文件中的基本一致的,所以我认为如果有兴趣的话大家可以网上搜一下!如果哪里还是不太明白可以跟帖讨论!
我把问题已经解决了,主要是在内存寻址上。
[BITS 32]
Dos_Header:
.e_magic dw 'MZ'
.e_cblp dw 0
.e_cp dw 0
.e_crlc dw 0
.e_cparhdr dw 0
.e_minalloc dw 0
.e_maxalloc dw 0
.e_ss dw 0
.e_sp dw 0
.e_csum dw 0
.e_ip dw 0
.e_cs dw 0
.e_lfarlc dw 0
.e_ovno dw 0
.e_res dw 0,0,0,0
.e_oemid dw 0
.e_oeminfo dw 0
.e_res2 dw 0,0,0,0,0,0,0,0,0,0
.e_lfanew dd PE_Header
PE_Header:
.Signature dd 'PE'
FileHeader:
.Machine dw 0x14c
.NumberOfSection dw 1
.TimeDataStamp dd 0
.PointerToSymbolTable dd 0
.NumberOfSymbols dd 0
.SizeOfOptionalHeader dw 0xe0
.Characteristics dw 0x10f
.Magic dw 0x10b
.MajorLinkerVersion db 0
.MinorLinkerVersion db 0
.SizeOfCode dd 0
.SizeOfInitializedData dd 0
.SizeOfUninitializedData dd 0
.AddressOfEntryPoint dd 0x1000-0x200+code
.BaseOfCode dd 0
.BaseOfData dd 0
.ImageBase dd 0x400000
.SectionAlignment dd 0x1000
.FileAlignment dd 0x200
.MajorOperatingSystemVersion dw 0
.MinorOperatingSystemVersion dw 0
.MajorImageVersion dw 0
.MinorImageVersion dw 0
.MajorSubsystemVersion dw 4
.MinorSubsystemVersion dw 0
.Win32VersionValue dd 0
.SizeOfImage dd 0x2000
.SizeOfHeaders dd start
.CheckSum dd 0
.Subsystem dw 2
.DllCharacteristics dw 0
.SizeOfStackReserve dd 0x100000
.SizeOfStackCommit dd 0x1000
.SizeOfHeapReserve dd 0x100000
.SizeOfHeapCommit dd 0x1000
.LoaderFlags dd 0
.NumberOfRvaAndSizes dd 0x10

Export:
.VirtualAddress dd 0
.isize dd 0
Import:
.VirtualAddress dd 0
.isize dd 0
Resource:
.VirtualAddress dd 0
.isize dd 0
Exception:
.VirtualAddress dd 0
.isize dd 0
Security:
.VirtualAddress dd 0
.isize dd 0
BaseReloc:
.VirtualAddress dd 0
.isize dd 0
Debug:
.VirtualAddress dd 0
.isize dd 0
Architecture:
.VirtualAddress dd 0
.isize dd 0
GlobalPtr:
.VirtualAddress dd 0
.isize dd 0
Tls:
.VirtualAddress dd 0
.isize dd 0
Load_Config:
.VirtualAddress dd 0
.isize dd 0
Bound_Import:
.VirtualAddress dd 0
.isize dd 0
Iat:
.VirtualAddress dd 0
.isize dd 0
Delay_Import:
.VirtualAddress dd 0
.isize dd 0
Com_Descriptor:
.VirtualAddress dd 0
.isize dd 0
No_Use:
.VirtualAddress dd 0
.isize dd 0
sections:
.SectionName db '大屌男人'
.VirtualSize dd 0x1000
.VirtualAddress dd 0x1000
.SizeOfRawData dd 0x200
.PointerToRawData dd 0x200
.PointerToRelocations dd 0
.PointerToLineNumbers dd 0
.NumberOfRelocations dw 0
.NumberOfLineNumbers dw 0
.Characteristics dd 0xe00000e0
align 0x200,db 0

start:

kernel32_Address resd 1;0x401000
user32_Address resd 1;0x401004
GetProcAddress_Address resd 1;0x401008
ExitProcess_Address resd 1;0x40100c
MessageBoxA_Address resd 1;0x401010
LoadLibraryA_Address resd 1;0x401014

Title db 'Hello',0;0x401018
Content db 'Hello World!',0;0x40101e
GetProcAddress db 'GetProcAddress',0;0x40102b
ExitProcess db 'ExitProcess',0;0x40103a
LoadLibraryA db 'LoadLibraryA',0;0x401046
user32 db 'user32.dll',0;0x401053
MessageBoxA db 'MessageBoxA',0;0x40105e

code:
mov eax,[fs:0x30]
mov eax,[eax+0xc]
mov eax,[eax+0x1c]
mov eax,[eax]
mov eax,[eax+0x8];eax里面是kernel32的基地址
mov [0x401000],eax
mov ebx,[eax+0x3c];ebx中是PE头的相对地址
mov ebx,[ebx+eax+0x78]
add ebx,eax;引出表地址
mov ecx,[ebx+0x20]
add ecx,eax
xor edx,edx
push edx
CompareNext:
pop edx
inc edx
mov edi,[ecx]
add edi,eax
add ecx,4
push edx
mov esi,0x40102b
CompareName:
mov dl,[edi]
mov dh,[esi]
cmp dl,dh
jne CompareNext
inc edi
inc esi
cmp byte [esi],0
je GetAddress
jmp CompareName
GetAddress:
pop edx
dec edx
shl edx,1
mov ecx,[ebx+0x24]
add ecx,eax
add ecx,edx
xor edx,edx
mov dx,[ecx]
shl edx,2
mov ecx,[ebx+0x1c]
add ecx,eax
add ecx,edx
add eax,[ecx];eax里面就是getprocaddress
mov [0x401008],eax
push 0x40103a
push dword [0x401000]
call eax
mov [0x40100c],eax
push 0x401046
push dword [0x401000]
call dword [0x401008]
mov [0x401014],eax
push 0x401053
call eax
mov [0x401004],eax
push 0x40105e
push eax
call dword [0x401008]
mov [0x401010],eax
push 0
push 0x401018
push 0x40101e
push 0
call eax
push 0
call dword [0x40100c]

align 0x200,db 0

end:
2010-1-3 15:23
0
雪    币: 32
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
谢谢,风之子和anskya的帮助!谢谢!
编译请用nasm -f bin *.asm -o *.exe
可以运行成功
2010-1-3 15:25
0
雪    币: 40
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
我复制下来回去看
2010-1-3 20:54
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
10
不会吧. 你转正了?
2010-1-3 21:25
0
雪    币: 2362
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
好ID!!!
2010-1-3 23:21
0
游客
登录 | 注册 方可回帖
返回
//