Mundo dos vírus do MS-DOS

imagem

Este post é uma versão em texto da minha palestra no 35º Chaos Computer Congress no final de 2018.

E, portanto, devo admitir que o MS-DOS está um pouco indignado, apesar do malware do MS-DOS sempre me fascinar até certo ponto, mas primeiro devemos perguntar: "O que é o DOS?"

  • O DOS é uma versão do CP / M, outro sistema operacional muito antigo.
  • A família DOS abrange uma ampla variedade de fornecedores, simplesmente porque é DOS não significa que será executada em uma CPU 8086 ou superior.
  • Alguns desses provedores de DOS têm compatibilidade com API, o que significa que alguns deles usam malware!


imagem

Vídeo de desempenho:


EDISON Software - desenvolvimento web
A postagem foi escrita com o suporte da EDISON Software, que desenvolve um aplicativo para uma operadora móvel virtual e está envolvida no desenvolvimento e manutenção de sites em Python .

imagem

Mas, de fato, a maioria de nossas memórias da era DOS é a estética de como os computadores da época eram:

imagem

Esta é a era da “computação bege” e do teclado Modelo M, que pode ser famoso ou infame, dependendo se você gosta ou não do teclado barulhento.

imagem

Alguns de nós podem ter memórias de uso do DOS, e alguns ainda podem usar o DOS!

imagem

Por exemplo, há rumores de que George R. Martin, que escreveu The Game of Thrones, tenha usado o Wordstar no DOS para escrever um livro!

imagem

Também não podemos perder o QBASIC, pois para muitos isso seria o primeiro conhecimento em programação!

imagem

Mas às vezes a vida usando o DOS não era tão boa, às vezes você usava o DOS e coisas assim aconteciam subitamente. Neste exemplo, uma pequena melodia é tocada durante a impressão, portanto, essa pode ser uma situação muito embaraçosa em um ambiente de escritório.

imagem

Alguns deles são mais "fofos"; nesse caso, por exemplo, uma ambulância desenhada por símbolos ascii passa e, em seguida, o programa que você deseja abrir inicia, na pior das hipóteses, com pequenos inconvenientes.

Graças a vários arquivistas de malware executando o nome VX Heavens, temos um bom arquivo histórico de malware do DOS, ou pelo menos até a polícia ucraniana invadir o site:
Na sexta-feira, 23 de março, o servidor foi apreendido pela polícia em conexão com uma investigação criminal (artigo 361-1 do Código Penal da Ucrânia - criando malware com a finalidade de vendê-lo ou distribuí-lo) com base nas instruções de alguém. sobre "colocar software malicioso de acesso gratuito projetado para hackers não autorizados de computadores, sistemas automatizados, redes de computadores".

Felizmente, sites populares de torrent ainda têm cópias do banco de dados do site que podem nos fornecer um excelente conjunto de dados:

$ tar -tvf viruses-20070914.tar | wc -l 66714 $ ls -alh viruses-20070914.tar 6.6G viruses-20070914.tar 

No entanto, para começar a estudar essas amostras, precisamos primeiro entender o fluxo de distribuição típico dessas amostras, uma vez que esses programas funcionaram na era pré-Internet:

imagem

Depois de receber o arquivo infectado no sistema e executá-lo, o programa malicioso pesquisará ou instalará ativamente os interceptadores de chamadas do sistema para os programas executados. Ele costuma fazer isso de maneira sutil e invisível para evitar a detecção. A importância da sutileza é importante porque, para distribuir esse programa mal-intencionado, você deve transferi-lo para outro sistema usando uma mídia (disquete) ou fazer o download para outro ponto de distribuição, como o BBS.

imagem

Em tempo de execução, o malware tem duas opções; ele pode permanecer oculto e infectar novos arquivos ou exibir uma carga útil.

Algumas cargas são muito bonitas! O exemplo abaixo usa funções incomuns, como 256 cores:

imagem

Ou este que brinca com seu buffer de tela:

imagem

imagem

No entanto, na maioria das vezes, o malware permanece silencioso e tenta encontrar arquivos para infecção. A infecção da maioria dos arquivos é muito simples, por exemplo, se você visualizar o arquivo COM como uma longa fita de código de máquina:

imagem

Então, “tudo o que você precisa fazer” é inserir o JMP no início do programa e adicionar dados ao final do programa. Será algo parecido com isto:

imagem

Algum código era mais inteligente e encontrou “espaço vazio” no arquivo binário e se escreveu lá, o que impedia o aumento do tamanho do arquivo binário, o que possivelmente significava que o antivírus poderia usar a bandeira vermelha.

