Você não pode personalizar a saída de uname
, mas pode falsificar o instalador fazendo o sistema executar um script personalizado em vez do "real" /bin/uname
.
Primeiro, você precisará verificar o comando exato que o instalador está executando para verificar as informações do seu sistema; neste exemplo, por uma questão de facilidade, vou fingir que um executável ~/tmp/check
está executando uname -n
e que a saída de uname -n
deve ser ubuntu
para que ~/tmp/check
imprima "Passado!". / p>
A fonte de
~/tmp/check
(isso, obviamente, não é relevante, e serve apenas para mostrar o que o executável de teste faz):
#include <stdio.h>
#include <string.h>
#define MAX_STRING_LENGTH 32
int main(void) {
FILE* output = popen("/bin/uname -n", "r");
char expected[] = "ubuntu";
char hostname[MAX_STRING_LENGTH];
fgets(hostname, MAX_STRING_LENGTH, output);
pclose(output);
if(hostname[strlen(hostname) - 1] == '\n')
hostname[strlen(hostname) - 1] = 'user@debian:~/tmp$ uname -n
debian
user@debian:~/tmp$ ./check
user@debian:~/tmp$
';
if(strcmp(expected, hostname) == 0) {
printf("Passed!\n");
return 0;
}
return 1;
}
user@debian:~/tmp$ strace -f ./check 2>&1 > /dev/null | grep execve
execve("./check", ["./check"], [/* 34 vars */]) = 0
[pid 13122] execve("/bin/sh", ["sh", "-c", "/bin/uname -n"], [/* 34 vars */] <unfinished ...>
[pid 13122] <... execve resumed> ) = 0
[pid 13123] execve("/bin/uname", ["/bin/uname", "-n"], [/* 34 vars */]) = 0
É fácil rastrear o comando exato executado pelo executável usando strace
:
#!/bin/bash
echo ubuntu
exit 0
Portanto, para contornar este, deve-se fazer uname -n
output ubuntu
: a solução mais fácil seria mover /bin/uname
e criar um link simbólico /bin/uname
vinculando a um script personalizado (que ignorará qualquer argumento e apenas a saída ubuntu
):
cat ~/tmp/spoofer.sh
:
user@debian:~/tmp$ sudo mv /bin/uname /bin/uname1
user@debian:~/tmp$ sudo ln -s ~/tmp/spoofer.sh /bin/uname
user@debian:~/tmp$ uname -n
ubuntu
user@debian:~/tmp$ ./check
Passed!
user@debian:~/tmp$
Vamos ver se funcionou:
#include <stdio.h>
#include <string.h>
#define MAX_STRING_LENGTH 32
int main(void) {
FILE* output = popen("/bin/uname -n", "r");
char expected[] = "ubuntu";
char hostname[MAX_STRING_LENGTH];
fgets(hostname, MAX_STRING_LENGTH, output);
pclose(output);
if(hostname[strlen(hostname) - 1] == '\n')
hostname[strlen(hostname) - 1] = 'user@debian:~/tmp$ uname -n
debian
user@debian:~/tmp$ ./check
user@debian:~/tmp$
';
if(strcmp(expected, hostname) == 0) {
printf("Passed!\n");
return 0;
}
return 1;
}
Bingo! (lembre-se de remover /bin/uname
e mover /bin/uname1
de volta para /bin/uname
depois: sudo rm /bin/uname && sudo mv /bin/uname1 /bin/uname
)