O que você descreve é um recurso anti-exploração chamado Randomização de Layout de Espaço de Endereço (ASLR). Basicamente, o kernel coloca o endereço muito superior da pilha de chamadas de função de um programa em um endereço um pouco diferente ("aleatório") toda vez que o kernel carrega o arquivo ELF do programa do disco. Os endereços em argv
e as variáveis de ambiente, das quais seu shellcode é um, terminam em um endereço variável com cada chamada de programa.
O ASLR deve dificultar a exploração de buffer overflows e outras vulnerabilidades relacionadas à pilha. O explorador tem que escrever código ou fazer algo para explicar os endereços variáveis de variáveis e valores na pilha de chamadas de função.
Parece que você pode desativar o ASLR fazendo algo como:
echo 0 > /proc/sys/kernel/randomize_va_space
como o usuário root. Como você explícita cita o Ubuntu, o comando acima é diferente:
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space