imagem

No entanto, anteriormente, eu também mencionei interceptar chamadas do sistema. Apesar do tempo de execução do MS-DOS ser muito simples e praticamente desprotegido (você pode carregar trivialmente o Linux a partir de um arquivo COM). Ele ainda contém a API completa para que os aplicativos não precisem ter sua própria implementação de sistema de arquivos. Aqui estão alguns recursos do syscalls:

imagem

Eles trabalham causando uma interrupção do software, na qual o programa solicita que o processador mude para outra seção da memória do sistema para processar algo:

imagem

No entanto, o MS-DOS também oferece a capacidade de adicionar / modificar essas chamadas (usando outra chamada), permitindo expandir o sistema para que novos drivers possam carregar em tempo de execução. No entanto, também é um local ideal para adicionar interceptações de malware:

imagem

Foi um truque bem usado, porque você pode interceptar a chamada "Abrir arquivo" e usá-la para detectar novos arquivos executáveis ​​no sistema ... e infectá-los.

Como um exemplo rápido de como eles são usados, vejamos um programa simples Hello World:

imagem

Como podemos ver, existem duas chamadas do tipo int . Usamos 21h (h = hex) como o número de chamada principal do sistema e podemos especificar qual ação queremos que o MS-DOS execute com base no valor de Ah

imagem

Nesse caso, o programa faz uma chamada para imprimir a linha e sai com o código de retorno 0 (indefinido).

Como mencionado anteriormente. Quando você chama int 21h, o processador central procura na tabela IVT para onde ir; nesse manipulador, muitas vezes há um segmento como um roteador que roteia várias chamadas principais; no caso do Int 21h, ele direciona para várias funções com base no valor ah. Assim que chegarmos ao local, o manipulador de chamadas real lidará com a tarefa e, em seguida, executará iret para retornar ao programa principal, geralmente deixando registros dos resultados da chamada:

imagem

Então Se quisermos ver todas as chamadas do sistema iniciadas pelo programa, podemos definir um ponto de interrupção no início do manipulador de interrupções e verificar o que é ah:

imagem

Fazemos isso porque o manipulador de interrupção está sempre em um local fixo no MS-DOS (isso é muito anterior à era ASLR e ASLR do Kernel) e a localização do programa não.

imagem

Quando o lançamos, podemos ver os desafios criados por esse padrão. Enquanto podemos ver na tela que ele acabou de imprimir uma notificação sobre o arquivo Goat (Goat é um arquivo projetado para infectar, como uma cabra sacrificial). Também vemos que este programa faz mais do que apenas imprimir uma linha. Ele verifica a versão do DOS (provavelmente para verificar a compatibilidade) e, em seguida, abre, lê e grava dados!

imagem

Isso é interessante! Mas gostaríamos de saber mais sobre o que o sistema chama destacado em vermelho, pois eles devem ter entrada para coisas como nomes de arquivos e dados para gravar em arquivos / saída na tela.

Para fazer isso, precisamos olhar para outros registros durante o syscall:

imagem

Usando "Imprimir String" como um exemplo simples, podemos ver como é o uso:

imagem

O que é o DS: DX? Por que existem dois registros aqui e como obtemos dados deles?

Para fazer isso, precisamos entender um pouco mais sobre o processador 8086.

imagem

O processador 8086 é uma CPU de 16 bits, mas com endereçamento de memória de 20 bits. Isso significa que o processador pode armazenar apenas valores que indicam 64 KB; esse é um problema quando a capacidade da memória é de até 1 MB.

Para contornar isso, precisamos entender os registros de segmentação:

imagem

O processador 8086 possui 4 registros de segmentação dos quais precisamos cuidar:

  • CS - segmento de código
  • DS - segmento de dados
  • SS - segmento de pilha
  • ES - um segmento adicional (caso você precise de mais um para contornar diferentes situações)

Existem vários outros registradores de uso geral que evitam o uso excessivo de memória e permitem passar parâmetros para outras funções.
A segmentação registra o trabalho alterando o bloco na RAM:

imagem

Isso permite que a CPU de 16 bits veja todos os 20 bits de RAM, garantindo que para cada valor de DS o bloco seja compensado por 16 bytes.

imagem

Nesse caso, a chamada DS é usada como um ponteiro dentro da janela de 16 bits em relação ao local da linha. Em seguida, a impressora de linha digitalizará até encontrar o caractere $ e, em seguida, para. Isso é semelhante a outros sistemas que usam bytes nulos em vez de $.

imagem

