Hackeando os jogos Pro Strcpy do Tony Hawk
(icode4.coffee)- O buffer overflow de
strcpyno processamento do gap name em arquivos salvos do Create-A-Park levou a exploits via save files e rede em várias plataformas, como original Xbox, Xbox 360, PS2 e GameCube - Na versão de THPS4 para original Xbox, uma string limitada a 31 caracteres era copiada sem verificação de limites para um buffer de pilha de 32 bytes, permitindo sobrescrever o return address e executar shellcode usando o cabeçalho do save file e um segmento de dados executável
- Em THPS3, a mesma entrada corrompia a heap em vez da pilha, exigindo uma cadeia ROP que passava por um allocator customizado e por um caminho de vtable, enquanto nas versões de THUG 1 e 2 para Xbox o stack cookie bloqueava o caminho do gap name
- No multiplayer de THPS4, um host malicioso enviava um arquivo de park ao cliente para realizar execução remota de código e transferência assíncrona de arquivos, e um vazamento de memória de rede revelado durante a transferência era contornado com um hot patch dentro do exploit
- Tony Hawk’s American Wasteland no Xbox 360 também permite execução de ROP com o overflow de gap name, mas a execução completa de código no hypervisor só é possível quando combinada com um bug no system call handler do kernel 4548; o código-fonte e os save files corrigidos foram publicados no GitHub
Ponto de partida: gap name e strcpy
- Em 2016, durante a busca por um novo bug de save file hack para o original Xbox, o arquivo salvo de custom park de Tony Hawk’s Pro Skater 4 virou alvo de análise
- O recurso Create-A-Park de THPS4 permite que o jogador crie seu próprio skate park e dê nomes aos gaps, trechos de salto
- O gap name é uma string definida pelo usuário com no máximo 31 caracteres mais o terminador nulo
- Se essa string for processada por uma função como
strcpy, ela pode se tornar um primitive de corrupção de memória
- Ao substituir o gap name por uma string maliciosa longa com repetições de
0x41, copiá-la para o Xbox e carregá-la, o console travou e o instruction pointer foi definido como0x41414141- Isso indicava que o gap name havia sido copiado para a pilha e sobrescrito até o return address
- A análise no IDA mostrou que, ao percorrer a lista de gaps do save file, o jogo copiava
gap_namedesave_file_gap_dataparagap_description gapDesc, na pilha, usandostrcpy- Sem verificação de limites, a cópia continuava até encontrar o terminador nulo
- Essa versão do jogo foi compilada sem stack cookie, então era possível sobrescrever os dados da pilha e o return address
THPS4 no original Xbox: movendo shellcode para uma área executável
- O original Xbox não tinha DEP de hardware para impedir execução de dados arbitrários como dispositivos modernos, mas kernels mais recentes e jogos já tinham alguma forma de soft DEP
- O método alterava o endereço do seletor do segmento de código para permitir execução apenas abaixo de certo endereço
- A pilha e as alocações de heap onde ficava o save file estavam fora da área executável
- Como o segmento de dados read-write do executável do jogo ficava dentro da área executável, a estratégia foi copiar o código para lá e executá-lo dali
- O nome do park fica no cabeçalho do save file e, quando o jogador seleciona o save, os primeiros 136 bytes do cabeçalho são copiados para uma struct no segmento de dados do executável para exibição na UI
- Não dava para alterar livremente o cabeçalho inteiro, mas havia espaço suficiente para inserir um pequeno stub de
memcpy
- Não dava para alterar livremente o cabeçalho inteiro, mas havia espaço suficiente para inserir um pequeno stub de
- Fluxo do exploit de THPS4 no original Xbox
- Após carregar o save file e antes de apertar “Start Game”, os primeiros 136 bytes são copiados para o segmento de dados executável
- Ao apertar “Start Game”, o gap name malicioso é copiado para a pilha e o return address é sobrescrito com o endereço do stub de cópia de shellcode
- Quando a função retorna, o fluxo salta para o stub de cópia, que move o payload maior do buffer do save file para o segmento de dados executável
- Após a cópia, o fluxo salta para o payload e obtém execução arbitrária de código
Bypass de assinatura e habibi key
- Depois de obter execução de código no original Xbox, era necessário desativar a verificação de assinatura e executar um executável não assinado
- O payload foi montado com base no payload de um save file do softmod installer já existente de 007 Agent Under Fire
- Ele encontrava endereços de funções e dados do kernel, além do endereço da RSA public key usada na verificação de assinatura do executável
- Desativava a proteção contra escrita do machine state register e aplicava um patch na RSA public key para a habibi key
- Em seguida, executava um executável auxiliar incluído no save file; nos testes, foi usado um executável de
nyan cat
- O par de chaves habibi provavelmente é uma chave RSA criada por um grupo de hacking de Linux no original Xbox no começo dos anos 2000
- Em vez de forçar a verificação de assinatura RSA do kernel a sempre passar, o método trocava a public key pela própria chave do grupo para executar um loader de Linux
- Essa foi uma escolha para impedir que o save file fosse usado para executar conteúdo pirateado, mas depois outros grupos publicaram arquivos de exploit para instalar hacks persistentes
- Um detalhe curioso é que o modulus da habibi public key difere da Microsoft RSA public key em apenas 4 bytes
- Parece que o exponent também deveria mudar para 3, mas os payloads de shellcode existentes não alteram o exponent
- Não está claro exatamente como isso funciona
- O método da habibi key foi escolhido por causa da compatibilidade com várias versões de kernel do Xbox
- Fazer patch na função de verificação de assinatura para sempre retornar true exigiria correspondência de padrões de instrução para cada versão de kernel
- Com a habibi key, basta aplicar um patch de 4 bytes em uma área de memória fácil de localizar
Análise de variantes: THPS3, THUG, THAW
-
Tony Hawk’s Pro Skater 3
- O THPS3 também tinha Create-A-Park e gap name, mas não travava logo após carregar o arquivo de save malicioso
- Era possível andar de skate no jogo, e o console travava ao selecionar “quit game”
- O gap name era copiado para a heap, não para a stack, e o overflow sobrescrevia o allocation header da próxima alocação da heap
- Quando a próxima allocation era liberada, os pointers do header levavam a uma vtable com o function pointer da rotina de cleanup
- Diferentemente do THPS4, o THPS3 não copiava o header do arquivo de save para um segmento de dados executável, e os dados do save também ficavam em memória heap não executável
- Sobrescrevendo o pointer
pAllocOwner, era possível controlar o local de carregamento do function pointer de cleanup e usar uma ROP chain na memória do arquivo de save com stack pivot - A ROP chain, com apenas alguns gadgets, copiava o shellcode da heap para um segmento de dados executável e saltava para lá
- Depois disso, assim como no payload genérico “hack xbox kernel” do THPS4, eram aplicados o patch da habibi key e a execução de executáveis unsigned
-
Tony Hawk’s Underground 1 & 2
- Ao fazer fuzzing do gap name no THUG, em vez de access violation ocorria um bug check completo com a mensagem
Buffer overrun detected! - O executável continha verificação de stack cookie
- O stack cookie é um valor aleatório colocado antes do return address, e a função verifica antes de retornar se esse valor foi alterado
- Para sobrescrever o return address, seria preciso conhecer o valor do cookie, mas no caminho do gap name não havia como fazer esse leak
- Havia variáveis corrompíveis entre o fim do buffer de gap name e o stack cookie, mas elas eram logo sobrescritas pelo código do jogo e não eram úteis para o exploit
- A exploração via SEH também foi considerada, mas não havia como provocar uma exceção no código restante antes da verificação do stack cookie, e naquele ponto também não havia nenhum exception handler registrado que percorresse a cadeia SEH
- O THUG2 no Xbox também não permite exploit baseado em gap name pelos mesmos motivos
- Ainda assim, existem outros bugs de
strcpye bugs exploráveis baseados em heap - As versões de PlayStation 2, PC e provavelmente GameCube foram compiladas sem stack cookie, então podem ser exploradas com o buffer de gap name
- Ao fazer fuzzing do gap name no THUG, em vez de access violation ocorria um bug check completo com a mensagem
-
Tony Hawk’s American Wasteland
- Como o THAW é um jogo posterior ao THUG 1 e 2, esperava-se que tivesse stack cookie, mas a versão de Xbox foi compilada sem stack cookie
- Era vulnerável ao buffer overflow de gap name, e o exploit foi montado quase da mesma forma que no THPS4
RCE em rede no THPS4: hackeando o cliente sem arquivo de save
- Como o exploit via arquivo de save exigia memory card, escolheu-se como superfície de ataque com barreira de entrada menor o multiplayer LAN
- Ao usar no multiplayer LAN um park criado com Create-A-Park, o host envia o arquivo de save pela rede e o cliente o carrega
- Partiu-se da hipótese de que seria possível hackear o console do cliente enviando um arquivo de park malicioso
- Para evitar que o host hackeasse a si mesmo, o executável do jogo foi modificado para bloquear o bug de
strcpy, e também foi adicionado um code segment para funções extras - No começo, o cliente conseguia se conectar ao host e andar de skate normalmente, mas o payload não era executado e o buffer overflow também não era acionado
- Os dados do arquivo de park na memória do cliente estavam alterados em relação ao arquivo de exploit
- Depois que o host carregava o arquivo de park, ele o salvava novamente a partir da memória e enviava esse resultado ao cliente, corrompendo os dados do exploit
- Ao transformar essa function call em NOP, o cliente passou a receber o arquivo de park malicioso e foi comprometido, com mudança na cor do LED
- No caminho de rede, o header do arquivo de save não é copiado para o segmento de dados, então não era possível usar o stub local do exploit de THPS4 que copia o shellcode
- Uma ROP chain semelhante à do THPS3 copia o shellcode para memória executável
Descoberta do código-fonte de THUG e uso do código de rede
- Era necessário entregar pela rede ao cliente um executable de payload auxiliar, mas não dava para colocar o arquivo junto na pasta do save game como no exploit local por arquivo de save
- Também foram considerados métodos de carregar o executable a partir de um CD gravado ou de um endereço de rede local, mas eles não foram adotados
- A implementação de winsock do Xbox usa por padrão secure socket connection, então foi necessário reproduzir a camada de segurança do Xbox com um script Python
- Ao procurar material relacionado ao arquivo de save de park, a busca pela string
Sk4Ed_Deadlevou ao repositóriothugno GitHub- Constatou-se que não era uma ferramenta homebrew, mas sim o código-fonte completo de Tony Hawk’s Underground
- Não era exatamente o THPS4, mas a base de código era suficientemente parecida para aproveitar o networking code e escrever hooks
- No código-fonte havia o código de carregamento do arquivo de park e a linha exata com o bug de
strcpy- Foi possível reconstruir o arquivo de projeto do Visual Studio e corrigir alguns compiler errors para gerar uma build executável com os assets finais do jogo
- Não parece ser idêntico à versão final, mas o código aparenta ser muito próximo
- O objetivo deixou de ser apenas um RCE simples e passou a ser obter RCE de forma silenciosa no console que entra na partida, habilitar a execução de código unsigned e então transferir um executable auxiliar durante o jogo
Restauração da execução e transferência assíncrona de arquivos
- Para transmitir o payload enquanto o cliente continuava jogando, foi necessário restaurar o fluxo de execução do jogo após a execução do shell code
- A ROP chain foi alterada para salvar o stack pointer original antes do stack pivot e restaurá-lo depois da execução do shell code
- Depois disso, ela copia o shell code para memória executável e salta para lá
- O sistema de networking do jogo registra message ID e handler function, e chama o handler correspondente ao ID das mensagens recebidas
- Foi registrado um message ID não utilizado para implementar um protocolo simples de transferência de arquivos
- Quando o cliente se conecta, ele envia
MSG_ID_PAYLOAD_REQUESTao host para iniciar a transferência - O host envia os dados do payload em mensagens
MSG_ID_PAYLOAD_DATA - Quando o cliente recebe
PAYLOAD_MSG_ID_END, a transferência é concluída
- Quando o cliente se conecta, ele envia
Vazamento de memória de 15 anos e hot patch
- Durante a transferência do arquivo, o console do cliente travava com null pointer dereference
- O allocator de dados de rede retornava NULL, e os bytes livres do memory pool de rede chegavam a 0
- No código-fonte do THUG havia código para liberar o buffer de dados da mensagem, mas essa correção não existia na build lançada do THPS4
- O buffer
p_datadestream_descnão era liberado a cada mensagem, esgotando o memory pool de rede - Em partidas multiplayer normais, isso talvez não causasse problema a menos que a sessão durasse muito tempo
- O buffer
- O exploit aplicava um hot patch no código do cliente para liberar o buffer
p_desc->p_datacom a função free correta - Depois do hot patch, a transferência de arquivos teve sucesso entre os consoles host e cliente, e o cliente executou o executable
nyan-cat- Usando um app de tunneling, o mesmo exploit também foi testado remotamente no console de um amigo em outra região
Fluxo final do exploit de rede do Xbox original
- o cliente se conecta ao console host malicioso e recebe pela rede o arquivo de park “Hack Xbox”
- ao analisar o arquivo de park, o cliente sofre um buffer overflow, o endereço de retorno da pilha é sobrescrito e a cadeia ROP começa
- a cadeia ROP copia o payload completo de shellcode para uma região de memória executável e salta para ele
- o shellcode configura os hooks e patches necessários antes de voltar à execução do jogo e faz o spawn do jogador na partida
- enquanto o jogador anda de skate no jogo, o host envia um arquivo executável ao cliente, que o salva no HDD do cliente
- após a conclusão da transferência do arquivo, o shellcode aplica um patch no kernel do cliente para usar a habibi key e inicializa o executável secundário transferido
- se a cor do LED não mudar, é difícil para o usuário perceber o progresso até que outro aplicativo seja inicializado de repente
Xbox 360: THAW e o kernel 4548
- Tony Hawk’s American Wasteland para Xbox 360 também é vulnerável ao buffer overflow do nome do gap
- o objetivo era explorar o console em uma nova versão do kernel, mas isso era impossível sem um novo bug no hypervisor
- em vez disso, foi possível criar o primeiro exploit exclusivamente por software do Xbox 360 combinando o bug de
strcpydo THAW com o bug do handler de system call do kernel 4548 - o hack anterior do King Kong no Xbox 360 usava um arquivo de shader modificado para realizar uma escrita arbitrária na memória do kernel e explorar o bug do handler de system call
- esse método exigia abrir o console e modificar o firmware do drive de DVD para usar um disco modificado de King Kong
- o bug do save game podia servir como outro ponto de entrada para iniciar uma cadeia ROP
Assinatura de arquivos de save no Xbox 360 e o papel dos consoles de desenvolvimento
- os arquivos de save de jogos do Xbox 360 são assinados com um par de chaves RSA exclusivo de cada console
- o armazenamento de chaves de cada console contém a chave criptográfica usada para assinar saves de jogos
- o motivo de outros consoles conseguirem verificar o arquivo de save é que a chave pública RSA está incluída no cabeçalho do arquivo de save
- essa própria chave pública é assinada com outro par de chaves RSA que só a Microsoft possui
- não é possível simplesmente colocar qualquer chave pública no cabeçalho e fazer passar na validação
- para usar em outro console um arquivo de save modificado arbitrariamente, é necessário o key store descriptografado de algum console Xbox 360
- o ponto de partida do hacking de Xbox 360 foi o vazamento de consoles de desenvolvimento e do SDK
- como o código executável estava criptografado, sem conseguir inspecioná-lo externamente não era possível encontrar bugs
- os consoles de desenvolvimento e o SDK forneceram as informações necessárias para a descriptografia do código executável e para a engenharia reversa da cadeia de boot, do hypervisor e do código dos jogos
Bug do handler de system call 4548
- no Xbox 360 existem o modo real do hypervisor e o modo kernel
- o modo real do hypervisor é o modo com mais privilégios
- no modo kernel, o sistema operacional e o jogo são executados
- a CPU tem uma unidade criptográfica ao lado do cache L2 responsável pela criptografia e pelo hashing da memória
- no modo kernel, as páginas do hypervisor aparecem criptografadas + com hash, e se forem sobrescritas arbitrariamente o console para quando o hypervisor tenta acessá-las
- no modo real, os 32 bits superiores do endereço físico de 64 bits são usados para controlar a criptografia e o hashing
- ao aplicar a máscara
0x80000000.00000000, é possível acessar a memória ignorando a criptografia e o hashing - onde o modo kernel pode fornecer um endereço físico ao hypervisor, os 32 bits superiores precisam ser limpos obrigatoriamente
- ao aplicar a máscara
- o handler normal de system call usa a instrução
slwipara deslocar o ordinal da system call 2 bits para a esquerda e descarta os 32 bits superiores do resultado, usando apenas um offset de 32 bits - o handler de system call do kernel 4548 usa
sldiem vez deslwi- como
sldiopera em 64 bits, os 32 bits superiores de r0 também entram no cálculo do offset do índice da tabela - a verificação de intervalo do ordinal se aplica apenas aos 32 bits inferiores de r0
- por exemplo,
0x20000000.0000003Fpassa na verificação de intervalo enquanto cria o offset0x80000000.000000FC, induzindo um acesso de memória desprotegido
- como
- essa mudança é considerada mais provavelmente um bug de compilador do que uma modificação intencional do desenvolvedor
Estrutura do exploit do Xbox 360
- se a visualização de memória criptografada do hypervisor for sobrescrita no modo kernel, normalmente o console para, mas se o handler de system call for levado a ler um ponteiro de função de um endereço com o bit de proteção superior definido, ele pode ler o valor sobrescrito sem gerar fault
- etapas do exploit
- carrega o shellcode na memória e obtém o endereço físico
- altera uma variável do gerenciador de memória do kernel para expor a visualização de memória criptografada do hypervisor em um intervalo de endereços gravável
- sobrescreve o ponteiro de função da system call do hypervisor com o endereço da sequência de instruções
mtctr r4; bctr - coloca um ordinal malicioso em r0 e, em r4, um valor com máscara OR do endereço físico do shellcode com
0x80000000.00000000 - executa a instrução de system call para que o hypervisor leia o ponteiro de função sobrescrito e salte para o shellcode por meio de
mtctr r4; bctr
- o exploit de save do THAW usa uma cadeia ROP em PowerPC
- o plugin IDA Ida-Sploiter foi modificado para suportar busca de gadgets PowerPC
- o exploit completo é composto por 24 gadgets ROP
- fluxo completo do THAW no Xbox 360
- o buffer overflow no nome do gap sobrescreve o endereço de retorno com o primeiro gadget ROP
- faz pivot do stack pointer para a cadeia ROP dentro do buffer de save
- aloca memória física para o shellcode do hypervisor com
MmAllocatePhysicalMemoryEx - copia o shellcode com
memcpye obtém o endereço físico comMmGetPhysicalAddress - faz o mapping da visualização de memória criptografada do hypervisor para permitir escrita
- sobrescreve o endereço da função de system call com a sequência
mtctr r4; bctr - executa
syscallcom o ordinal malicioso da system call e o endereço físico do shellcode - depois de obter execução de código no hypervisor, altera a cor do LED e faz patch na verificação de assinatura RSA de executáveis
- volta para a cadeia ROP em modo kernel, mapeia uma pasta do HDD com
ObCreateSymbolicLinke executa um payload secundário não assinado comXLaunchNewImage
- esse método permite obter execução ROP a partir do bug de
strcpydo THAW em qualquer versão de OS do Xbox 360, mas a execução completa de código no hypervisor só é possível no kernel 4548- se um novo bug no hypervisor for descoberto, ele pode ser combinado com esse ponto de entrada para funcionar também em versões mais novas do kernel
Divulgação em 2024 e port para outras plataformas
- em 2024, os exploits de Tony Hawk foram organizados e divulgados
- o mesmo bug de
strcpyexiste em 5 iterações da série Tony Hawk e em várias plataformas de console e portáteis -
PlayStation 2
- o exploit de RCE via rede do THPS4 foi portado para a versão de PlayStation 2
- com PCSX2 ou outro console e apenas o disco de THPS4, é possível hackear o console pela rede
- o exploit envia o uLaunchElf pela rede e o executa quando a transferência termina
- depois disso, é possível carregar o instalador do FreeMcBoot ou do FreeHDBoot a partir de outra mídia, como um pendrive USB
- o exploit de save game do PS2 tem pouca utilidade
- se houver uma forma de copiar arquivos para o memory card, basta instalar o FreeMcBoot diretamente
- é possível comprar um memory card com FreeMcBoot na Amazon por 15 dólares, ou usar o FreeHDBoot em um console phat com adaptador de rede
-
GameCube
- o exploit de save game do THPS4 foi portado para a versão de GameCube
- a versão de RCE via rede e outras variantes de exploit por save game não foram portadas
- copiar arquivos para um memory card de GameCube não é simples, e memory cards com save pré-hackeado vinham sendo vendidos no eBay por mais de 50 dólares
- a versão de GameCube dos jogos Tony Hawk não tem suporte de rede, então não é possível usar o exploit de rede mesmo com adaptador de rede
- como já existem vários exploits por save e não há hack de software persistente, muitos usuários escolhem modchip
-
Windows
- também foi criado um exploit de save game para THUG PRO, e um bug report foi enviado há 7 anos, mas na época não havia interesse em corrigir
- ele não foi divulgado porque não oferece valor no Windows
- os jogos Tony Hawk para PC têm o mesmo bug de
strcpye são exploráveis - também existem outros bugs de
strcpyexploráveis no modo de jogo em rede - recomenda-se forçar ASLR e não executar como Administrator
Materiais publicados
- o código-fonte completo e os arquivos de save patchados foram publicados no GitHub
- um único bug de
strcpylevou a exploits de save, RCE via rede e a um ponto de entrada de exploit somente por software no Xbox 360 em várias plataformas
1 comentários
Comentários do Hacker News
O aspecto mais interessante da chave Habibi é que o módulo da chave pública difere da chave pública RSA da Microsoft em apenas 4 bytes
Um inteiro aleatório de 2048 bits tem uma chance razoável de ser fatorado de forma trivial e, embora eu não saiba a probabilidade exata, dá para estimar algo na ordem de 2^-32
Provavelmente usaram um código que alterava aleatoriamente ou incrementava 4 bytes do módulo público, tentava fatorar por cerca de 1 milissegundo e parava quando dava certo
Como resultado, é bem provável que o módulo público tenha muitos fatores pequenos; normalmente um módulo RSA é o produto de exatamente dois primos, mas desde que seja coprimo com e, a matemática ainda funciona mesmo com mais fatores
Se por sorte a implementação de RSA usar exatamente dois fatores primos, você já sabe que um deles é 3, então basta dividir a chave pública por 3 para obter o outro fator primo
Segundo a Wikipedia, a estrutura da chave pública RSA exige que N seja um semiprimo grande e que e seja coprimo com φ(N); quem fatorar N pode obter a chave privada. No contexto do hack do Xbox, fazer N ser divisível pelo primo 3 significa que o outro primo é N/3, então a fatoração já foi bem-sucedida
O código que assina com a chave Habibi está em https://github.com/XboxDev/xbedump/blob/b8cd5cd0f8b1cbc4e64f.... Ele troca os últimos 4 bytes para 0x89, 0x9c, 0x90, 0x6b, divide por 3 e então gera uma chave privada adequada a partir desse valor
A aplicação é corromper a chave pública via rowhammer e depois usar essa fatoração para criar uma nova chave privada correspondente. Funcionou com chaves SSH e GPG, assumindo para fins práticos coisas como conhecer o conteúdo da página onde a chave está armazenada
A taxa de sucesso empírica conforme o tempo de computação disponível está na Figure 7; o tratamento analítico está no capítulo 3 e a descrição do método real na seção 4.4
https://www.usenix.org/system/files/conference/usenixsecurit...
Por exemplo, usando um código que tenta dividir pelos primos de 2 até 499 e, se o valor não virar 1, executa Miller–Rabin 20 vezes, no meu ambiente foram necessárias cerca de 100 tentativas para fatorar completamente um inteiro aleatório de 2048 bits
É difícil até expressar o quão absurda é essa conquista
Fazer softmod no Xbox 360 usando o nome de um parque em um jogo do Tony Hawk, chegando até uma cadeia ROP de 24 etapas, é impressionante
Juntando a breve elegia ao hipervisor, a análise concisa e prática e a ideia imediata de uma botnet de x360, isso parece um golpe direto de nostalgia do Xbox 360 no mais alto nível
A parte de “se der sorte vai ser strcpy” é engraçada. Originalmente deveria ser strncpy, mas um Tony Hawk famoso por defender equipamentos de segurança provavelmente preferiria ser associado a uma cópia de string mais segura
Se a origem não couber no destino, é preciso decidir conforme a aplicação se pode truncar, se deve abortar toda a operação ou se precisa realocar o buffer de destino. strncpy quase sempre faz a coisa errada
Na prática, strncpy quase nunca deveria ser usado; ele serve para campos de tamanho fixo como
struct dirent { unsigned short inode; char name[14]; };Mesmo nesses casos, com frequência os bytes de preenchimento deveriam ser espaços em vez de nul, e strncpy nunca deveria ter entrado na biblioteca padrão
Quando eu usava C/C++, achava mais fácil trabalhar com elas do que com as funções padrão de C, porque tratavam falhas comuns como buffer pequeno demais ou overflow de inteiro, e todas retornavam códigos de erro, o que facilitava verificar falhas
Neste caso,
StringCchCopyW()ouStringCbCopyW()seriam escolhas melhores do que strcpyÉ um pouco triste que esse exploit também se aplique ao THUG PRO
A cena competitiva da série Tony Hawk está praticamente morta há quase 20 anos, com a breve exceção do remake THPS1+2, e esse mod ainda é jogado até hoje
O próprio mod já tem mais de 10 anos e os desenvolvedores originais aparentemente saíram, então dá para entender por que, quando Ryan reportou o problema, ninguém quis corrigir. Mas agora ficou difícil usar esse mod por causa do risco de comprometimento total do PC
Espero que este texto chegue a alguém disposto a corrigir o mod
Aquele código era apenas para a versão de console, e assumir compilação para Windows não significava Xbox Windows, mas sim para ferramentas, então muita coisa funcionava de forma completamente diferente
O que parece ser o ícone de cabeçalho de seção antes do texto “So what's the habibi key?” é na verdade uma área de HTML details que se expande ao clicar, então vale a pena abrir se você tiver interesse
A dúvida é: se a história de que a chave Habibi era usada exclusivamente pelo grupo Linux console para impedir o uso de conteúdo pirata for verdadeira, então onde, quando e como a chave privada correspondente foi tornada pública ou vazou?
O autor alterou a diferença de 4 bytes entre a chave da Microsoft e a chave Habibi para executar um binário “não assinado”, que na prática estava assinado com a chave privada Habibi, então parece claro que ele obteve a chave privada
A chave privada pode ser recuperada trivialmente a partir da chave pública, então na verdade não havia nada específico para ser tornado público ou vazado
Basicamente, era um pequeno CTF criptográfico escondido dentro do hack de save de 007: Agent Under Fire, e o próprio hack do save também era praticamente um CTF bem ofuscado. Parece que havia tanto a intenção de sacanear usuários de pirataria quanto um desafio para outros engenheiros de reversão
Muito legal. Já mexi um pouco com decompilação de PSX, e lá também há várias coisas parecidas
Curiosamente, algo como
memmoveé linkado da biblioteca do SDK[0], masstrcpyé uma função fornecida pela BIOSEm versões posteriores do SDK isso podia ser corrigido para a versão de biblioteca, mas até 1997 isso ainda não tinha sido feito
0 - https://github.com/Xeeynamo/sotn-decomp/blob/master/src/main...
Agora que jogos de N64 estão sendo portados para PC por meio de decompiladores, isso dá esperança
Dá para responder “mas esses jogos já têm versão para PC”, só que, se você recompilar um jogo de N64 e trocar os efeitos por texturas puras ou efeitos mais simples em vez de shaders, ele pode rodar praticamente em qualquer lugar, até em máquinas lentas como netbooks baratos de 2009
Também houve um caso de portar Super Mario 64 para a API 3DFX. Jogos que acessam o framebuffer do N64 de forma complexa provavelmente exigiriam OpenGL 3.3 para emular esse microcódigo, mas se o motor roda muito rápido em hardware desde a época do Pentium III, então não seria tão difícil deixar o restante acelerado em GL 2.1 e emular só algumas partes via software
Já li muitas análises desse tipo de exploit em várias formas, e ficaria feliz em ler mais 100 no futuro
Isso parece um bom exemplo de mentalidade de segurança equivocada no desenvolvimento para consoles
A ideia de que “os dados de save só podem ser usados por nós, então basta fazer parse apenas do que nós mesmos escrevemos” é comum em consoles, mas está fundamentalmente errada, porque as pessoas podem preparar saves artificialmente
Separadamente disso, consoles não deveriam tratar o usuário como inimigo, mas, se de qualquer forma fazem isso, então os jogos também precisam ter uma mentalidade de segurança compatível com essa posição
Se você não limitar o que o usuário pode fazer, não sei como seria possível impedir trapaça em jogos online
Em defesa de Tony Hawk, ele é um skatista profissional, não um analista de segurança
O tempo limitado que ele passou na frente de um teclado no fim dos anos 90 e começo dos anos 2000 provavelmente foi usado não para auditar buffer overruns, mas para fazer com que um 900 McTwist parecesse natural em um jogo que se tornaria uma série icônica
Tive a chance de confirmar uma lenda que ouvi quando era criança. Foi Tony Hawk quem acertou um 720 pela primeira vez?
Provavelmente isso quer dizer “a primeira vez registrada”, mas, se outra pessoa já tivesse feito, é bem provável que tivesse saído contando por aí, e alguém capaz de fazer isso provavelmente seria um skatista profissional de qualquer maneira