LINUX.ORG.RU

не работает функция bind.

 


0

1

Что же не так?

; сделать bind ( sockfd, [AF_INET, 12345, INADDR_ANY], 16 )
        mov eax, 102 ; syscall
        mov ebx, 2 ; bind
        push 0 ; INADDR_ANY
        mov ecx, [port] ; port 12345
        push ecx ; port
        push 2; AF_INET
        mov ecx, esp ; struct pointer
        push 16 ; sizeof ( struct sockaddr )
        push ecx ; sockaddr_in struct pointer ( struct sockaddr * )
        mov edx, [socket] ; sockfd
        push edx ; sockfd
        mov ecx, esp ; ptr to argument array
        int 0x80
Возвращает ошибку -99. Сокет сработал нормально, setsockopt тоже нормально, а вот bind нет.

Приглашаю SZT. А также всех кто знает как помочь.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от SZT

А всё, нашёл
/usr/include/asm-generic/errno.h:#define EADDRNOTAVAIL 99 /* Cannot assign requested address */ Не может назначить требуемый адрес.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от Deleted

Опять ты?! Научись уже гуглить и разучись строить велосипеды.

Здесь вопросы задаются тем кто знает.Может мне на эту тему побеседовать хочется . У вас видимо есть желание давать натации свои ( форум предоставляет такую возможность ). Здесь, не ты, могут написать что нибудь, что нужно, а мне даже не надо искать по другим сайтам.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от SZT

Я всё равно не пойму что надо сделать, чтобы заработало.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от SZT

Вот ещё нашел

49 	EADDRNOTAVAIL 	Bind 	The specified address is incorrect for this host. 	Correct the function address parameter.
Но как правильно указать, где ошибка?

u0atgKIRznY5
() автор топика

Решил шеллкод сделать, да? Вот тебе

http://shell-storm.org/shellcode/files/shellcode-882.php

http://shell-storm.org/shellcode/files/shellcode-836.php

https://zerosum0x0.blogspot.com/2014/12/x64-linux-bind-shellcode-81-bytes-96....

и интерфейс системных вызовов через int 0x80 уже не используется на современных x86-64 архитектурах.

https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/x86_... вот враппер для x86-64

вот враппер для i386 https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/i386... - тут можно действительно видеть int 0x80, но обрати внимание также на варианты с call *_dl_sysinfo и варианты с call *%%gs:%P2

В общем смотри http://articles.manugarg.com/systemcallinlinux2_6.html

Starting with version 2.5, linux kernel introduced a new system call entry mechanism on Pentium II+ processors. Due to performance issues on Pentium IV processors with existing software interrupt method, an alternative system call entry mechanism was implemented using SYSENTER/SYSEXIT instructions available on Pentium II+ processors. This article explores this new mechanism. Discussion is limited to x86 architecture and all source code listings are based on linux kernel 2.6.15.6.

Там задействуется SYSENTER инструкция

SZT ★★★★★
()
Последнее исправление: SZT (всего исправлений: 1)
Ответ на: комментарий от u0atgKIRznY5

push ecx ; port
push 2; AF_INET

что то мне подсказывает что оно в стек 4 байта пихает, а надо по 2 байта

вообще шел коды зло, а те кто их пишут зло двойное

anonymous
()
Ответ на: комментарий от SZT

Решил шеллкод сделать, да?

Нет, я с примеров посмотрел как syscall выполняется. Хотя в книге «хакинг искусство эксплойта» написано, как на ассемблере выполнять с syscall.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от SZT

Вот тебе

Спасибо. Я нашёл, всё дело в размере помещаемых в стек данных. Щас только теперь порт не такой, какой задумывал, но всё же bind возвращает 0!

u0atgKIRznY5
() автор топика
Ответ на: комментарий от Deleted

Ему нужен network byte order (big-endian). Поменяй байты местами.

Точно, спасибо.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от SZT

а мне не шеллкод надо, а уметь делать статически слинкованные маленькие бинарники вполне для мирных целей

где смотреть?

www_linux_org_ru ★★★★★
()
Последнее исправление: www_linux_org_ru (всего исправлений: 2)
Ответ на: комментарий от www_linux_org_ru

где смотреть?

Тогда советую книгу «Хакинг искусство эксплоита», там есть шелл коды, и как из них делать маленького размера, путём удаления нулей.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

мне не нули удалять надо, мне надо маааленькую libc и libstl (с последним я и сам справлюсь — шаблоны вообще не требуют рантайма, но хочется готовый рецепт)

какого черта поверх сисколлов даже на си наверчено столько говна? минимальные бинарники на си у меня выходят 500Кб, епрст

www_linux_org_ru ★★★★★
()
Последнее исправление: www_linux_org_ru (всего исправлений: 3)
Ответ на: комментарий от www_linux_org_ru

Потому что, компилятор оставляет много избыточной информации. Вот у меня пока что программа, которая открывает порт и ждёт подключения, а потом отправляет подключившемуся сообщение. Вся программа занимает 972 байта, а если добавить функцию execve, то добавиться ещё сколько то байт. Вообщем смотри сам. У меня почти готовый рецепт, только без execve, но это описано в книге, которой я привёл.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от www_linux_org_ru

