Как исправить инструкцию в коде, которая вызывает сбой приложения - PullRequest
0 голосов
/ 23 мая 2019

Основной файл приложения падает из-за того, что на сервер влияет ошибка форматной строки при обработке псевдонимов игроков из-за доступа к недопустимая зона памяти. Выполнена инструкция «cmp [EAX], 00000000», где EAX содержит 4 байтов в псевдониме и сбивает сервер.

Я отладил и обнаружил, что "% s" отсутствует перед передачей строки регистрации в функцию File_printf. Поэтому я попытался добавить эту строку с помощью отладчика IDA и Successed. После ввода этих байтов теперь происходит сбой сервера с сообщением «сервер не уязвим» перед тем, как произошел сбой с сообщением «сервер уязвим» CODE Байты, которые я ввел для исправления приложения:

RVA
    00400000

OFFSET
    0041dfad    cc  68          ; push 0061d0dc
           +    cc  |0061d0dc

           +    cc  e8          ; call 0040d270
           +    cc  ^0040d270

           +    cc  83          ; add esp,04
           +    cc  c4
           +    cc  04

           +    cc  e9          ; jmp 0041e059
           +    cc  ^0041e059

    0041e054    e8  e9          ; jmp 0041dfad
           +    ??  ^0041dfad

0055DD63 cmp     dword ptr [eax], 0

 /*source*/
if ( *(_DWORD *)a1 )
    a1 = sub_445D50();
  if ( v2 )
  {
    --*(_DWORD *)(v2 + 4);
    *(_DWORD *)a1 = *(_DWORD *)(v2 + 20);
    *(_DWORD *)(v2 + 20) = a1;
  }
  else
  {
    v3 = *(_DWORD *)((a1 - 4) & 0xFFFFFFFC);
    --dword_798ABD0;
    sub_445D50();
    memset(*(void **)(v3 + 8), 0xCDu, *(_DWORD *)(v3 + 16));
    free((void *)v3);
  }
}

/ Hex Value / 0055DD63 83 38 00

После тестирования сервера на сбой, после этого произошел сбой сервера с сообщением в инструменте тестирования «Сервер не уязвим», но произошел сбой.

А в IDA отладчика я получаю этот результат с подробным сообщением:

55dd63: The Instruction at 0x55DD63 referenced memory at 0x61616161, The memory could not be read -> 61616161 (exc.code c0000005, tid 4692)

Изображение 1

Изображение 2

Изображение 3

Изображение 4

Изображение 5

Я также могу поделиться инструментом тестирования, но не здесь, потому что инструмент тестирования имеет троянский файл .simplese и может нанести вред вашему компьютеру, но я могу поделиться исходным кодом инструмента тестирования по запросу.

1 Ответ

2 голосов
/ 23 мая 2019

Ошибка вызвана функцией ведения журнала NetManager_LogMessage, которая принимает текст для выгрузки, добавляет метку времени (используя snprintf), а затем передает всю строку в функцию File_printf без необходимого аргумента формата (% s), и вам нужно использоватьзначение 05 вместо 04, чтобы освободить место, чтобы обмануть ошибку.Этот трюк работает на многих играх и удачи

...