πŸ₯·
Red Team Articles
Linktree
  • βš™οΈBinary Exploitation
    • PWN com 1 byte
    • GOT e PLT
    • Hook na GOT
  • 🌐Web
    • Mysql Case Sensitive Problems
    • Ruby: regex authentication bypass
    • CVE-2023-38964
  • πŸ“²Mobile
    • 🍎iOS Pentest
      • πŸ€–How to use Frida on iOS 17 without Jailbreak
      • πŸ’»Setup Lab
      • πŸ“¦Insecure Data Storage
        • Dump keychain datas
      • πŸ”™Server Side Vulnerabilities
        • Setup Proxy
        • Pentest on Server Side
      • βš™οΈClient Side Vulnerabilities
        • Account theft
        • Insecure Logging
      • πŸ–±οΈPasteboard & Clipboard
    • πŸ€–Android Pentest
      • AB - Android Backup
  • 🐳Docker
    • πŸšͺBackdooring docker container
    • πŸͺœDocker breakout
      • docker.sock
      • privileged flag
      • environments
    • 🏎️Docker assessment
      • Assessment with trivy
      • Assessment with docker bench security
    • πŸ›‘οΈDefenses
      • AppArmor
      • SecComp
      • Capabilities
      • Docker content trust
    • πŸ“–Namespaces
  • πŸ–₯️SSH Tricks
  • Network
    • VPN WireGuard com pfSense + RestAPI
Powered by GitBook
On this page
  • IntroduΓ§Γ£o
  • Agora vamos falar sobre GOT e PLT
  • BΓ΄nus:
  1. Binary Exploitation

GOT e PLT

PreviousPWN com 1 byteNextHook na GOT

Last updated 2 years ago

IntroduΓ§Γ£o

Quero te mostrar a base primeiro para depois vocΓͺ ver a real necessidade da GOT e PLT, seja muito bem vindo e boa leitura.

BinΓ‘rio EstΓ‘tico: executa por conta prΓ³pria, nΓ£o depende de libc nem nada, tudo que ele necessita ele mesmo tem BinΓ‘rio DinΓ’mico: necessita de algo para executar, como por exemplo da libc, vamos supor que meu binΓ‘rio apenas exibe uma mensagem na tela com o puts(), o puts nΓ£o fui eu que escrevi, ele estΓ‘ presente na libc, ou seja, para o meu programa funcionar eu preciso da libc, o linker faz o processo de linkagem da puts() com o meu programa

Mas o por que disso disso? Simples, imagine, se nΓ£o houvesse a libc o trabalho que seria escrever todas as funΓ§Γ΅es que conhecemos, e outra, imagina se houvesse uma atualizaΓ§Γ£o em alguma dessas funΓ§Γ΅es, TODOS os binΓ‘rios do mundo inteiro teriam que ser alterados, pois Γ©, a vida sem o libc seria Γ‘rdua. Com a libc tudo fica mais fΓ‘cil, houve uma atualizaΓ§Γ£o/modificaΓ§Γ£o? Basta alterar a libc, o linker vai continuar pegando as funΓ§Γ΅es e linkando com o seu binΓ‘rio.

Antes de prosseguir quero te mostrar que o binΓ‘rio Γ© dependente da libc (claro, se ele for dinΓ’mico, sendo sincero nunca vi uma binΓ‘rio estΓ‘tico, mas deve existir algum):

Na segunda linha vocΓͺ pode notar que hΓ‘ uma dependΓͺncia da libc, e na terceira linha temos o linker usado, acredite em mim, vocΓͺ nΓ£o vai querer apagar a sua libc, isso resultaria em um kernel panic provavelmente irreversΓ­vel, o ls cd etc, comandos do linux nΓ£o funcionariam mais, digo isso porque jΓ‘ apaguei a minha libc e mesmo com ela em mΓ£os colocando novamente no lugar que ela pertence atrΓ‘ves do windows, nΓ£o consegui mais acessar meu linux, resumo, tive que formatar o computador.

Enfim, vocΓͺ jΓ‘ viu sobre binΓ‘rios estΓ‘ticos e dinΓ’micos, agora vamos falar sobre o lazy binding, isso tem mais a ver com o linker Lazy Binding: irΓ‘ resolver os endereΓ§os, linka-los, apenas quando for chamado Isso ajuda em diversos fatores mas o principal deles: desempenho e tempo de compilaΓ§Γ£o menor, mas claro que irΓ‘ atrapalhar um pouco no desempenho do programa. Obs: se o RELRO estiver FULL, os endereΓ§os sΓ£o resolvidos antes da execuΓ§Γ£o e a GOT tem sua permissΓ£o setada apenas para read-only, o que impede qualquer tipo de hook