Com a idade do ISA x86, pouco mudou, em vez de o tamanho do bit do processador ter aumentado, os mesmos registros se tornaram maiores.

Portanto, com esse conhecimento, podemos criar uma lista de "tarefas" para rastrear esses programas:

imagem

Com essa configuração, podemos jogar vários computadores grandes no problema por várias horas e coletar os resultados!

imagem

E nós temos ...

imagem

Nada disso.

Isso é decepcionante.

Queimamos pelo menos um hamsters no valor de energia e quase não recebemos ativações legais! (Xs como traduzir isso)

imagem

Se olharmos para algumas amostras, veremos uma arma de fumaça aqui. Uma amostra decente de amostras verifica a data ou a hora.

Se olharmos para a documentação dessas chamadas, veremos que a chamada do sistema retorna valores na forma de registros para o programa:

imagem

Para que possamos forçá-los brutalmente! Tudo o que precisamos fazer é algo como isto:

imagem

Mas há um problema com esse método.

imagem

A etapa de testar o exemplo leva cerca de 15 segundos, pois usa o processo completo de emulação do qemu e pode levar até 15 segundos para executar o programa completamente na máquina virtual. Como o DOS não possui recursos de economia de energia, isso significa que, quando o DOS está no modo de espera, ele fica em um ciclo ocupado

Portanto, podemos analisar esse problema de maneira diferente, observando qual código será executado após a solicitação de data / hora.

Como nosso rastreador está no manipulador de interrupções, não sabemos da caixa onde o programa está localizado:

imagem

Para fazer isso, precisamos olhar para a pilha onde os registros de CS e IP nos aguardam!

imagem

Assim que pegarmos esses dois registros da pilha, podemos usá-los para obter o código de retorno, para que nossa lista de verificação fique assim:

imagem

Depois de fazer isso e repetir o teste do conjunto de dados, veremos como é a parte do código de retorno!

imagem

Aqui está uma amostra de um. Aqui vemos que é feita uma comparação para DL e 0x1e.

imagem

Se olharmos para a nossa documentação, veremos que a DL é o dia do mês, ou seja, podemos analisar os três principais códigos de operação da seguinte maneira:

imagem

Poderíamos analisar manualmente tudo isso, mas existem muitas dessas amostras que verificam o tempo, em torno de 4700:

imagem

Então, em vez disso, precisamos fazer outra coisa. Precisamos escrever algo ... Precisamos escrever ...

imagem

O pior emulador x86 do mundo, chamado BenX86, é um emulador projetado especificamente para nossas necessidades e nada mais:

imagem

Mas ele tem algumas vantagens em sua velocidade.

imagem

imagem

Adicionamos 10.000 testes de execução diferentes com base nos caminhos que encontramos usando força bruta usando BenX86. Então, terminarei com algumas das minhas descobertas favoritas ativadas no tempo:

imagem

Esse padrão é ativado no dia de ano novo e desliga o sistema depois que uma saudação é exibida. Pode ser bom se você estiver preso no escritório durante o ano novo, ou pode ser ruim se realmente precisar fazer algo no dia de ano novo.

imagem

Este exemplo me surpreendeu muito. Ele é ativado no início de 1995 e informa o usuário sobre todos os arquivos infectados que ele infectou e remove o vírus (excluindo a transição no início) e, em seguida, não faz mais nada. Embora, por algum motivo, diga que você deve comprar a McAfee, essa mensagem obviamente não está desatualizada.

imagem

Isso, francamente, realmente me confunde: em 8 de novembro de qualquer ano, ele transformará todos os zero no sistema em pequenos glifos de "ódio". Realmente me incomoda se você sabe por que precisa, me avise ...

imagem

Este é provavelmente o meu pesadelo quando, após iniciar qualquer programa, ele exibe uma mensagem de que ela não pode comer sua unidade principal. Seria incrivelmente perturbador ver do nada.

imagem

Em conclusão, temos o que é a versão do Navy Seal Copypasta do malware do DOS. Não tenho certeza de que este autor não goste de Aladdin, mas faça o que fizer, você é uma pessoa.

Se você estiver interessado no código que foi executado neste artigo, lancei meu kit de ferramentas no github , sem qualquer garantia. Se você deseja criar esse código por conta própria, precisará trabalhar para garantir que ele funcione com a instalação do MS-DOS (corrigindo um ponto de interrupção do manipulador)

No entanto, se você apenas olhar para ver o que vi enquanto olhava para este projeto, arquivei a interface da web aqui: dosv.benjojo.co.uk

Até breve!

Source: https://habr.com/ru/post/pt440086/


All Articles