Русским и английским языком написано. Сегментные регистры в x64 кроме GS и FS не используются и принудительно устанавливаются в 0.
In 64-bit mode, segmentation is generally (but not completely) disabled, creating a flat 64-bit linear-address space. The processor treats the segment base of CS, DS, ES, SS as zero, creating a linear address that is equal to the effective address. The exceptions are the FS and GS segments, whose segment registers (which hold the segment base) can be used as additional base registers in some linear address calculations.
invoke accept,[socket_server],addr_client,sizeof.sockaddr_in
mov [esi + 000001cc], ecx
Объясните пожалуйста что из этого всего на скриншотах база, смещение я так понимаю (01CC) но смещение относительно чего?
$ gcc -fPIC -o a.out ./1_1.s
Параметр -fPIC не помогает
-fPIC
изменяет ассемблерный вывод компилятора, на готовый ассемблерный файл этот ключ никак не влияет.movl $.hello_str, %edi
-m32
. 1) Первая страница памяти отвечает за обращение к первой странице памяти вторая ко второй и так далее?
2) Связка виртуального и физического адреса позволяет создать что-то по типу перенаправления?
3) Работает ли обратная связь когда если пишу в виртуальную страницу идет перенаправление на физическую?
4) Для работоспособности в данном режиме надо создаться страницы в диапазоне которых лежии код программы?
5) Страничная организация памяти работает паралельно с адресацией по дискриптору или это замена?
What is flat assembler g?
It is an assembly engine designed as a successor of the one used in flat assembler 1, one of the recognized assemblers for x86 processors. This is a bare engine that by itself has no ability to recognize and encode instructions of any processor, however it has an ability to become an assembler for any CPU architecture. It has a macroinstruction language that is substantially improved compared to the one provided by flat assembler 1 and it allows to easily implement instruction encoders in form of customizable macroinstructions. This approach has a great flexibility at the cost of performance.
Если взять за основу эту схему, то становится понятно, как код процесса может узнать адреса текста, инициализированных данных, неинициализированных данных
и кучи
не ясно, как становится известен адрес стека и аргументов командной строки
Как перевести этот код с C++?
mov ebx, [ebp - 8]
lea ebx, [ebp - 8]
lea edx, [ebx + ecx + 4] ; add FirstThunk RVA to base. Offset &function is 4
lea edx, [edx + 20] ;size of IMAGE_THUNK_DATA
можно ли ее как-то улучшить
при компиляции флаг из реестра не удаляется. В чем может быть проблема?
Байты из зеленой области, как я понял, это информация линкера golink. Так ли это?
Подскажите пж, в чем может быть проблема?
REG DELETE HKCU\keys /v key
и убедиться, что желаемое действие происходит (я так понимаю, что keys и key -- это затычки, в реальном коде указаны конкретный путь в реестре и конкретное имя значения).xor eax, eax
после возврата из WinExec, чтобы результат пришёл в ExitProcess -- и посмотреть на код завершения процесса. mov byte [sockaddr_in + 0], AF_INET ; sin_family
mov byte [sockaddr_in + 2], 0 ; sin_port[0] это старший байт sin_port
mov byte [sockaddr_in + 3], 80 ; sin_port[1] а это младший
Фактически, по адресу 0x0060 лежит какой-то мусор, который никак не относится к тому, что я туда хотел положить.
__do_copy_data
и __do_clear_bss
в каждую единицу трансляции, в которой определяются объекты в секции .data и .bss соответственно. В написанных руками ассемблерных файлах их можно упомянуть явно. Если же разместить в стеке локальные четырёхбайтные переменные, то они окажутся доступны по адресам [esp-4] , [esp-8] и т. д.
Смутило последнее предложение: почему автор указал, что можно адресоваться выше стека?
void OutFloat(double v);
sub sp,16
mov bp,sp
fstp qword ptr [bp + 8]
call OutFloat
add sp,16