搜索API函数地址
编写shellcode时,一般需使用一些API函数,例如CreateProcess(),socket()等,这些函数的入口地址位于系统的动态链接库中,由于不同操作系统的动态链接库的加载地址不同,shellcode中需增加API函数自搜索功能。
shellcode
shellcode是一段用于利用软件漏洞而执行的代码,shellcode为16进制的机器码,因为经常让攻击者获得shell而得名。shellcode常常使用机器语言编写。 可在暂存器eip溢出后,塞入一段可让CPU执行的shellcode机器码,让电脑可以执行攻击者的任意指令。
获取步骤
- 定位kernel32.dll地址1) 通过段选择字FS在内存中找到当前的线程控制模块TEB
2) 线程控制块中偏移位置为0x30的地方存放着指向进程控制块PEB的指针3) 进程控制块中偏移地址0x0c的地址存放着指向PEB_LDA_DATA结构体的指针,其中存放着已经被装载的动态链接库信息。4) PEB_LDA_DATA结构体偏移地址为0x1c的地方存放着指向模块初始化链表的头指针InInitializationOrderModulelist。5) 模块初始化链表InInitializationOrderModulelist中按顺序存放着PE装入运行时初始化模块信息,第一个链表节点是ntdll.dll,第二个链表节点就是kernel32.dll。6) 找到属于kernel32.dll的节点后,在此基础上再便宜0x08就是kernel32.dll在内存中的价值基地址。 - 定位LoadLibrary()及GetProcAddress()地址
1) 从kernel32.dll的加载基地址开始偏移0x3c的地方就是其PE头2) PE头偏移0x78的地方存放着指向函数导出表的指针。3) 按以下方式在导出表中算出所需函数的入口地址(1)导出表偏移0x1c处的指针指向存储导出函数偏移地址(RVA)的列表(2)导出表偏移0x20处的指针指向存储导出函数函数名的列表(3)函数的RVA地址和名称按顺序放在RVA列表及函数名列表中,根据函数名在函数名称列表中搜索函数序号,再根据函数序号在RVA列表中搜索函数对应的RVA
(4)函数对应的RVA加上动态链接库的加载地址得到该函数的虚拟地址。
汇编代码
.386 |