Ir para conteúdo

Leandro Fróes

Apoiadores
  • Total de itens

    48
  • Registro em

  • Última visita

Reputação

13 Good

3 Seguidores

Sobre Leandro Fróes

Últimos Visitantes

336 visualizações
  1. Qual faculdade fazer?

    Entendi... o que você curte no geral? Na MINHA opinião a faculdade nunca da o suficiente saca, até porque é impossível (e isso independe do curso). Tendo isso em mente os dois únicos filtros que você pode aplicar é ver se a grade agrada e/ou perguntar pra pessoas que fazem Ciência o que elas acham, como é o dia a dia etc, mas tenha em mente que estudar por fora sempre será necessário.
  2. Qual faculdade fazer?

    Bom dia mano! Assim, acho que muito mais valiosa do que nossa opinião é onde você pretende chegar fazendo uma ou outra. Que tal abrir 2 abas no navegador, com as duas grades e ver a que ti agrada mais? Até porque não sei bem o que você curte etc. A distância acaba sendo quase irrelevante pois fazer uma faculdade com matérias que não ti agradam se torna mais cansativa que uma mais distante, porém com matérias mais agradáveis abs
  3. Iniciante em Debugger

    http://ref.x86asm.net/ Na internet você acha MUITA coisa também, qualquer coisa tem o manual da Intel que tem uma parte enorme do livro só sobre as instruções.
  4. Endianness

    Boa noite!! Hoje estava lendo um dos artigos da coluna "Fundamentos da Computação Ofensiva" na revista da h2 e me deparei com um trecho de código bem bacana, ele é bem simples e explica bastante coisa (méritos do Ygor e do Gabriel). Minha intenção aqui não é explicar ordenação de bytes, acho que o artigo explicou muito bem isso, vou apenas falar de uma única linha de código (de acordo com o meu entendimento) e como ela pode ser útil. O código é esse aqui: #include <stdio.h> int main(){ int x = 1; if(*(char *)&x == 1) printf("Little Endian!!\n"); else printf("Big endian!!"); return 0; } root@user:/home/codes# ./teste Little Endian!! A ideia é testar o endianness (ordenação) dos bytes. O que está rolando no código acima? Assumindo um inteiro de 32 bits atribuimos o valor 1 à ele. Dentro do condicional IF acontece a seguinte mágica: converte o endereço de x (que é de um inteiro) para o endereço de um char e o operador * que precede o casting (char*) diz que estamos apontando para o conteúdo daquele endereço e SE o valor que estamos apontando for 1, é Little Endian. Pera, que? Blz, para entender a linguagem decidi fazer um código bem newbie pra mostrar números e ver o que está acontecendo no código acima: #include <stdio.h> int main(){ int x = 1; printf("Valor de x: %d\n", x); int y = *(char *)&x; printf("Valor de y: %d\n", y); char *p = (char *)&x; printf("Valor apontado por p: %d\n", *p); return 0; } root@user:/home/codes# ./teste Valor de x: 1 Valor de y: 1 Valor apontado por p: 1 O que podemos notar aqui (assumindo de fato que é little endian) é que na declaração do ponteiro para char p que toda essa mágica é meramente um casting no endereço da variável. Note que em y fiz toda a linha do código e o valor deu realmente 1, mas em p tirei o primeiro * e mantive apenas o casting de fato, com isso imprimi o valor apontado pelo ponteiro p que recebeu o endereço com o casting e deu 1 também!! Ok, mas até agora não entendi o endianness. A sacada é que se for Little Endian os bits no endereço de x estariam dessa forma: 00000000 00000000 00000000 00000001, com o casting do endereço para um tipo char nós limitamos o teste para apenas a célula da direta e SE esta célula de oito bits possuir o valor 1 (que é o caso) será little endian, pois neste os bytes menos significativos são codificados primeiro. Caso neste teste o valor seja diferente de 1 (no caso zero) é porque é Big Endian pois neste os bytes mais significativos (da esquerda) são codificados primeiro. Esse assunto deve ser bem simples pra maioria de vocês, mas eu curto ler sobre coisas simples e ver o quão essenciais são, espero não ter sido confuso e me corrijam qualquer besteira que escrevi. Caso tenha uma visão diferente por favor, me dê um toque, gostaria de saber mais sobre. Abraços!
  5. Vale a pena "gastar tempo" para aprender e fazer um site ?

    Boa tarde! Então... acho que nada é perda de tempo quando o assunto é estudar, sempre irá ti acrescentar algo saca. Agora como você não pretende trabalhar com isso aconselho usar um WordPress ou até mesmo o Github pra fazer um blog e postar seus feitos. Abraços!
  6. Teria como alguem me da uma dica fazendo favor?

    Isso depende de muita coisa, mas assumindo que você queira apenas algo leve: você tem familiaridade com Linux? Se sim, eu aconselho o Debian, se não, Ubuntu. O Ubuntu é mais simples tanto instalação quanto manuseio (mas acaba sendo mais pesado que o Debian). Sobre o Mint eu não sei, nunca usei. Abraços!!
  7. Senha forte

    kkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
  8. DLL Hijacking / DLL MITM (Man in The Middle)

    Legal pra caramba esse post mano, cai justamente no que estou estudando. Obrigado pela referência, não tenho tido tanto tempo pra finalizar o tutorial, mas assim que o fizer será justamente sobre directories e sections, será um prazer ter sua leitura. Abraços!!
  9. Sou novo e estou perdido.

    Acho que antes de qualquer coisa vc precisa decidir o que gosta MAIS, independente se tudo eh legal, nao da pra saber tudo saca.
  10. Sou novo e estou perdido.

    Certo... vou explicar as operações que sei que são: AND, OR, XOR e NOT. O que elas fazem é exatamente isto que o nome sugere, mas vamos aos exemplos: Pense em binário e atribua 1 como verdadeiro e 0 como falso e olhe para o seguinte circuito (sim, bem artístico): 0 --------| |-------- - ? 1 --------| Temos aqui o 0 em cima e o 1 em baixo. A operação AND diz que só podemos "passar" se OS DOIS forem verdadeiros, então ali qual o resultado? Zero!! Pois se perguntarmos "Ele passa?" A resposta seria não, pois apenas um bit é 1 ali. Aqui está uma linha desta tabela: 0 | 1 | 0 onde 0 AND 1 resulta em 0. A operação OR, ao contrário da AND permite passar se ao menos um dos dois bits ali de cima foram 1, entenda que será 1 o resultado se "ou um ou outro" forem verdadeiros. Ali passaria então, certo? E se fosse 0 | 0 ? Não passaria, afinal ambos são falsos. A operação XOR significa Exclusive OR, ou seja, só passará se tiver APENAS UM (considerando os dois bits do exemplo) dos bits como verdadeiros. Com isto, 0 | 0 ou 1 | 1 resultarão em 0. A operação NOT simplesmente inverte os bits, o que é 0 vira 1 e o que é 1 vira 0. Talvez a aplicabilidade disso seja algo complicado pra quem está começando, mas temos que ter em mente que o processador "só entende" sinais elétricos, né? Considerando o 0 como "não tem sinal" e o 1 como "tem sinal" podemos dizer o que quisermos para o processador. Um processador pode ler o número 255 se passarmos a seguinte sequência para ele: 11111111, ou seja, 8 "sinais", mas e se ele quiser ler o número zero? Terá que passar vários bits com 0 ? Não! A operação NOT pode ser usada em cima destes 8 bits e economizar tempo Por mais que o exemplo esteja fraquinho espero que tenha clareado um pouco a importância das operações e da notação binária na computação.
  11. Sou novo e estou perdido.

    Boa noite!! Bem vindo primeiramente. Passei exatamente por isso em um período da minha faculdade (que também é Analise de Sistemas) e vou relatar o que fiz/faço para lidar com isso. Suponha que você tenha 5 matérias: Pascal, Arquitetura, Contabilidade, Administração geral e Economia. Nota-se logo de cara que há uma diversificação um tanto grande de algumas matérias, mas vamos dar uma olhada em Pascal/Arquitetura, elas tem tudo a ver, certo? Lógica, linguagem de programação e arquitetura de computadores tem tudo a ver, use isso ao seu favor. Estude estas materias que se relacionam mais a fundo e procure sempre relaciona-las, tenha sempre uma visão curiosa do por que das coisas. As outras matérias estude apenas para passar(a não ser que você de fato goste delas também), afinal passar é "preciso" se um diploma for seu objetivo. Sobre dificuldade com lógica eu não sei o que ti recomendar a não ser estudar um pouco sobre fluxogramas e ler um pouco sobre teoria de algoritmos, fora a própria programação (eu não sei livros sobre isso, mas há vários, só dar uma "googlada"). Sobre arquitetura, poderia me dizer quais livros eles ti recomendam e no que vc tem dificuldade exatamente? Faça uma linha de estudos mediano para aquilo que você precisa passar e tudo o que você ver que agrada/tem a ver com S.I priorize, com isso você passa em tudo e mata 2 coisas com uma porrada só, faculdade e o prazer de estudar os fundamentos da S.I. Espero ter ajudado em algo maninho, estas dicas foram para vc melhorar o desempenho da faculdade etc. Caso queira saber como iniciar em S.I aconselho dar uma olhada neste artigo aqui. Qualquer coisa estou por aqui
  12. Sugestões

    Boa noite galera, queria deixar aqui 2 sugestões que acho bem interessantes para o mente binária como um todo: 1- ter uma forma de feedback mais direta para o próprio mente binária. As vezes a pessoa não curte/tem preguiça de escrever algo sobre o portal, por que não um meio com opções: excelente, bom, médio, ruim. Daria pra mensurar melhor, colher resultados pós implementação de algo novo, por exemplo. 2- Busca. Temos nossos perfis com nossa reputação, foto, git etc... por que não o que estamos procurando? Ex interesses: r.e, c, redes, Linux, Windows, saca? E uma barrinha pra procurar pessoas com os mesmos interesses. O que precisarem estou por aqui para ajudar
  13. Formato PE - 4

    Boa noite pessoal! Essas semanas andam meio corridas e não consegui estudar do jeito que gostaria, mas ainda sim bora lá, o importante é estudar, certo? Peço que dêem uma olhada na estrutura do post passado (IMAGE_OPTIONAL_HEADER) e observem o último campo: IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; Para quem manja de C já bate o olho e de cara nota que isso é um array de estruturas chamado DataDirectory de tamanho IMAGE_NUMBEROF_DIRECTORY_ENTRIES e do tipo IMAGE_DATA_DIRECTORY Se dermos uma olhada na biblioteca winnt.h podemos ver que há um valor pré-definido de 16 para o campo IMAGE_NUMBEROF_DIRECTORY_ENTRIES #define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16 A estrutura 'DataDirectory' segue o seguinte escopo: typedef struct _IMAGE_DATA_DIRECTORY { DWORD VirtualAddress; DWORD Size; } IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY; Esta estrutura possui, respectivamente, RVAs e Tamanhos de tabelas usadas em tempo de execução que podem ser usadas pelo Windows. Aqui está nossa referência: Offset (PE/PE32+) Size Field Description 96/112 8 Export Table The export table address and size. For more information see section 6.3, “The .edata Section (Image Only).” 104/120 8 Import Table The import table address and size. For more information, see section 6.4, “The .idata Section.” 112/128 8 Resource Table The resource table address and size. For more information, see section 6.9, “The .rsrc Section.” 120/136 8 Exception Table The exception table address and size. For more information, see section 6.5, “The .pdata Section.” 128/144 8 Certificate Table The attribute certificate table address and size. For more information, see section 5.7, “The Attribute Certificate Table (Image Only).” 136/152 8 Base Relocation Table The base relocation table address and size. For more information, see section 6.6, "The .reloc Section (Image Only)." 144/160 8 Debug The debug data starting address and size. For more information, see section 6.1, “The .debug Section.” 152/168 8 Architecture Reserved, must be 0 160/176 8 Global Ptr The RVA of the value to be stored in the global pointer register. The size member of this structure must be set to zero. 168/184 8 TLS Table The thread local storage (TLS) table address and size. For more information, see section 6.7, “The .tls Section.” 176/192 8 Load Config Table The load configuration table address and size. For more information, see section 6.8, “The Load Configuration Structure (Image Only).” 184/200 8 Bound Import The bound import table address and size. 192/208 8 IAT The import address table address and size. For more information, see section 6.4.4, “Import Address Table.” 200/216 8 Delay Import Descriptor The delay import descriptor address and size. For more information, see section 5.8, “Delay-Load Import Tables (Image Only).” 208/224 8 CLR Runtime Header The CLR runtime header address and size. For more information, see section 6.10, “The .cormeta Section (Object Only).” 216/232 8 Reserved, must be zero Aqui está nosso array, cada diretório representa um índice nesta lista. Vou pegar apenas um como exemplo, tendo em vista que todos os outros seguem o mesmo modelo Este é o array na posição 1(considerando que estamos começando de zero). Este se chama Import Directory. Mais pra frente vou tentar falar melhor sobre ele, pois o danado é importante pra caramba. A primeira DWORD é o RVA da tabela (relativo ao BaseAddress) quando carregada em memória. A segunda DWORD é o tamanho dela em bytes. Que tal revermos alguns conceitos? Quando estamos olhando os bytes de um arquivo por meio de um editor/dumper hexa, estamos olhando diretamente para os bytes do arquivo em disco. Para quem está familiarizado com a seguinte instrução: FILE *fp; Saiba que isto significa um ponteiro para o primeiro byte do arquivo, isto é, o início em disco. Com um ponteiro para um arquivo podemos manipular(imprimir, alterar, pular) os bytes diretamente através de várias funções que estão a nossa disposição e isso tudo através de uma abstração chamada stream(abstração, interface, chame do que quiser). Nos nossos estudos estamos falando de um binário, não de um arquivo em formato texto! Mais algumas considerações legais: Por acaso o termo “Offset” significa algo pra vocês? Este significa deslocamento (em relação a algo). Lembram do RVA ? Relative Virtual Address? Ele tem a mesma ideia do offset e é relativo ao BaseAddress. Ainda não ficou claro? Vamos lá… Quando executamos um programa é reservado um espaço de memória para ele chamado Virtual Address Space, o Windows cria este espaço para cada processo criado. O ‘VirtualAddress’(VA), também conhecido como Linear Address, pode ser achado facilmente. Lembram que o RVA é o deslocamento relativo ao BaseAddress? Sendo assim: VA = BaseAddress + RVA Vamos para a próxima estrutura!! Lembram do campo 'NumberOfSections' no FileHeader? O valor daquele campo nos mostra uma coisa interessante: o número de entradas na Section Table. Ok, não faz sentido *-*. Bom, no primeiro byte após os headers (logo após o ‘OptionalHeader’) está localizado um array de 'SectionHeaders' (ou Section Table Entries, use o que lhe agradar mais). Podemos referenciar da seguinte forma: struct IMAGE_SECTION_HEADER SectionHeaders[Num_no_Optional] e cada seção com seu respectivo índice no array. A estrutura de cada SectionHeader segue o seguinte escopo: typedef struct _IMAGE_SECTION_HEADER { BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; union { DWORD PhysicalAddress; DWORD VirtualSize; } Misc; DWORD VirtualAddress; DWORD SizeOfRawData; DWORD PointerToRawData; DWORD PointerToRelocations; DWORD PointerToLinenumbers; WORD NumberOfRelocations; WORD NumberOfLinenumbers; DWORD Characteristics; } IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER; No caso aqui não vou me preocupar em traduzir cada seção, tendo em vista que os campos do cabeçalho são iguais para todas. Vou apenas explicar pegando uma como exemplo e o resto deixo pra vocês Name O primeiro campo é um array de caracteres(uma string) com valor IMAGE_SIZEOF_SHORT_NAME, tá, mas o que é isso? Dê uma olhada neste campo do header winnt: #define IMAGE_SIZEOF_SHORT_NAME 8 Lá está o valor. Tenha em mente que são 8 bytes contando com um caractere nulo no fim da string(este caractere nulo é ignorado caso o nome tenha de fato 8 bytes). Há alguns detalhes a mais nesta definição, mas vou me preocupar apenas com a imagem de um executável, esta que suporta até 8 bytes em UTF-8 Note que cada byte representa um caractere do nome(no caso aqui é .text) e o resto é preenchido com zeros, ou seja, é feito um padding, um preenchimento para chegarmos ao valor definido pela diretiva #define =D Union (Misc) Pra você que estudou um pouco de estrutura de dados, sabe o que é uma union? Resumindo é parecida com uma struct, a questão é que o espaço de memória usado para as variáveis da union é compartilhado (geralmente em momentos diferentes). O compilador cria automaticamente uma variável grande o bastante para conter o maior tipo de variável da union. Voltando ao PE: PhysicalAddress e VirtualSize(Misc) Aqui temos duas DWORDS, uma indicando o endereço no arquivo e outra indicando o tamanho da seção depois que for carregada em memória(em bytes). Se este valor for maior que ‘SizeOfRawData’ a seção é preenchida com zeros. O campo ‘VirtualSize’ só é válido para imagens executáveis e será zero para arquivos objeto. No nosso caso deu 5744 bytes, 0x1670h VirtualAddress Para imagens executáveis é uma DWORD indicando o RVA, o primeiro byte da seção quando carregada em memória(lembrando que temos que somar ao 'BaseAddress'). Para arquivos objeto os compiladores setam este valor para zero Ali no canto esquerdo podemos ver o valor do VirtualAddress somado ao BaseAddress, resultando no primeiro byte da seção após ser carregada em memória =D SizeOfRawData Após o endereço virtual vêm 32 bits para os Tamanho dos Dados ('SizeOfRawData'), que nada mais é do que o tamanho dos dados da seção arredondado para cima, para o próximo múltiplo de 'FileAlignment' (alinhamento de arquivo). No nosso exemplo, o valor encontrado é 0000 1800, faça a conta e veja se é múltiplo mesmo =D. Caso a seção possua apenas dados não-inicializados este campo é preenchido com zeros(como é o caso da seção .bss ) PointerToRawData Este campo é bem interessante(não que os outros não sejam, claro). Para executáveis é uma DWORD indicando o offset dentro do arquivo(e deve ser múltiplo de 'FileAlignment') até os dados da seção propriamente ditos. Caso a seção possua apenas dados não-inicializados este campo é preenchido com zeros, de novo… No offset 400h na esquerda podemos ver justamente o início da seção .text em nosso arquivo PointerToRelocations, PointerToLinenumbers, NumberOfRelocations e NumberOfLineNumbers Aqui os dois primeiros campos são DWORDS e os seguintes WORDS. Todas estas informações somente são utilizadas para arquivos objeto, ou seja, estarão zeradas no nosso caso. Os executáveis não possuem um diretório de remanejamento base especial e a informação de número de linha, se é que está presente, geralmente está localizada num segmento especial para debugging ou em qualquer outro lugar. Para deixar um pouco mais claro(bem por cima): COFF Relocations (que só acontece em arquivos objeto) é a forma como os dados da seção devem ser modificados quando colocados na imagem e, posteriormente, carregados em memória. Characteristics Uma DWORD com uma porção de flags dizendo características da seção. Podemos dizer que é uma enum. Segue a documentação: Flag Value Description 0x00000000 Reserved for future use. 0x00000001 Reserved for future use. 0x00000002 Reserved for future use. 0x00000004 Reserved for future use. IMAGE_SCN_TYPE_NO_PAD 0x00000008 The section should not be padded to the next boundary. This flag is obsolete and is replaced by IMAGE_SCN_ALIGN_1BYTES. This is valid only for object files. 0x00000010 Reserved for future use. IMAGE_SCN_CNT_CODE 0x00000020 The section contains executable code. IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040 The section contains initialized data. IMAGE_SCN_CNT_UNINITIALIZED_ DATA 0x00000080 The section contains uninitialized data. IMAGE_SCN_LNK_OTHER 0x00000100 Reserved for future use. IMAGE_SCN_LNK_INFO 0x00000200 The section contains comments or other information. The .drectve section has this type. This is valid for object files only. 0x00000400 Reserved for future use. IMAGE_SCN_LNK_REMOVE 0x00000800 The section will not become part of the image. This is valid only for object files. IMAGE_SCN_LNK_COMDAT 0x00001000 The section contains COMDAT data. For more information, see section 5.5.6, “COMDAT Sections (Object Only).” This is valid only for object files. IMAGE_SCN_GPREL 0x00008000 The section contains data referenced through the global pointer (GP). IMAGE_SCN_MEM_PURGEABLE 0x00020000 Reserved for future use. IMAGE_SCN_MEM_16BIT 0x00020000 Reserved for future use. IMAGE_SCN_MEM_LOCKED 0x00040000 Reserved for future use. IMAGE_SCN_MEM_PRELOAD 0x00080000 Reserved for future use. IMAGE_SCN_ALIGN_1BYTES 0x00100000 Align data on a 1-byte boundary. Valid only for object files. IMAGE_SCN_ALIGN_2BYTES 0x00200000 Align data on a 2-byte boundary. Valid only for object files. IMAGE_SCN_ALIGN_4BYTES 0x00300000 Align data on a 4-byte boundary. Valid only for object files. IMAGE_SCN_ALIGN_8BYTES 0x00400000 Align data on an 8-byte boundary. Valid only for object files. IMAGE_SCN_ALIGN_16BYTES 0x00500000 Align data on a 16-byte boundary. Valid only for object files. IMAGE_SCN_ALIGN_32BYTES 0x00600000 Align data on a 32-byte boundary. Valid only for object files. IMAGE_SCN_ALIGN_64BYTES 0x00700000 Align data on a 64-byte boundary. Valid only for object files. IMAGE_SCN_ALIGN_128BYTES 0x00800000 Align data on a 128-byte boundary. Valid only for object files. IMAGE_SCN_ALIGN_256BYTES 0x00900000 Align data on a 256-byte boundary. Valid only for object files. IMAGE_SCN_ALIGN_512BYTES 0x00A00000 Align data on a 512-byte boundary. Valid only for object files. IMAGE_SCN_ALIGN_1024BYTES 0x00B00000 Align data on a 1024-byte boundary. Valid only for object files. IMAGE_SCN_ALIGN_2048BYTES 0x00C00000 Align data on a 2048-byte boundary. Valid only for object files. IMAGE_SCN_ALIGN_4096BYTES 0x00D00000 Align data on a 4096-byte boundary. Valid only for object files. IMAGE_SCN_ALIGN_8192BYTES 0x00E00000 Align data on an 8192-byte boundary. Valid only for object files. IMAGE_SCN_LNK_NRELOC_OVFL 0x01000000 The section contains extended relocations. IMAGE_SCN_MEM_DISCARDABLE 0x02000000 The section can be discarded as needed. IMAGE_SCN_MEM_NOT_CACHED 0x04000000 The section cannot be cached. IMAGE_SCN_MEM_NOT_PAGED 0x08000000 The section is not pageable. IMAGE_SCN_MEM_SHARED 0x10000000 The section can be shared in memory. IMAGE_SCN_MEM_EXECUTE 0x20000000 The section can be executed as code. IMAGE_SCN_MEM_READ 0x40000000 The section can be read. IMAGE_SCN_MEM_WRITE 0x80000000 The section can be written to. Nesta parte não vou colocar o valor que deu no meu, vou apenas destacar um fato interessante que é: a seção .text possui permissão de leitura e execução (os bits 29 e 30 estão sempre setados nela), pelo menos deveriam Muito obrigado por aguentar até aqui, espero que tenha sido claro e como sempre, qualquer feedback só mandar bala. Queria também avisar que coloquei todo esse material no meu github (https://github.com/leandropf/pecoff). Sei que não é lá essas coisas, apenas um mero mortal descrevendo os campos, mas ainda sim quem sabe não ajude alguém ou no mínimo dê uma direção . Abraços e bom domingo!
  14. Inicio para um programador

    Bom dia!! Legal aprender algoritmo em C/C++, forma uma base bem mais sólida que a maioria das linguagens. Sobre o caminho eu indico não se preocupar tanto com a linguagem em si no momento, mas sim no fundamento, na lógica. A ideia de algoritmo é entender o problema, dividi-lo em pedaços menores e resolve-los (a junção das partes forma o algoritmo). Aconselho junto à lógica procurar entender o que de fato está rolando em cada linha do seu código, use um disassembly, por exemplo. Sabendo como acontece o resto é resto mano!! Sobre referencias... de C sempre curti o "C Completo e Total" que fala do C puro ou o "Advanced Programming in the Unix Environment" que já joga pro lado do *nix, mostra uma aplicabilidade legal. C++ eu não sei livros, mas um fórum que acho legal é o cplusplus. De resto há muita coisa legal na net, no próprio GNU/Linux tem as man pages das funcões (ler códigos no git e entender tem me ajudado tb). Espero ter ajudado em algo. Saiba que a linguagem é poderosa pra caramba e ainda há mercado, principalmente pra pessoas experientes . E caso você fique insatisfeito com "apenas" C estude também assembly, ele vai solidificar muito mais as coisas
  15. Questione!

    Olha... não posso chamar de técnica kkkk Depois de ter essa linha de pensamento de cima comecei a achar bem chato ficar vendo sobre hacking e essas coisas, sempre faltou algo e infelizmente tem muita gente pagando de que sabe algo hoje em dia (principalmente no youtube). Coloquei na minha cabeça o que quero e escrevo constantemente o que devo estudar para chegar lá, os requisitos mínimos e me esforço para não sair daquilo até aprender legal. Tem dado certo!!
×