• XSS.stack #1 – первый литературный журнал от юзеров форума

Получение адреса метки на Си

ppsmoke

CD-диск
Пользователь
Регистрация
08.10.2024
Сообщения
18
Реакции
1
Добрый день и с прошедшим нг!
Есть у меня вот такой код:

C:
#include <stdio.h>
#include <stdint.h>

int main()
{
label:;
    uint32_t p = 0;
    __asm{
        lea eax, label
        mov p, eax
    }
    printf("%X", p);
}

Меня интересует как можно получить адрес метки, не используя ассемблерную вставку, и при этом чтобы решение было портируемо! Я знаю, что gcc поддерживает &&label, но меня интересует именно универсальное решение
 
устроит любой костыль, хардкод, безумное решение в любое количество строк и т.д.
по сути даже именно адрес МЕТКИ не требуется, надо получить адрес байта, который предшествует произвольной строчке кода
 
Последнее редактирование:
Меня интересует как можно получить адрес метки, не используя ассемблерную вставку, и при этом чтобы решение было портируемо! Я знаю, что gcc поддерживает &&label, но меня интересует именно универсальное решение
С прошедшим

Для чего тебе получать метку? Почему не устраивает асм вставка?
 
С прошедшим

Для чего тебе получать метку? Почему не устраивает асм вставка?
чисто из исследовательского интереса. препод по реверсу сказал что можно как то без вставок
 
Поставь VEH, после этого вызови исключение (где тебе нужно знать адрес). В функции обработки исключения будут все регистры и RIP тоже. Ну и в самой функции обработки сделай продолжение выполнения кода.
Можно через вызов функции и в ней применить _ReturnAddress(); (аналог call/pop) https://learn.microsoft.com/en-us/cpp/intrinsics/returnaddress?view=msvc-170
 
Последнее редактирование:
Поставь VEH, после этого вызови исключение. В функции обработки исключения будут все регистры и RIP тоже. Ну и в самой функции обработки сделай продолжение выполнения кода.
сейчас попробую, спасибо!
 
чисто из исследовательского интереса. препод по реверсу сказал что можно как то без вставок
VEH -> Context->Eip минус размер инструкции ?
 
Поставь VEH, после этого вызови исключение (где тебе нужно знать адрес). В функции обработки исключения будут все регистры и RIP тоже. Ну и в самой функции обработки сделай продолжение выполнения кода.
Можно через вызов функции и в ней применить _ReturnAddress(); (аналог call/pop) https://learn.microsoft.com/en-us/cpp/intrinsics/returnaddress?view=msvc-170

Прикольная тема с _ReturnAddress();, спасибо еще раз. Вроде все получилось!

1736437035266.png
 
Truly portable ISO C: impossible.
Nothing else drastically new has emerged. It’s more or less the same set of hacks we’ve had for years:
intrinsics (__builtin_return_address()), POSIX signals, labels-as-values, linker script (but doesn’t let you place it exactly at an arbitrary liune of code in the middle of a func w/o gymnastics), call + pop,
 
Пожалуйста, обратите внимание, что пользователь заблокирован


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх