Variável IFS ignorada no sistema ()

3

Para uma turma na minha universidade, estou tentando obter uma escalada de privilégios. Eu tenho esse código simples que simplesmente replica a saída de ls e tem SUID bit set.

int main(void){
  system("/bin/ls");
  return 0;
}

E também adicionei o script que servirá como shell no diretório inicial:

#!/bin/bash
/bin/sh

E também adicionei . na variável $PATH e é o primeiro. Então, o que deve acontecer é que sempre que eu executar o código em C, isso deve chamar o script bin no diretório inicial, no entanto, a variável IFS é completamente ignorada, porque ele realmente executa /bin/ls e não bin ls . Alguma ideia do porquê?

    
por BetimNeutron 02.09.2016 / 09:55

2 respostas

2

Seu programa não executa um script " bin no diretório inicial". Executa "/bin/ls" . A chamada do sistema usa o shell, mas também usando um nome de caminho absoluto (na verdade POSIX diz o caminho é executado é a implementação definida). Não há como PATH afetar a escolha de ls ou do shell.

POSIX aborda o comportamento de IFS , dizendo:

Implementations may ignore the value of IFS in the environment, or the absence of IFS from the environment, at the time the shell is invoked, in which case the shell shall set IFS to <space> <tab> <newline> when it is invoked.

Se você estivesse perguntando sobre uma implementação que não se comporta dessa maneira, então (porque POSIX sugere que isso é feito com bastante frequência para observar) a implementação específica seria pertinente.

    
por 02.09.2016 / 10:49
0

Mesmo que o shell invocado por system para executar o comando /bin/ls respeitasse o valor de IFS no ambiente, ele não teria efeito na análise dessa linha de comando:

  1. IFS não é usado para analisar comandos do shell. O comando é dividido em palavras usando a gramática de shell, que especifica precisamente como a linha deve ser tokenizada. (Metacaracteres terminam tokens; alguns metacaracteres também são tokens.)

  2. A divisão de palavras, que respeita IFS , é executada somente em entradas não nomeadas que passam por alguma forma de substituição. Então, se o comando fosse $cmd e o valor do a variável cmd era /bin/ls e, em seguida, IFS seria usada para dividir em palavras o texto substituído. Mas:

  3. A divisão de palavras /bin/ls com / in IFS resulta em três palavras. o primeiro dos quais está vazio. A palavra vazia não pode ser usada como um comando, então isso causará algum tipo de erro, ao invés de tentar executar bin .

por 05.09.2016 / 04:05