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

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

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

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

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

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 ()
Ответ на: комментарий от 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)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.