|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Июн 30, 2004 10:04:49 Приветствую! Помогите разобраться с синтаксисом обращения к syscall_lseek. Имеем исходник: .globl _start _start: # open file xor %eax,%eax push %eax pushl $0x6c77656b #filename movl %esp,%ebx pushw $0666 # file attrib. #pushw $0x0402 # перезаписывает файл. pushw $0x0202 # записывает в начало. pushl %ebx pushl $5 # syscall open push %eax int $0x80 # lseek # write. movl %eax,%edx xor %eax,%eax push %eax movl $ha,%ebx # чего пишем. pushl $23 # сколько байт пишем. pushl %ebx pushl %edx pushl $4 # syscall write push %eax int $0x80 #close file xor %eax,%eax pushl %edx pushl $6 #syscall close push %eax int $0x80 # exit xor %eax,%eax push $1 push %eax int $0x80 ha: .asciz "\x99\x52\x68\x6e\x2f\x73\x68\x68\x2fx\2f" .asciz "\x62\x69\x89\xe3\x51\x52\x53\x53\x6a\x3b" .asciz "\x58\xcd\x80" Хотелось бы сделать: программа ищет в файле определенную последовательность байт ( 0xDEAD например :) ). И если их находит, то вместо них, и с последующим замещением байт записывает мой код ( $ha ). Как я понял проще всего искать байты в теле программы с помощю системного вызова lseek. Самостоятельно разобраться неполучилось, и примеров работы нигде не нашел :( Обращаюсь к вам за помощью. Если есть исходники с примером использования в BSD lseek буду очень признателен. Ну или свой пример :-) |
|
|
Дата: Июн 30, 2004 10:27:29 looser искать байты в теле программы с помощю системного вызова lseek Сомневаюсь, что у FreeBSD особенная функция lseek. Afaik lseek - установить позицию указателя в файле с которой будет происходить дальнейшее чтение или запись. Поиск до сих пор осуществлялся чтением из файла и сравнением прочитанного с целевой последовательностью. |
|
|
Дата: Июн 30, 2004 14:25:21 |
|
|
Дата: Июл 1, 2004 10:41:56 А что, гугл не в почёте сёдня? http://samba.org/doxygen/samba_2_2/vfs-wrap_8c-source.html[/i] sorry, но в этом исходнике я не нашел пример применения lseek`а на at&t asm. Разбираться с c/c++ желания нет. |
|
|
Дата: Июл 1, 2004 14:31:32 · Поправил: Shift А опцию -S для gcc не включить? В сети есть примеры для Си - остаётся только скомпилить и посмотреть asm-листинг. Тем более это(-S) уже проскакивало на форуме. |
|
|
Дата: Июл 2, 2004 10:20:30 Здорово! А я и не знал про "волшебную" опцию -S. Огромное спасибо за подсказку. |
|
|
Дата: Июл 2, 2004 10:56:15 Эх, рано я обрадовался :) Для теста сделал: main() { printf("aaa\n"); } gcc -S aaa.c as -o aaa.o aaa.s До этого момента все оk. Пытаюсь скомпилировать: ld -o aaa aaa.o aaa.o: In function '_start": aaa.o(.text+00xf): undefined reference to 'printf' Вот такая штука. Как я понял, не проходит обращение к сишной функции printf. Подскажите как все это дело побороть? Заранее спасибо за ответ. |
|
|
Дата: Июл 2, 2004 12:26:09 · Поправил: Shift Там нужно подключать GLIBC при линковке.Чтобы с этим не заморачиваться можно просто сделать двумя способами: 1)gcc aaa.s 2)as -o aaa.o aaa.s && gcc aaa.o В обоих случаях черновую работу по подключению GLIBC берёт на себя gcc, что , кстати, не прокомментировано в Ассемблер в Unix |
|
|
Дата: Июл 2, 2004 12:30:05 Shift А опцию -S для gcc не включить? Imho надеяться, что компилятор вставит в выходной ассемблеровский файл исходный код lseek вплоть до int $0x80 наивно. looser Не верной дорогой идешь. |
|
|
Дата: Июл 2, 2004 12:42:08 q_q В общем случае заморачиваться с сисколами - глупо.Как верно заметил один товарищ - порядок передачи параметров и сами вызовы системных функций стандартизованы ТОЛЬКО НА ВЫСОКОМ УРОВНЕ. |
|
|
Дата: Июл 2, 2004 14:55:12 Согласен, использовать gcc -S для получения ассемблерных листингов - "это не наши методы". Попробую расписать задачу более подробно. В первом посте я написал болванку будующей программы. Вместо lseek надо вставить процедуру которая будет искать нужное смещение. Вот тот фрагмент _который_ я хочу пропатчить: 08048530 <suck>: 8048530: 55 push %ebp 8048531: 89 e5 mov %esp,%ebp 8048533: 83 ec 08 sub $0x8,%esp 8048536: 83 c4 fc add $0xfffffffc,%esp 8048539: 6a 05 push $0x5 804853b: 68 83 85 04 08 push $0x8048583 8048540: 6a 01 push $0x1 8048542: e8 71 fe ff ff call 80483b8 <_init+0x2c> 8048547: 83 c4 10 add $0x10,%esp 804854a: c9 leave 804854b: c3 ret Как я понял - нужно искать смещение 0x0530. Пишу код: push $0 movw 0x0530 # смещение которое ищем. mov %esp,%ecx push $0x6c77656b # имя файла. push %ebx mov $119,%eax int $0x80 Вроде как все правильно. НО при таком подходе он вообще в кору падает на pushw 0x0530 :-Q подскажите где я ошибаюсь. Заранее спасибо за ответы. |
|
|
Дата: Июл 2, 2004 15:33:32 Shift заморачиваться с сисколами - глупо Автор темы так хочет. looser Согласен, использовать gcc -S ... это не наши методы Ты не правильно понял. Смотреть генерируемый код - полезно. Я же имел в виду, что такой подход не покажет тебе правильные параметры для int $0x80 Как я понял - нужно искать смещение 0x0530 Как ты сделал такой вывод? смещение которое ищем Повторяю. lseek не ищет, а позиционирует. lseek принимает три параметра: дескриптор файла, смещение и флаг определяющий, как интерпретировать смещение. ps почитай уже маны, прежде чем использовать функции. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.056 |