noisiv 1
noisiv
Manwe Work 1
Manwe Work
Bodyguardd 1
Bodyguardd
kralhakan2009 1
kralhakan2009
Vahsi Uzman 1
Vahsi Uzman
romegames 1
romegames
Manastir2 1
Manastir2
lHezarfeNl 1
lHezarfeNl
kaptanmikro1 1
kaptanmikro1
Reklam vermek için turkmmo@gmail.com

Buffer Exploit

  • Konuyu başlatan Konuyu başlatan Silverhand
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 91
  • Görüntüleme Görüntüleme 9K
  • Etiketler Etiketler
    bufferexploit
Düzenleme!
Desc.cpp'de şu düzenlemeyi yapmıştık hatırlarsanız.
Kod:
int DESC::ProcessInput()
{
    if (!m_lpInputBuffer)
    {
        sys_err("DESC::ProcessInput : nil input buffer");
        return -1;
    }

    const DWORD now = get_dword_time();

    if (now - m_dwPacketTick >= 1000)
    {
        m_dwPacketTick = now;
        m_iPacketCounter = 0;
    }

    if (++m_iPacketCounter > 256)
    {
        sys_err("DESC::ProcessInput: packet flood from %s", GetHostName());
        return -1;
    }

    if (m_iPhase == PHASE_HANDSHAKE)
    {
        if (get_global_time() - m_dwConnectTime > 10)
        {
            sys_err("DESC::ProcessInput: handshake timeout %s", GetHostName());
            return -1;
        }
    }

    buffer_adjust_size(m_lpInputBuffer, m_iMinInputBufferLen);

    ssize_t bytes_read = socket_read(
        m_sock,
        (char*)buffer_write_peek(m_lpInputBuffer),
        buffer_has_space(m_lpInputBuffer)
    );

    if (bytes_read < 0)
        return -1;

    if (bytes_read == 0)
        return 0;

    buffer_write_proceed(m_lpInputBuffer, bytes_read);

    if (buffer_size(m_lpInputBuffer) > (2 * 1024 * 1024))
    {
        sys_err("DESC::ProcessInput: input buffer too large (%u) from %s",
            (unsigned)buffer_size(m_lpInputBuffer), GetHostName());
        return -1;
    }

    if (!m_pInputProcessor)
    {
        sys_err("DESC::ProcessInput: no input processor");
        return -1;
    }

    int iBytesProceed = 0;

    while (!m_pInputProcessor->Process(
        this,
        buffer_read_peek(m_lpInputBuffer),
        buffer_size(m_lpInputBuffer),
        iBytesProceed))
    {
        // Infinite loop protection
        if (iBytesProceed <= 0)
        {
            sys_err("DESC::ProcessInput: invalid proceed size %d from %s",
                iBytesProceed, GetHostName());
            return -1;
        }

        buffer_read_proceed(m_lpInputBuffer, iBytesProceed);
        iBytesProceed = 0;
    }

    if (iBytesProceed > 0)
        buffer_read_proceed(m_lpInputBuffer, iBytesProceed);

    return bytes_read;
}

Buradaki şu kısım :

Kod:
    if (buffer_size(m_lpInputBuffer) > (2 * 1024 * 1024))

    {

        sys_err("DESC::ProcessInput: input buffer too large (%u) from %s",

            (unsigned)buffer_size(m_lpInputBuffer), GetHostName());

        return -1;

    }

Şu şekilde değişmelidir!

Kod:
    if (GetType() == DESC_TYPE_ACCEPTOR && !IsPhase(PHASE_P2P) && buffer_size(m_lpInputBuffer) > (2 * 1024 * 1024))

    {

        sys_err("DESC::ProcessInput: input buffer too large (%u) from %s",

            (unsigned)buffer_size(m_lpInputBuffer), GetHostName());

        return -1;

    }

Gelen veriyi kimden geldiğine bakmadan kontrol ediyordu. Game sunucusu iki tür bağlantı kullanıyor ve bu satır ikisine de uygulanıyordu.
O zamanlar tam olarak konuya dikkatli yaklaşmadığımız için gözden kaçmış.
 

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst