quinta-feira, 12 de março de 2020

Nova técnica de obfuscação de listagens ZX BASIC

Daniel Nagy, que se dedica ao estudo da ROM do Spectrum, e escrita de novas para Spectrum, descobriu um novo truque para esconder (partes de listagem) de código BASIC: a marca $0E de representação numérica de 5 bytes a seguir, quando fora de sitio, os 5 bytes seguintes são ignorados pela rotina da ROM do LIST.

Em runtime, o byte marcador da representação numérica é ignorado se fora do sítio, por cair no teste por defeito de caracteres de controlo (ao invés de ser executada a rotina de representação numérica), e os 5 bytes seguidos executados.

Mais ainda, aparentemente a rotina de EDIT também é afectada, e ao editar-se perdem-se as instruções "escondidas"; isto porque no EDIT é suposto a representação numérica dos dígitos não fazer parte do buffer de edição.

Por exemplo, no caso do programa "hello", ao fazer LIST normal:

10 PRINT "Hello world!"
20 GO TO 10

No caso do programa ninja:

10::

Ou no caso do programa "teste":

10 PRINT PRINT "teste"
30 PRINT "teste"

No entanto, analisando ambas as linhas 10, com o meu "debugZ80"

Programa hello:

10 .PRINT RND :RUN :PRINT "Hello world!"

 5CCB 00 0A 16 00 0E F5 A5 3A F7 3A F5 22 48 65 6C 6C .....??:?:?"Hell
 5CDB 6F 20 77 6F 72 6C 64 21 22 0D                                   o word!"

( quanto aos 5 bytes escondidos a seguir de $0E: $F5 $A5 tokens de PRINT RND, $3A ASCII de ':' , $F7 token RUN e $3A novamente ':')

Programa "ninja":

10 .PRINT "ni":.PRINT "nj":.PRINT "ja"

 5CCB 00 0A 15 00 0E F5 22 6E 69 22 3A 0E F5 22 6E 6A .....?"ni":.?"nj
 5CDB 22 3A 0E F5 22 6A 61 22 0D                                      ":.?"ja".?.??.?\

($F5 é o token de PRINT, e $3A ASCII para ':' , e $22 ASCII para ' ' (espaço))

Programa "teste":

[mem:$5CCB]
10 PRINT .
[mem:$5CD2]
20 PRINT "teste"
[mem:$5CDF]
30 PRINT "teste"

 5CCB 00 0A 03 00 F5 0E 0D 00 14 09 00 F5 22 74 65 73 ....?......?"tes
 5CDB 74 65 22 0D 00 1E 09 00 F5 22 74 65 73 74 65 22 te".....?"teste"
 5CEB 0D

O caso do programa teste é interessante, em que se verifica que este bug esconde simplesmente quaisquer 5 bytes de LIST, podendo ser usado para o baralhar. (dá para fazer pior do que estamos a mostrar)

 Que seja do nosso conhecimento, este bug não era conhecido nem explorado nos anos 80-90.

Ficheiros:

hello.tap
ninja.z80
teste.z80

Sem comentários:

Publicar um comentário