Jump to content

thiago

Membros
  • Content Count

    11
  • Joined

  • Last visited

Community Reputation

1 Neutral

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

  1. Esta live tem como objetivo ser um bate-papo para discutir alguns fundamentos para quem quiser aprender x86 Assembly. Vai acontecer online no canal Papo Binário! https://www.youtube.com/c/PapoBinário/live
  2. Gostei da dica, cara. Só queria colaborar com a ferramenta GodBolt. Você coloca o código em C e ele mostra o código em Assembly correspondente.
  3. Huahuahuahauhauhauha! Nossa, cara! Que confusão! Mas isso é natural, estamos falando de ponteiros, né? Sim, sim, esse lance de falar que não é ponto flutuante me confundiu todo. Em x86_64, um ponteiro tem o tamanho de um long ou long long (no x86_64) e long long (no x86). Abração!
  4. Acho que a gente não tá conseguindo se entender, cara. Por exemplo, a sua definição de que o tamanho do endereço vai ter o tamanho de um inteiro é inválida no caso do x86_64. Como o @Fernando Mercês disse, o tamanho de um endereço numa arquitetura de 64 bits é 64 bits. Compila e testa isso (no x86_64): #include <stdio.h> int main() { printf("%zu %zu\n", sizeof(void *), sizeof(int)); return 0; } Você vai ver que sizeof(void *) é 8 e sizeof(int) é 4. Acho que você está confundindo um pouco as coisas. O que você está dizendo sobre o endereço do dado ter o tamanho do tipo apontado não é verdade. Numa arquitetura de 64 bits, se um ponteiro aponta pra um char, o tamanho do ponteiro é 64 bits; se ele aponta pra um short, int, long, float, double, o tamanho do ponteiro continua sendo 64 bits. A melhor maneira de ver isso é testando no próprio código.
  5. Acho que eu viajei um pouco nisso, hehehe. Valeu de novo por compartilhar com a galera. Eu estou bolando uma apresentação sobre isso e esse material vai servir pra caramba.
  6. Não entendi qual foi sua dúvida sobre a palavra. A dúvida é sobre o conceito de palavra? Eu rodei seu código aqui na minha máquina, modifiquei e aproveitei pra montar este esquema pra simplificar. O tamanho do ponteiro (tamanho do endereço) é o mesmo pra qualquer que seja o tipo (char, short, int, long, etc.). Você simplesmente obteve o tamanho de *teste, que é o mesmo tamanho de teste[0], que é o mesmo tamanho de um char, que possui o tamanho de 1 byte. Se ligue que são duas coisas diferentes: tamanho do endereço é uma coisa e tamanho do conteúdo apontado por aquele endereço é outra. Abraços!
  7. Lembrando pra galera que a syscall é uma instrução que foi introduzida no x86_64. Se forem mudar, não esqueçam de ver as mudanças dos registradores de acordo com a ABI do x86_64: RAX (número da syscall); RDI (primeiro parâmetro da syscall); RSI (segundo parâmetro da syscall); RDX (terceiro parâmetro da syscall); R10 (quarto parâmetro da syscall); R8 (quinto parâmetro da syscall); R9 (sexto parâmetro da syscall). O número das syscalls também mudou. Vocês podem ver a lista aqui: http://blog.rchapman.org/posts/Linux_System_Call_Table_for_x86_64/
  8. Pô, valeu por compartilhar isso. Eu baixei aqui pra olhar mais tarde. Eu não entendi muito bem a parte que ele fala Na verdade, acho que os ataques de buffer overflow não podem mudar este valor, pois se mudarem, o stack smashing vai ser detectado e o ataque não terá sucesso.
  9. E aí, cara? Gostei muito do que escreveu. Parabéns pela iniciativa de passar um assunto bem chato de maneira divertida. Se me permite, gostaria de te dar uns toques sobre o que você escreveu. Cuidado com a diferença sutil entre endereço de memória e conteúdo da memória naquele endereço. O ponteiro não tem o tamanho de um int; na verdade, o ponteiro tem o tamanho de uma palavra (normalmente está relacionada ao tamanho do registrador). Na arquitetura x86, o tamanho da palavra é 32 bits e o tamanho de um int também, porém isso não é verdade para a arquitetura x86_64. O tamanho da palavra é 64 bits e o tamanho de um int é 32 bits. Cuidado também com esse lance de "ao apontar para um dado, o tamanho do ponteiro terá o mesmo tamanho do dado". O tamanho de um ponteiro é o mesmo, esteja ele apontando para um char, short, int, long, etc. Em todos os casos, o ponteiro terá o tamanho da palavra. #include <stdio.h> int main(void) { printf("%zu\n", sizeof(char *)); printf("%zu\n", sizeof(short *)); printf("%zu\n", sizeof(int *)); printf("%zu\n", sizeof(long *)); printf("%zu\n", sizeof(long long *)); return 0; } Se você compilar e executar esse código no x86_64, vai ver que todos os resultados vão ser 8, mas se você executar no x86, os resultados vão ser 4. Aí você pode estar se perguntando sobre a relevância dos tipos nos ponteiros. Pra responder isso, ser liga nesse trecho de código: int main(void) { char num1; short num2; int num3; void *ptr = &num1; *(char *) ptr = 100; ptr = &num2; *(short *) ptr = 100; ptr = &num3; *(int *) ptr = 100; return 0; } Agora se liga no código Assembly correspondente: main: push ebp mov ebp, esp sub esp, 16 lea eax, [ebp-5] mov DWORD PTR [ebp-4], eax mov eax, DWORD PTR [ebp-4] mov BYTE PTR [eax], 100 lea eax, [ebp-8] mov DWORD PTR [ebp-4], eax mov eax, DWORD PTR [ebp-4] mov WORD PTR [eax], 100 lea eax, [ebp-12] mov DWORD PTR [ebp-4], eax mov eax, DWORD PTR [ebp-4] mov DWORD PTR [eax], 100 mov eax, 0 leave ret Tá vendo esses "mov BYTE PTR [eax], 100", "mov WORD PTR [eax], 100" e "mov DWORD PTR [eax], 100"? Tá ligado nesses prefixos BYTE, WORD e DWORD? Um char tem o tamanho de 1 byte (BYTE), um short tem o tamaho de 2 bytes (ou uma WORD) e um int tem o tamanho de 4 bytes (ou uma DWORD). A questão do tipo só serve pra informar pra o compilador a quantidade de memória em bytes que será carregada em um registrador ou a quantidade de bytes de um registrador que será armazenada em um determinado endereço de memória. Observe que na parte onde eu faço a atribuição dos endereços de memória para a variável ptr, os prefixos são DWORD (veja todos os mov DWORD PTR [ebp-4], eax). Isso confirma o que eu te falei sobre o tamanho do ponteiro ser o mesmo para qualquer tipo. No caso, o tamanho do ponteiro é DWORD, logo podemos concluir que o tamanho da palavra é 32 bits. Espero que eu não tenha complicado demais. Abraços!
  10. Boa, cara! Eu vou testar mais tarde. Valeu por compartilhar.
×
×
  • Create New...