首页
社区
课程
招聘
[旧帖] [求助]获取LoadLibrary()地址的和其他的一些小问题 0.00雪花
发表于: 2009-6-16 01:52 4216

[旧帖] [求助]获取LoadLibrary()地址的和其他的一些小问题 0.00雪花

2009-6-16 01:52
4216
下面是一个简单的Shellcode
/******windows通过动态连接库来提供系统函数,就是调用dll
******开启一个command窗口******
*******************************************/

#include <windows.h>
int main()
{
LoadLibrary("msvcrt.dll");//装载msvcrt.dll,
system("command.com");//调用系统命令
return 0;
}

////////////////////////////////////////////
///////得到system()的地址
//系统的版本不一样,函数的地址就不一样.我的系统是03 server sp2

#include <stdio.h>
#include <windows.h>
int main
{
HMODULE hModule =LoadLibrary("msvcrt.dll");//加载动态连接库msvcrt.dll的句柄给hModule
FARPROC pAdd =GetProcAddress(hModule,"system");//system()地址
printf("0x%x\n",pAdd);
return 0;
}

运行之后输出system()地址为:0x77b8a083
注:系统不一样得出的system()函数地址也不一样
顺给出2000 sp4的system()地址:0x78018ebf
将上面的代码 system("command.exe");转换成汇编语言如下

#include <windows.h>
void main()

{
        LoadLibrary("msvcrt.dll");
        _asm
        {
                mov esp,ebp                ;把ebp的内容送到esp中
                push ebp                ;保存ebp,esp-4
                mov ebp,esp                ;给ebp负值,将作为局部变量的基指针
                xor edi,edi                ;
                push edi                ;压入0,esp-4,作用是构造字符串的结尾\0
                sub esp,08h                ;加上上面的4字节总共有12字节"command.com",这里为什么分配了12个字节,但是command.exe只有11个字节啊,难道还有一个结束符标志- -?
                mov byte ptr [ebp-0ch],63h;
                mov byte ptr [ebp-0bh],6fh;
                mov byte ptr [ebp-0ah],6dh;
                mov byte ptr [ebp-09h],6Dh;
                mov byte ptr [ebp-08h],61h;
                mov byte ptr [ebp-07h],6eh;
                mov byte ptr [ebp-06h],64h;
                mov byte ptr [ebp-05h],2Eh;
                mov byte ptr [ebp-04h],63h;
                mov byte ptr [ebp-03h],6fh;
                mov byte ptr [ebp-02h],6dh;生成串"command.exe"
                lea eax,[ebp-0ch];
                push eax                ;串地址作为参数入栈
                mov eax,0x77b8a083
                call eax                ;调用 system()

                add esp,0x11        ;堆栈平衡,
                pop ebp;

        }
}
如上的代码有一点要注意一下,push eax占4个字节,_asm{}内的前六行根据注释提示分配了12个字节,还有一个地方要注意就是这里“mov byte ptr [ebp-0ch],63h;”当“sub esp,08h”之后,共分配了12个字节,地址空间应该为0-11,就是0x0h-0xbh而下一句“mov byte ptr [ebp-0ch],63h;”是从0ch开始的,所以这里又多了一个字节的空间,那么倒数第二行add exp 0x11正好是17个字节。
至于如果改成“mov byte ptr [ebp-0bh],63h;”然后依次往下推一位,最后add esp,0x10,根据伙夫的说法应该是正确的,但是为什么不行呢?我不明白哈,谁能帮我解释下呢:) 恩,其实我有很多不明白的 :(

还有如果将上面的全部改成汇编的形式,针对LoadLibrary();利用第二段代码如何取得LoadLibrary()在我的系统中的地址呢?

如果知道了 LoadLibrary("msvcrt.dll")的地址,那么对应的汇编代码是否如下
伪代码
_asm
{
mov esp,ebp                ;把ebp的内容送到esp中
                push ebp                ;保存ebp,esp-4
                mov ebp,esp                ;给ebp负值,将作为局部变量的基指针
                xor edi,edi                ;
                push edi                ;压入0,esp-4,作用是构造字符串的结尾\0
                sub esp,07h                ;加上上面的4字节总共有11字节"msvcrt.dll"(这段代码对吗 - -)
                mov byte ptr [ebp-0bh],6Dh;
                mov byte ptr [ebp-0ah],73h;
                mov byte ptr [ebp-09h],76h;
                mov byte ptr [ebp-08h],63h;
                mov byte ptr [ebp-07h],72h;
                mov byte ptr [ebp-06h],74h;
                mov byte ptr [ebp-05h],2Eh;
                mov byte ptr [ebp-04h],64h;
                mov byte ptr [ebp-03h],6Ch;
                mov byte ptr [ebp-02h],6Ch;生成串"msvcrt.dll"
                lea eax,[ebp-0bh];
                push eax                ;串地址作为参数入栈
                mov eax,LoadLibrary()地址;---------------------LoadLibrary()地址
                call eax                ;调用 system()

                add esp,0x11        ;堆栈平衡,
                pop ebp;
}
因为不知道怎么取得LoadLibrary()的地址,所以代码没有测试是否好用, - -!先谢谢大家了哈

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 463
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
up
2009-6-16 23:34
0
雪    币: 463
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
说的简单点就是将
LoadLibrary("msvcrt.dll");
转换成汇编代码怎样转换
2009-6-17 00:29
0
游客
登录 | 注册 方可回帖
返回
//