Agora vamos falar sobre GOT e PLT

Como fazemos para resolver os endereΓ§os, o que eu quero dizer Γ© que antes do programa ser executados nΓ£o temos o endereΓ§o da puts da libc por exemplo, isso vai ficar mais facil com exemplos.

Veja que no meu exemplo eu simplesmente printo na tela Hello World! Uso no meu cΓ³digo a puts(), funΓ§Γ£o da libc, nΓ£o fui eu que escrevi a puts, ela estΓ‘ presente na libc, eu estou apenas usando ela, como acessamos ela? Precisamos do endereΓ§o dela certo? Correto, mas como o linker faz isso em tempo de execuΓ§Γ£o veremos a seguir, vou explicar primeiro na teoria e depois vou explicar com exemplos.

A PLT (procedure linkage table) tem uma instruΓ§Γ£o de jmp que pula para a GOT (global offset table), o linker irΓ‘ resolver o endereΓ§o e mandarΓ‘ para .got.plt, resumindo: => PLT: Γ© responsΓ‘vel por armazenar o endereΓ§o que saltarΓ‘ para a GOT para ser resolvido => GOT: aqui temos os offsets das funΓ§Γ΅es presentes na libc, aqui tambΓ©m Γ© usado para chamar o linker para resolver o endereΓ§o => .got.plt: com o endereΓ§o resolvido ele Γ© armazenado na .got.plt

E depois? Simples, com o endereΓ§o jΓ‘ resolvido quando for chamar a mesma funΓ§Γ£o depois bastar chamar func@plt, a plt terΓ‘ um ponteiro para .got.plt que jΓ‘ terΓ‘ a funΓ§Γ£o, tentei ser o mais clarso possΓ­vel, vamos ver isso na prΓ‘tica em um binΓ‘rio de 32 bits, cujo o cΓ³digo Γ© aquele mencionado lΓ‘ em cima.

Veja na main+37 a chamada para puts@plt, vamos confirmar o endereΓ§o da PLT com o objdump:

Ele da um call justamente no 0x1040, perfeito atΓ© aqui, lembrando que estamos vendo isso antes de resolver o endereΓ§o, vamos dar uma olhado nesse endereΓ§o:

Perceba que em ebx+0xc terΓ‘ o nosso ponteiro para a funΓ§Γ£o puts, ele ainda nΓ£o estΓ‘ lΓ‘ porque nΓ£o executamos ainda a puts, vamos executar e ver isso

Eu coloquei um breakpoint bem depois da puts para que eu pudesse analisar, enfim, vemos que o endereΓ§o da puts@plt jΓ‘ mudou, vamos ver o que tem nele

Vamos com calma, no primeiro comando podemos ver que nΓ£o mudou muita coisa, mas perceba que ebx+0xc agora foi resolvido vamos ver o endereΓ§o que tem nele jΓ‘ que ele Γ© um ponteiro, ele estΓ‘ apontando para 0xf7e19c0, demos um x/5i que pega 5 instruΓ§Γ΅es do endereΓ§o, e nele estΓ‘ justamente a nossa puts, se vocΓͺ quiser dar um disas no endereΓ§o da puts() fique a vontade mas Γ© bem grandinho por isso peguei apenas 5 instruΓ§Γ΅es.

Se mesmo assim ficou confuso olhe esse pequeno exemplo:

BΓ΄nus:

Falamos sobre GOT, PLT e .got.plt mas o que elas sΓ£o? Elas sΓ£o sessΓ΅es, antes de sessΓ΅es temos segmentos, veja um simples mapa:

Outras seΓ§Γ΅es interessantes: => .symtab: Essa seΓ§Γ£o guarda todos os simbolos internos e externos => .dynsym: Essa seΓ§Γ£o guarda todos os simbolos externos *Ex: na dynsym tem o simbolo do printf [ printf(β€œoi”); ] …: na symtab tem o simbolo da main [ int main(){return 0} ]

βš™οΈ
BinΓ‘rio dependente da libc
CΓ³digo simples para usar de exemplo
Disas main()
Objdump puts()
Disas puts()
Analisando puts()
Analisando puts()
Exemplo 1
Exemplo 2