AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 453749
Accepted
Evan Carroll
Evan Carroll
Asked: 2018-07-06 13:50:35 +0800 CST2018-07-06 13:50:35 +0800 CST 2018-07-06 13:50:35 +0800 CST

O que define fs:[0x28] (pilha canário)?

  • 772

A partir deste post é mostrado que FS:[0x28]é um stack-canary. Estou gerando esse mesmo código usando o GCC nesta função,

void foo () {
    char a[500] = {};
    printf("%s", a);
}

Especificamente, estou recebendo esta montagem ..

    0x000006b5      64488b042528.  mov rax, qword fs:[0x28]                ; [0x28:8]=0x1978 ; '(' ; "x\x19"
    0x000006be      488945f8       mov qword [local_8h], rax
...stuff...
    0x00000700      488b45f8       mov rax, qword [local_8h]
    0x00000704      644833042528.  xor rax, qword fs:[0x28]
    0x0000070d      7405           je 0x714
    0x0000070f      e85cfeffff     call sym.imp.__stack_chk_fail           ; void __stack_chk_fail(void)
    ; CODE XREF from 0x0000070d (sym.foo)
    0x00000714      c9             leave
    0x00000715      c3             ret

O que está configurando o valor de fs:[0x28]? O kernel, ou o GCC está lançando o código? Você pode mostrar o código no kernel ou compilado no binário que define fs:[0x28]? O canário é regenerado - na inicialização ou no processo de geração? Onde isso está documentado?

linux security
  • 2 2 respostas
  • 7143 Views

2 respostas

  • Voted
  1. Best Answer
    Danila Kiver
    2018-07-06T18:02:54+08:002018-07-06T18:02:54+08:00

    É fácil rastrear essa inicialização, pois (quase) todos os processos stracemostram uma syscall muito suspeita durante o início da execução do processo:

    arch_prctl(ARCH_SET_FS, 0x7fc189ed0740) = 0
    

    É o que man 2 arch_prctldiz:

       ARCH_SET_FS
              Set the 64-bit base for the FS register to addr.
    

    Eba, parece que é disso que precisamos. Para encontrar quem chama arch_prctl, vamos procurar um backtrace:

    (gdb) catch syscall arch_prctl
    Catchpoint 1 (syscall 'arch_prctl' [158])
    (gdb) r
    Starting program: <program path>
    
    Catchpoint 1 (call to syscall arch_prctl), 0x00007ffff7dd9cad in init_tls () from /lib64/ld-linux-x86-64.so.2
    (gdb) bt
    #0  0x00007ffff7dd9cad in init_tls () from /lib64/ld-linux-x86-64.so.2
    #1  0x00007ffff7ddd3e3 in dl_main () from /lib64/ld-linux-x86-64.so.2
    #2  0x00007ffff7df04c0 in _dl_sysdep_start () from /lib64/ld-linux-x86-64.so.2
    #3  0x00007ffff7dda028 in _dl_start () from /lib64/ld-linux-x86-64.so.2
    #4  0x00007ffff7dd8fb8 in _start () from /lib64/ld-linux-x86-64.so.2
    #5  0x0000000000000001 in ?? ()
    #6  0x00007fffffffecef in ?? ()
    #7  0x0000000000000000 in ?? ()
    

    Assim, a base do segmento FS é definida pelo ld-linux, que faz parte de glibc, durante o carregamento do programa (se o programa estiver vinculado estaticamente, esse código será incorporado ao binário). É aqui que tudo acontece.

    Durante a inicialização, o carregador inicializa o TLS . Isso inclui alocação de memória e configuração do valor base do FS para apontar para o início do TLS. Isso é feito via arch_prctl syscall . security_init Depois que a função de inicialização TLS é chamada, o que gera o valor do protetor de pilha e o grava no local da memória, que fs:[0x28]aponta para:

    • Inicialização do valor de guarda de pilha
    • Gravação de valor de guarda de pilha , mais detalhada

    E 0x28é o deslocamento do stack_guardcampo na estrutura que está localizado no início do TLS.

    • 25
  2. ErikF
    2018-07-06T17:03:57+08:002018-07-06T17:03:57+08:00

    O que você está vendo é chamado (no GCC) de Stack Smashing Protector (SSP) , que é uma forma de proteção contra estouro de buffer gerada pelo compilador. O valor é um número aleatório gerado pelo programa na inicialização e como o artigo da Wikipedia menciona, é colocado em Thread Local Storage (TLS) . Outros compiladores podem usar estratégias diferentes para implementar esse tipo de proteção.

    Por que armazenar o valor em TLS? Como o valor está localizado lá, seu endereço não é acessível pelos registradores CS, DS e SS, tornando muito difícil adivinhar o valor armazenado se você estiver tentando alterar a pilha de código malicioso.

    • 6

relate perguntas

  • Inicie/pare o serviço systemd usando o atalho de teclado [fechado]

  • Necessidade de algumas chamadas de sistema

  • astyle não altera a formatação do arquivo de origem

  • Passe o sistema de arquivos raiz por rótulo para o kernel do Linux

  • Existe um daemon syslog que implementa RFC 5848 "Signed Syslog Messages"?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve