Добрый вечер, Уважаемые. Пишу диплом по информационной безопасности. Встал в ступор: пишу маленький код: Code: #include <sys/types.h> #include <unistd.h> int main() { setuid(666); return 0; } Далее все это дело компилю: Code: gcc myprog.c -o myprog -g --static тут я подключаю опцию отладки и функции, находящиеся в разделяемых библиотеках (хотя по поводу --static я не уверен, надо ли). Так дальше: Code: gdb -q ./myprog (gdb)disassemble main и ищю строку вызова setuid Далее дизассемблю setuid и ищю вызов ядра (прерывание $0x80) Дальше я слегка запутался Знаю, что в регистр %eax заносится номер системного вызова. Посмотрел в /usr/include/asm/unistd.h и нашел setuid, он равен 23. Аргумент 666 полетит в регистр, скажем %ebx. Какой уникальный номер у setuid я не знаю, для EXIT знаю 0x1. Вообщем прошу помощи, нужно найти в отладчике gdb, как происходит вызов setuid и далее это дело перевести в шестнадцатиричное представление. Перевести сам смогу, помогите найти кусок кода в gdb, где происходит вызов setuid. Заранее благодарен всем!!!!
Если я правильно понял суть вопроса, то тебе надо код на асме вызова setuid() ? Ну вот держи: Code: movl $23, %eax # $23 - setuid system call number movl $666, %ebx # $666 - rights int $0x80 # call setuid() Кстате на 64х битной архитектуре номера системных вызовов отличные от 32х битной. Например на 32х setuid = 23, а на 64х setuid = 105