记录学习《0Day安全》路上遇到的问题解决方案 -- 开发shellcode的艺术!

ps: 阅读这本书籍,希望留下点什么~

__author__ == "lit0"

问题1: jmp esp定位

问题描述: jmp esp 是动态执行shellcode的关键,一般的,只需要执行内存任何jmp esp语句就可以跳转到esp指向的地址即shellcode地址使代码执行成功。
下面的代码是载入user32.dll 获取 jmp esp内存地址。

注意 jmp esp 的地址应该逆序写入 shellcode 如 0x7763fd21 >> 21 fd 63 77

# include<stdio.h>
# include<windows.h>

int main() 
{
    BYTE* ptr;
    int position, address;

    HINSTANCE handle;
    BOOL done_flag = FALSE;
    handle = LoadLibrary("user32.dll");

    if (!handle) {
        printf("load dll error");
        exit(0);
    }
    ptr = (BYTE*)handle;

    for (position = 0; !done_flag; position++) {
        try {
            // 0xffe4 是jmp esp 对应的机器码
            if (ptr[position] == 0xFF && ptr[position+1] == 0xE4) {
                int address = (int)ptr + position;
                printf("found ad 0x%x\n", address);
            }
        } catch (...) {
            int address = (int)ptr + position;
            printf("end of 0x%x\n", address);
            done_flag = true;
        }
    }
}

问题2:如何获取user32.dll MeassageBoxA的入口地址

问题描述: 使用dependency walker 获取user32.dll 的基址 由于位置原因win7 32 sp1 获取失败,只能读取到preferred base地址,actual base地址获取不了(和书本讲好的不一样呐~ 解决他花了好多时间。)

使用下面代码可以获取函数的入口地址:

# include<windows.h>
# include<stdio.h>

int main()
{
    //获取函数调用的入口地址
    HINSTANCE LibHandle;
    LibHandle = LoadLibrary("kernel32.dll");  //可以替换 如:换成user32.dll
    typedef void (*MYPROC)(LPTSTR);
    MYPROC procAddr = (MYPROC)GetProcAddress(LibHandle, "ExitProcess"); //换成MessageBoxA
    printf("0x%x\n",procAddr);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值