Вопрос Return address check

Новичок
Статус
Оффлайн
Регистрация
25 Июл 2022
Сообщения
1
Реакции[?]
0
Поинты[?]
0
В игре реализована трёхуровневая ROP проверка.

Imagebase 0x140000000.

Код:
        if (ret < (uint8_t*)0x14001000 || ret > (uint8_t*)0x142400B75)
                return 0;

Код:
int iscall = 0; 
        uint64_t reti = (uint64_t)ret;

        if (mem[reti-5] == 0xe8) // call off4
                iscall = 1;
        if (mem[reti-6] == 0xff && (((mem[reti-5] & 0x38) - 16 ) & 0xf7) == 0) // call [reg + off4]
                iscall = 1;
        if (mem[reti-3] == 0xff && (((mem[reti-2] & 0x38) - 16 ) & 0xf7) == 0) // call [reg + off1]
                iscall = 1;
        if (mem[reti-2] == 0xff && (((mem[reti-1] & 0x38) - 16 ) & 0xf7) == 0) // call reg, call [reg]
                iscall = 1;

        if (! iscall)
                return 0;

Код:
uint32_t *rettab = (void*)0x01400BBC84;
        uint64_t ret_offset = (uint64_t)ret - 0x140000000;
        uint32_t array_offset = rettab[ret_offset / 0x4000];
        if (array_offset == 0)
                return 0;
        uint32_t *pgoodaddr = (uint32_t *)&rettab[array_offset/4];
        while (*pgoodaddr > 0) { 
                if ( (*pgoodaddr - ret_offset) <= 64)
                        return 1;
                pgoodaddr++;
        }

При триггере любой из них, игра крашится с ошибкой division by zero.

Сама .text секция проверяется на целостность. Через ROP гаджеты игра также крашится из-за третьей проверки (?).

Надеюсь на любую помощь.
 
Сверху Снизу