ты сам-то пробовал? статически слинкованный puts(«hello world») cколько весит?

Поэтому, раз уж ты в си пишешь, то используй write, это хотя бы системный вызов, может с ним будет меньше размера.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

ты четко разговаривать можешь? если сравнивать размер, то надо писать «эхо-сервер» например

вот добрый анонимус дал ссылку, там видно, что минимальный размер проги на dietlibc 200 байт, можно попробовать написать эхо-сервер, и посмотреть, сколько ты со своим асмом там выиграешь

www_linux_org_ru ★★★★★
()
Последнее исправление: www_linux_org_ru (всего исправлений: 1)
Ответ на: комментарий от www_linux_org_ru

ты сам-то пробовал?

Нет, я давно уже не пишу на Си. Просто вспомнил про это.

А ты с glibc статически линкуешься? Он очень жирный, да. Есть musl, он намного легче.

Psych218 ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

можно попробовать написать эхо-сервер, и посмотреть, сколько ты со своим асмом там выиграешь

У меня на асме только эти функции.

socket
setsockopt
listen
accept
write
И это уже столько занимает 972 байта. Я даже и незнаю как сделать меньше.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от Psych218

А ты с glibc статически линкуешься? Он очень жирный, да. Есть musl, он намного легче.

ты наконец заметил, что я спрашивал; это прогресс, я считаю

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от Psych218

А ты с glibc статически линкуешься? Он очень жирный, да.
ты наконец заметил, что я спрашивал; это прогресс, я считаю

Наверное у тебя с мышлением что-то не то.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

заюзал dietlibc

стрипованный эхо-сервер весит 2072 байт, при этом стринги в нем весят 530 байт, т.е. код получается не намного больше чем у тебя — а когда ты сервис добавишь, так вообще незаметно будет

за счет стрингов у меня нормальная диагностика (ну почти, мне еще itoa нужно), плюс написан код не на асме и даже не на сях, а на плюсах (хотя пока что и без исключений и без stl)

вот мои стринги (основная часть):

real-echo-server2.cxx:68 socket(2,SOCK_STREAM,0)
real-echo-server2.cxx:70 setsockopt(listen_fd,1,2,&option,sizeof(option))
real-echo-server2.cxx:71 bind(listen_fd,(__const struct sockaddr *)&saddr,sizeof(saddr))
real-echo-server2.cxx:72 listen(listen_fd,n)
real-echo-server2.cxx:54 accept(listen_fd,__null,__null)
real-echo-server2.cxx:58 read(accept_fd,buffer,size)

p.s. асм нужен, но не для столь простой фигни

p.p.s. щас компильнул все с -Os, так щас стрипованный бинарник вообще 1792, т.е. чистого кода 1300 байт!

p.p.p.s. пока что в эхо-сервере говнокод, 20 байт может понадобится сверху — но а что у тебя?

www_linux_org_ru ★★★★★
()
Последнее исправление: www_linux_org_ru (всего исправлений: 4)
Ответ на: комментарий от www_linux_org_ru

а когда ты сервис добавишь, так вообще незаметно будет

Какой сервис? эхо?

но а что у тебя?

Я пока занят написанием другой программы, потом напишу, отпишусь.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

«серсис» это какая-то другая функциональность, кроме простого exec*

ну там скажем пройтись по списку доменов, прорезольвить их, попытаться выкачать payload и т.п. — килобайт думаю сожрет спокойно, и 300 байт твоего преимущества мало что дадут — хотя я не знаю, может тебе только шелл и нужен

но меня здесь интересует другое — сколько я на своем с++ теряю перед асм-ом, так что для начала напиши эхо-сервер, а там уже видно будет

www_linux_org_ru ★★★★★
()
Последнее исправление: www_linux_org_ru (всего исправлений: 1)
Ответ на: комментарий от www_linux_org_ru

но меня здесь интересует другое — сколько я на своем с++ теряю перед асм-ом, так что для начала напиши эхо-сервер, а там уже видно будет

Хорошо, я напишу и дам знать.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от www_linux_org_ru
socket
setsockopt
bind
listen
accept
read
write
close
exit

Эхо сервер, всего 1144 байта.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от www_linux_org_ru

Там два close, один закрывает клиентский сокет, другой серверный.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от www_linux_org_ru

ты сам-то пробовал? статически слинкованный puts(«hello world») cколько весит?

Возьми musl вместо glibc.

hateyoufeel ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

А ты пробывал strip program. У меня программа, получает и обрабатывает переменные окружения, читает файл настроек и конвертирует строку и выполняет функции, ну все в списке

socket
setsockopt
bind
listen
accept
read
write
close
close
exit
Я сделал strip, и размер файла у меня стал 1100 байт.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

я же написал «стрипованный», хотя и без ключей — мне пока что лень копаться и выяснять, куда у меня ушли 300 байт

обрабатывает переменные окружения, читает файл настроек

тут объем работы может быть совершенно разный, так что без его указания сравнивать бесполезно

www_linux_org_ru ★★★★★
()
Последнее исправление: www_linux_org_ru (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.