у кого есть 64-х битная система с установленным линуксом версии 2.6.x, выполните следующую последовательность действий и отпишитесь, что получилось в итоге 1. пишем программу Code (Text): #include <unistd.h> int main() { for (;;) pause(); return 0; } 2. запускаем ее, через GDB подключаемся к соответствующему процессу 3. выравниваем текущий RIP по границе страницы (4096 байт) в меньшую сторону 4. выполняем одну инструкцию какое значение имеет RIP после выполнения?
rei3er suse 10.3 x64 после аттача: $rip = 2af259b12900 после выравнивания: $rip = 2af259b12000 после stepi $rip = 2af259b11f50
Code (Text): (gdb) display $rip 2: $rip = (void (*)()) 0x2b7cc223a600 <pause+16> (gdb) set $rip= 0x2b7cc223a000 (gdb) display $rip 3: $rip = (void (*)()) 0x2b7cc223a000 <waitpid+144> (gdb) stepi 0x00002b7cc223a005 in waitpid () from /lib64/libc.so.6 3: $rip = (void (*)()) 0x2b7cc223a005 <waitpid+149> 2: $rip = (void (*)()) 0x2b7cc223a005 <waitpid+149> правильно выравнял?
rei3er У меня после округления rip указывал на невалидную инструкцию. Не знаю, как в Линуксе обрабатываются такие ситуации, но в gdb команда stepi выполнилась без всяких замечаний...
тут без разницы значение RIP либо должно оставаться без изменения (#UD -> SIGSEGV), либо увеличиваться, но никак не уменьшаться