zoukankan      html  css  js  c++  java
  • Windows 2000 栈溢出 利用异常

    当在一个函数(test)里面自定义了异常处理,如下:

    那么在运行时,它会把自定义的异常处理函数MyExceptionhandler()的地址放入栈中(PUSH 004013CC)

    然后把fs:[0]的地址(也是TEB的地址,SEH链的起始地址)放入栈中,然后把ESP的地址赋值给fs:[0];

    异常链结构:

    struct SEH

    {

      SEH*  next;//指向下一个异常链地址

      int*  funcAddress;//指向保存异常处理函数地址的地址(我讨厌指针这个词,在汇编里面,不是地址,就是数据);

    }

    上面的操作就是,链表的插入,插在了头部。

    溢出:

       test函数里面,strcpy()函数,如果拷贝超出了容器数组的边界,就会把栈的数据覆盖

       而栈里面容器后面是SEH结构,如果用shellcode的地址把funcAddress覆盖了,异常处理就会被骗。

    异常调用:

      当发生除0异常时,会调用函数进行异常处理

       对异常进行分发等一系列操作,然后就找到了fs:[0]的异常处理链,fs:[0]里面保存的就是之前那个ESP的地址,

      它就跑过来要调用这个地址里面保存的函数地址,但是这个函数地址已经被修改了。然而系统是傻的,管你什么地址,能过去就过去。

      所以就到了shellcode里面。(shellcode执行开始的地址就是buf的地址,buf是局部变量,相对于EBP的偏移是恒定的,可通过偏移找出来。

      当然了,不考虑普遍适用性,通过调试找出来,写死也可以);

    注意事项:

      char buf[],这是个字符串数组,字符串数组在strcpy时会被'0x00'截断,因此,shellcode中不能有’0x00'。

      可以把构筑好的shellcode异或加密,使得没有'0x00',运行时再解密后面的代码。

    调试:

      在代码中加入 __asm int 3;用于添加断点,编译好程序。直接运行,系统会报错,点取消,然后会自动使用默认调试器调试。

      OD设置系统默认调试器:option -->  just in time(实时调试)

  • 相关阅读:
    loadrunner 11安装教程
    测试用例
    软件测试分类
    软件测试模型
    VMware Workstation安装Red hat7.0联网问题总结
    Python网络编程基础pdf
    Python数据可视化编程实战pdf
    Python数据分析实战
    Python数据科学手册
    Python入门经典. 以解决计算问题为导向的Python编程实践
  • 原文地址:https://www.cnblogs.com/jf-blog/p/12342286.html
Copyright © 2011-2022 走看看