zoukankan      html  css  js  c++  java
  • 利用Windbg在程序中插入hack

    实验程序:

    #include <stdio.h>
    void Func()
    {
    	printf("MyFunction
    ");
    }
    
    void Hack()
    {
    	printf("I am a Hacker!
    ");
    }
    
    int main()
    {
        Func();
    	return 0;
    }
    

    编译环境VC++ 6.0

    打开项目设置

    image-20210603195413336

    在Release版本中勾选上生成调试信息

    image-20210603195645730

    编译、链接、执行

    image-20210603195750585

    在资源管理器中可看到如下文件结构

    image-20210603195853152

    打开Windbg

    image-20210603200017298

    打开刚刚编译好的程序

    image-20210603200047748

    添加符号文件路径

    image-20210603200144646

    在main()函数处,设置断点

    0:000> bp StackTest!main
    *** WARNING: Unable to verify checksum for StackTest.exe
    0:000> bl
     0 e 00401020     0001 (0001)  0:**** StackTest!main
    

    输入g,程序中断于断点处

    image-20210603201223079

    查看当前eip和esp的值

    0:000> r eip,esp
    eip=00401020 esp=0012ff4c
    

    查看程序的反汇编代码

    StackTest!Func:
    00401000 6830804000      push    offset StackTest!`string' (00408030)
    00401005 e826000000      call    StackTest!printf (00401030)
    0040100a 59              pop     ecx
    0040100b c3              ret
    0040100c 90              nop
    0040100d 90              nop
    0040100e 90              nop
    0040100f 90              nop
    StackTest!Hack:
    00401010 683c804000      push    offset StackTest!`string' (0040803c)
    00401015 e816000000      call    StackTest!printf (00401030)
    0040101a 59              pop     ecx
    0040101b c3              ret
    0040101c 90              nop
    0040101d 90              nop
    0040101e 90              nop
    0040101f 90              nop
    StackTest!main:
    00401020 e8dbffffff      call    StackTest!Func (00401000)
    00401025 33c0            xor     eax,eax
    00401027 c3              ret
    

    单步执行,进入Func函数调用

    dd esp查看堆栈信息

    0:000> r eip,esp
    eip=00401000 esp=0012ff48
    0:000> dd esp
    0012ff48  00401025 00401115 00000001 00380b78
    0012ff58  00380bf0 00000000 00000000 7ffdf000
    0012ff68  00000000 00000000 0012ff5c 00000000
    0012ff78  0012ffc4 00402790 004070e0 00000000
    0012ff88  0012ff94 765e3c45 7ffdf000 0012ffd4
    0012ff98  76fd37f5 7ffdf000 76166a17 00000000
    0012ffa8  00000000 7ffdf000 00000000 00000000
    0012ffb8  00000000 0012ffa0 00000000 ffffffff
    
    

    此时栈顶存放的是main函数中调用Func后的下一条命令的地址,也就是Func返回的地址

    00401025

    单步执行至Func的ret语句

    0040100b c3              ret
    0:000> dd esp
    0012ff48  00401025 00401115 00000001 003d0b78
    0012ff58  003d0bf0 00000000 00000000 7ffd5000
    0012ff68  00000000 00000000 0012ff5c 00000000
    0012ff78  0012ffc4 00402790 004070e0 00000000
    0012ff88  0012ff94 765e3c45 7ffd5000 0012ffd4
    0012ff98  76fd37f5 7ffd5000 763f4c17 00000000
    0012ffa8  00000000 7ffd5000 00000000 00000000
    0012ffb8  00000000 0012ffa0 00000000 ffffffff
    
    0:000> ed esp
    0012ff48 00401025 00401010
    

    更改栈顶返回地址的值,使其跳转到Hack函数的位置

    记录真正要返回的地址00401025

    运行至Hack函数的ret语句,此时修好栈顶的值为

    0:000> ed esp 00401025
    0:000> dd esp
    0012ff4c  00401025 00000001 003d0b78 003d0bf0
    0012ff5c  00000000 00000000 7ffd5000 00000000
    

    接着单步运行

    image-20210603210615764

  • 相关阅读:
    [学习笔记] SSD代码笔记 + EifficientNet backbone 练习
    [论文理解] CornerNet: Detecting Objects as Paired Keypoints
    [torch] torch.contiguous
    [tensorflow] tf2.0 简单例子
    [大坑]Could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR
    本机Jenkins的使用
    安全工具acunetix使用
    cv2.matchTemplate()函数的应用,匹配图片后画出矩形
    python将PNG格式的图片转化成为jpg
    Python实现FTP文件的上传和下载
  • 原文地址:https://www.cnblogs.com/delongzhang/p/14847243.html
Copyright © 2011-2022 走看看