Executa chamadas do sistema diretamente

1

Desde que um usuário esteja autorizado a acessar algo, como ele pode executar uma chamada de sistema diretamente, como geteuid () - obter um ID de usuário efetivo (é apenas um exemplo) do bash, como eu poderia fazer isso?

    
por Pierre B 06.11.2017 / 15:04

2 respostas

10

A comunicação do espaço de kernel do espaço do usuário por meio de chamadas do sistema é feita em termos de locais de memória e registros de máquina. Isso é muito abaixo do nível de abstração dos shells, que operam principalmente com strings de texto.

Dito isso, no bash, você pode usar o plug-in link para passar a abstração de sequência de texto até C granularidade de nível:

$ . ctypes.sh
$ dlcall -r long geteuid
long:1001

Para essa operação em particular, seria muito mais simples, mais idiomático e mais eficiente simplesmente usar a variável magic $UID do bash.

$ echo "$EUID" #effectively a cached geteuid call
1001
    
por 06.11.2017 / 16:09
6

Para obter o uid, escreva seu próprio programa em C (ou algum plugin do shell, se o seu shell os aceita; o FYI zsh pode ter plugins, chamado módulos .) ou mais simplesmente execute o id (1) .

Para outros syscalls (listados em syscalls (2) ), é o mesmo: use algum programa (ou algum embutido ou algum plugin) fazendo-os. Esse programa poderia ser codificado diretamente no assembler e usaria SYSCALL ou SYSENTER instruções da máquina para fazer a chamada do sistema, ou (e com muito mais frequência) usaria sua C biblioteca padrão e use a função libc fazendo isso syscall. Executáveis não precisam ser obtidos a partir da fonte C (por exemplo, busybox é codificado em assembler, o Scheme bones não usa libc). No entanto, o seu libc é a pedra angular do seu sistema.

As chamadas do sistema que alteram algumas propriedades mutáveis e herdáveis dos processos devem ser integradas no shell (como cd para chdir (2) , ulimit para setrlimit (2) , etc ...), porque você pode querer alterar a propriedade no próprio processo do shell (e herdado por futuros processos de comando iniciados pelo shell). Portanto, se cd fosse um programa, isso se aplicaria apenas ao processo filho do shell que executa esse programa.

BTW, chamadas do sistema só fazem sentido quando feitas de alguns process . Esse processo pode ser o processo shell ou algum processo filho (ou descendente) iniciado pelo shell.

Observe que os shells Unix são programas comuns. Existem muitos deles (por exemplo, zsh , peixe , < a href="https://scsh.net/"> scsh , es , etc ....) ... É um exercício interessante para codificar sua própria shell (e isso pode ser feito simplesmente, veja sash para um exemplo, veja também este para dicas sobre globbing). Leia algo sobre programação do Linux . Se você não está feliz com bash use outro shell (talvez alterando seu shell de login usando chsh (1 ) ) ou escreva o seu próprio. Além disso, o bash do GNU é, como a maioria dos outros shells, software livre . Você pode estudar seu código-fonte e melhorá-lo se quiser.

    
por 06.11.2017 / 15:33