Supporter - Nibble Fabiano Furtado Posted June 11, 2019 at 09:43 PM Supporter - Nibble Share Posted June 11, 2019 at 09:43 PM Pessoal, preciso de uma ajuda com o GDB depurando arquivos binários stripped. Fiz um "Hello World!" básico em C, compilei ele com "gcc -Wall -z noseparate-code hw64.c -o hw64" e logo em seguida executei um sstrip em cima do binário. O parâmetro "-z noseparate-code" foi usado pra deixar o binário menor (leia o man deste parâmetro). Em tempo, o gcc compilou o binário com PIE habilitado, ou seja, a cada execução o SO aloca o programa em um endereço de memória diferente. Eu consegui fazer a depuração no GDB, mas precisei usar o Ghidra para descobrir os offsets do binário, uma vez que o objdump com o binário sstrip não mostra nada. Para isso, executei o GDB (estou usando a versão 8.3 com o peda 1.1): * starti --> ele executa a primeira instrução, no caso, uma instrução da lib ld-linux * info proc mappings --> para saber qual endereço de memória o programa foi alocado devido ao ASLR * breakpoint na main() --> depois de ter obtido o offset desta função com o Ghidra + informação do endereço de memória * continue --> fim da depuração Alguém conhece alguma técnica melhor que não precise do Ghidra (ou outro disassembly) para obtermos os offsets das funções? Desde já, agradeço. Link to comment Share on other sites More sharing options...
Administrators Fernando Mercês Posted June 12, 2019 at 01:24 AM Administrators Share Posted June 12, 2019 at 01:24 AM Só vai ao ar no próximo sábado, mas tentei responder em vídeo. ? Qualquer dúvida posta aí. Se não funcionar a gente busca outro jeito. Abraço! Link to comment Share on other sites More sharing options...
Supporter - Nibble Fabiano Furtado Posted June 12, 2019 at 01:26 PM Author Supporter - Nibble Share Posted June 12, 2019 at 01:26 PM 12 horas atrás, Fernando Mercês disse: Só vai ao ar no próximo sábado, mas tentei responder em vídeo. ..... Qualquer dúvida posta aí. Se não funcionar a gente busca outro jeito. Abraço! Fernando, obrigado pelo video! Não conhecia essa "info files". Com certeza ajudará MUITO!! Valeu!!! Link to comment Share on other sites More sharing options...
Administrators Fernando Mercês Posted June 12, 2019 at 04:39 PM Administrators Share Posted June 12, 2019 at 04:39 PM É nóis. Aproveitando, eu tive a ideia de extender o PEDA pra já tratar esses casos. Você - e quem mais quiser - poderia testar antes de eu enviar um possível patch pros caras? Meu fork tá em https://github.com/merces/peda Basicamente é carregar o binário, mesmo com símbolos removidos, e comandar start. Tem que parar na main() automagicamente. hehe Abraço! Link to comment Share on other sites More sharing options...
Supporter - Nibble Fabiano Furtado Posted June 13, 2019 at 08:15 PM Author Supporter - Nibble Share Posted June 13, 2019 at 08:15 PM Oi Fernando... vou testar sim, mas tem que ser amanhã. Legal essa iniciativa! Vou lhe dar um retorno em breve. Bom... testei esse comando "info files" que você mencionou no video e deu certo, mas deu errado! ? "Stripando" o binário com o strip, funciona, mas com o sstrip, não. O sstrip é um utilitário que vem no pacote elfkickers (http://www.muppetlabs.com/~breadbox/software/elfkickers.html). Enfim... parece que ele retira mais coisas do binário e o "info files" não consegue identificar o entry point. Usei o "readelf -a" para comparar e analisar os dois binários e não há nehhuma informação sobre os Section Headers no arquivo gerado pelo sstrip. Só para efeito comparativo, com o strip, o meu binário ficou com 6160 bytes. Com o sstrip ficou com 4144! Neste caso, há algum outro comando que possa ser usado no GDB? Valeu! Link to comment Share on other sites More sharing options...
Administrators Fernando Mercês Posted June 14, 2019 at 04:22 PM Administrators Share Posted June 14, 2019 at 04:22 PM Opa! É, esse sstrip macabro remove o section header também, além de outras coisas. O GDB se perde, coitado. O que dá pra fazer é pegar o entrypoint no cabeçalho (com o readelf/objdump) e seguir o mesmo esquema: $ readelf -h hello.elf | grep Entry Entry point address: 0x401040 Mas dentro do GDB acho que não. Vou ver se consigo deixar o PEDA preparado pra isso. ? Abraço! Link to comment Share on other sites More sharing options...
Supporter - Nibble Fabiano Furtado Posted June 14, 2019 at 08:10 PM Author Supporter - Nibble Share Posted June 14, 2019 at 08:10 PM Fernando... encontrei uma maneira de se fazer isso em https://reverseengineering.stackexchange.com/questions/19598/find-base-address-and-memory-size-of-program-debugged-in-gdb Combinando essa informação do Entry Point do cabeçalho e os comandos starti, info inferior e shell pmap -x <PID>, dá pra se chegar na _start ou main(). Valeu! Link to comment Share on other sites More sharing options...
Supporter - Nibble Fabiano Furtado Posted June 14, 2019 at 08:23 PM Author Supporter - Nibble Share Posted June 14, 2019 at 08:23 PM Em 12/06/2019 em 13:39, Fernando Mercês disse: É nóis. Aproveitando, eu tive a ideia de extender o PEDA pra já tratar esses casos. Você - e quem mais quiser - poderia testar antes de eu enviar um possível patch pros caras? Meu fork tá em https://github.com/merces/peda Basicamente é carregar o binário, mesmo com símbolos removidos, e comandar start. Tem que parar na main() automagicamente. hehe Abraço! Fiz o teste com o seu PEDA, copiando o peda.py para o diretório do meu peda. Não deu muito certo. O resultado foi esse: $ gdb ./helloworld GNU gdb (GDB) 8.3 Copyright (C) 2019 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-pc-linux-gnu". Type "show configuration" for configuration details. For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>. Find the GDB manual and other documentation resources online at: <http://www.gnu.org/software/gdb/documentation/>. For help, type "help". Type "apropos word" to search for commands related to "word"... Reading symbols from ./helloworld... (No debugging symbols found in ./helloworld) gdb-peda$ start No unwaited-for children left. Display various information of current execution context Usage: context [reg,code,stack,all] [code/stack length] gdb-peda$ O que estou fazendo de errado? Valeu. Link to comment Share on other sites More sharing options...
Administrators Fernando Mercês Posted June 15, 2019 at 12:16 AM Administrators Share Posted June 15, 2019 at 12:16 AM Provavelmente é bug haha anexa o binário aqui que eu vejo? ? Abraço e obrigado pelos testes! Link to comment Share on other sites More sharing options...
Supporter - Nibble Fabiano Furtado Posted June 17, 2019 at 04:21 PM Author Supporter - Nibble Share Posted June 17, 2019 at 04:21 PM Em 14/06/2019 em 21:16, Fernando Mercês disse: Provavelmente é bug haha anexa o binário aqui que eu vejo? ? Abraço e obrigado pelos testes! Segue o programa e o binário. /* * GCC 8.3.0: gcc -Wall -s -O2 helloworld.c -o helloworld */ #include<stdio.h> int main(void) { puts("Hello World!"); return 0; } helloworld Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.