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 / 474028
Accepted
John P
John P
Asked: 2018-10-09 08:01:11 +0800 CST2018-10-09 08:01:11 +0800 CST 2018-10-09 08:01:11 +0800 CST

Por que algumas bibliotecas e outras partes se repetem na memória virtual do linux com gdb?

  • 772

insira a descrição da imagem aqui

Este é o resultado de olhar para a memória virtual de um processo em gdb; Tenho algumas dúvidas sobre isso:

  1. Por que algumas partes da memória virtual são repetidas? Por exemplo, nosso programa (stack6) e biblioteca libc são repetidos 4 vezes; se eles os dividiram em partes diferentes, então por quê? Por que não apenas colocá-los todos juntos?

  2. O caminho superior (/opt/pro...) é a seção de instruções (seção de texto) da nossa memória virtual e contém apenas as instruções?

  3. Por que os tamanhos das 4 libc's são diferentes? Qual é o problema com o deslocamento, se já temos o tamanho e o endereço inicial, para que serve o deslocamento?

  4. Onde estão as seções de dados, bss, kernel e heap e por que algumas partes da imagem acima não têm informações sobre elas? Existe alguma opção melhor no gdb que realmente mostre todas as partes?

  5. Existe algum programa melhor que o gdb que mostre muito melhor a parte da memória virtual do nosso processo? Eu só quero ter um bom visual de uma memória virtual real, qual programa de depuração fornece o melhor resultado.

As seções que mencionei:

insira a descrição da imagem aqui

linux process
  • 1 1 respostas
  • 1641 Views

1 respostas

  • Voted
  1. Best Answer
    Stephen Kitt
    2018-10-09T08:08:02+08:002018-10-09T08:08:02+08:00

    Há uma informação importante faltando na gdbsaída de 's: as permissões das páginas. (Eles são mostrados no Solaris e no FreeBSD , mas não no Linux.) Você pode vê-los olhando para /proc/<pid>/maps; os mapas para seu exemplo de Protostar mostram

    $ cat /proc/.../maps
    08048000-08049000 r-xp 00000000 00:0f 2925       /opt/protostar/bin/stack6
    08049000-0804a000 rwxp 00000000 00:0f 2925       /opt/protostar/bin/stack6
    b7e96000-b7e97000 rwxp 00000000 00:00 0
    b7e97000-b7fd5000 r-xp 00000000 00:0f 759        /lib/libc-2.11.2.so
    b7fd5000-b7fd6000 ---p 0013e000 00:0f 759        /lib/libc-2.11.2.so
    b7fd6000-b7fd8000 r-xp 0013e000 00:0f 759        /lib/libc-2.11.2.so
    b7fd8000-b7fd9000 rwxp 00140000 00:0f 759        /lib/libc-2.11.2.so
    b7fd9000-b7fdc000 rwxp 00000000 00:00 0
    b7fe0000-b7fe2000 rwxp 00000000 00:00 0
    b7fe2000-b7fe3000 r-xp 00000000 00:00 0          [vdso]
    b7fe3000-b7ffe000 r-xp 00000000 00:0f 741        /lib/ld-2.11.2.so
    b7ffe000-b7fff000 r-xp 0001a000 00:0f 741        /lib/ld-2.11.2.so
    b7fff000-b8000000 rwxp 0001b000 00:0f 741        /lib/ld-2.11.2.so
    bffeb000-c0000000 rwxp 00000000 00:0f 0          [stack]
    

    (O exemplo Protostar é executado em uma VM que é fácil de hackear, presumivelmente para tornar os exercícios tratáveis: não há proteção NX e nem ASLR.)

    Você verá acima que o que parece ser mapeamentos repetidos na gdbverdade corresponde a mapeamentos diferentes com permissões diferentes. O segmento de texto é mapeado como somente leitura e executável; o segmento de dados é mapeado como somente leitura; O BSS e o heap são mapeados para leitura e gravação. Idealmente, o segmento de dados, BSS e heap não são executáveis, mas este exemplo não tem suporte a NX, então eles são executáveis. Cada biblioteca compartilhada obtém seu próprio mapeamento para seu segmento de texto, segmento de dados e BSS. O quarto mapeamento é um segmento não legível, não gravável e não executável normalmente usado para proteger contra estouros de buffer (embora, dada a idade do kernel e da biblioteca C usada aqui, isso possa ser algo diferente).

    O deslocamento, quando fornecido, indica o deslocamento dos dados dentro do arquivo, o que não necessariamente tem muito a ver com sua posição no espaço de endereço. Quando carregado, está sujeito a restrições de alinhamento; por exemplo, libc-2.11.2.soos cabeçalhos de programa de ' especificam dois cabeçalhos “LOAD”:

    Type           Offset   VirtAddr   PhysAddr   FileSiz  MemSiz   Flg Align
    LOAD           0x000000 0x00000000 0x00000000 0x13d2f4 0x13d2f4 R E 0x1000
    LOAD           0x13e1cc 0x0013f1cc 0x0013f1cc 0x027b0  0x0577c  RW  0x1000
    

    (Use readelf -lpara ver isso.)

    Isso pode resultar em vários mapeamentos no mesmo deslocamento, com endereços virtuais diferentes, se as seções mapeadas para os segmentos tiverem sinalizadores de proteção diferentes. No stack6caso de:

    Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
    LOAD           0x000000 0x08048000 0x08048000 0x00604 0x00604 R E 0x1000
    LOAD           0x000604 0x08049604 0x08049604 0x00114 0x00128 RW  0x1000
    

    (Isso também explica o tamanho pequeno mostrado por proc info mappingsfor stack6: cada cabeçalho solicita menos de 4KiB, com um alinhamento de 4KiB, então ele obtém dois mapeamentos de 4KiB com o mesmo deslocamento em endereços diferentes.)

    Mapeamentos em branco correspondem a mapeamentos anônimos; veja man 5 procpara detalhes. Você precisaria entrar mmappara gdbdeterminar a que eles correspondem.

    Você não pode ver os mapeamentos do kernel (além do legado vsyscallem algumas arquiteturas) porque eles não importam da perspectiva do processo (eles são inacessíveis).

    Não conheço gdbopção melhor, sempre uso /proc/$$/maps.

    Consulte Como os programas são executados: binários ELF para obter detalhes do formato ELF conforme lido pelo kernel e como ele é mapeado para alocações de memória; tem ponteiros para muito mais material de referência.

    • 6

relate perguntas

  • Existe uma maneira de fazer ls mostrar arquivos ocultos apenas para determinados diretórios?

  • 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

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