Un Zx81 sur une TV moderne

Project du weekend, faire afficher le Zx81 correctement sur une TV. Pour les plus jeunes, le Zx81 est un vénérable ordinateur a base de Z80 avec 1k de mémoire vive et qui affiche une résolution de 64×48 Pixels (oui il ne manque pas de zero). Celui que je possède date de 1981 et malheureusement la video est modulée en signal VHF (la TV de dans le temps). Bilan l’image est simplement dégeulasse, et sur une TV moderne qui dispose encore d’une entrée antenne, la qualité est encore pire. Et avec une résolution ainsi c’est un comble.

Sinclair-ZX81.png

L’objectif est donc de bricoler le vénérable ordinateur afin de le rendre compatible avec une entrée AV (Composite). Il y a déja pas mal de litérature à ce sujet; 

http://www.retrogames.cl/zxav.php

https://www.sinclairzxworld.com/viewtopic.php?f=7&t=872&p=8749#p8749

http://zx.zigg.net/misc-projects/ZX81_Video_Conditioning.pdf

Dans un ZX81 c’est le chip ULA (Uncommited Logic Array) de la marque Ferantti qui fait le job de sortir le signal vidéo, un chipset custom, un asic quoi, une genre de carte video de l’époque mais qui s’occupe aussi de tout les entrée sortie cassette, beep etc…

Je voulais une solution tip-top, qui marche pile poil avec le mien (pal, secam, tout ca, formidable époque…) Le tout dans l’espoir de le faire rentrer un jour dans un upscaler pour le sortir en HDMI (genre : le OSSC http://junkerhq.net/xrgb/index.php?title=OSSC) (Pourquoi.. parce qu’on peut tient)

Le hic est donc que le signal que produit le ZX81 est… dégeulasse, c’est un signal video composite N&B mais qui prends quelques libertés avec la norme nottament dans sa gestion du “noir”.

Pour rappel, dans une vieille TV, l’image est analogique, et c’est une succession de lignes. Le signal video composite N&B est codé ligne par ligne. Le ZX est supposé donc emètre dans les 600 lignes pour afficher une simple image (En Entrelacant d’abord toutes les lignes pair puis ensuite toutes les impair).

Le signal vidéo

Sur chaque ligne, la tension de 0 a 1v indique le niveau de gris a afficher, le 1v étant le blanc. Normalement chaque ligne doit commencer par un décrochement de synchronisation a 0v pendant 10uSec ensuite donner un signal de reference du noir (reference black) pendant 10 autres uSec encore et enfin la ligne a affiche. Et notre ami le Zx, en sortie de l’ULA (pas le 3615) il a oublié d’Emettre le signal de la base “Noir”.

Voici a quoi doit ressembler le signal pour une ligne video composite

Composite Video.svg

Et voici ce que pond le ZX81 (en rose).. Ici une seule ligne, il y a bien le 1er décrochement de début de ligne, mais c’est tout. pas de signal “noir”.

This image has an empty alt attribute; its file name is UlaOut_vs_CompoOut.png

L’idée vue sur Zigg.net est donc d’injecter le signal de noir manquant en utilisant un Timer NE555 configuré en mode monostable. Synchroniser celui ci sur le signal de synchro de début de ligne afin de recréer le signal noir manquant. J’ai laborieusement modifié ce schema pour d’une part avoir moins de charge à demander à l’ULA du Zx81 qui est fragile, et d’autre part pouvoir régler précisément le niveau de noir.

On vois ici au dessus le le signal de sortie d’une ligne produite par l’ULA (rose) on voit bien le décrochement de 10uSec avec une tension max de 4.24 volts. Au dessous en Jaune le signal en sortie du montage. Avec le signal “noir” calibré pile poil pour la bonne tension et la bonne durée. Le décrochement plus loin est la vue d’une ligne du fameux caractère “K” du curseur du Zx81.

L’autre challenge est de faire “rentrer” ce montage à la place du modulateur VHF histoire d’avoir une boite unique. le but est de faire rentrer cela a la place du vieux modulateur dans sa boite ici en haut a gauche (3,7 x 2,4 Cm).

Le project est disponible ici : https://github.com/Th4nat0s/Zx81_2_Composite

Alors vu que certains, (qui se reconnaitront, se sont moqués de mon 1er Typon en montage traversant, il y a donc une version CMS).

On peut récupérer le signal video de sortie de l’ULA sur la pin16 de celui ci. Et le +5v pas très loin c’est le fil qui monte au modulateur VHF

Le schéma http://fetrmartin.free.fr/ZX81/schema_ZX81_Fr.gif. En clair c’est ICI qu’il faut souder. Pour repiquer le +5v et la sortie de la patte 16 de l’ULA.

Et voila le proto fonctionne tip top.

Next Step, la production dès reception du matériel chinois a souder et de la plaque.

Posted in BlaBla, Electro | Tagged , | Leave a comment

Dumper une EEprom d’Arduino, the hardest way.

Petit retour sur le dump d’EEprom sur Arduino Uno car vider l’eeprom de son Atmel ATmega328p n’est pas si simple.

L’Eeprom est une mémoire non volatile qui peut être lue et écrit depuis son petit programme Arduino. un genre de disque dur.

Prenons le programme suivant qui écrit HELLO au début de l’eeprom.

#include <EEPROM.h>

void setup() 
{   
  EEPROM.write(0,'H');
  EEPROM.write(1,'E');
  EEPROM.write(2,'L');
  EEPROM.write(3,'L');
  EEPROM.write(4,'O');
}

void loop() {
}

Si on se rappelle de https://thanat0s.trollprod.org/2014/01/dumper-un-arduino ils semble que l’on puisse utiliser ce vieux tutorial pour dumper l’eeprom au lieu de la flash.

Avec Avrdude, J’utilise la command -D -Ueeprom:r:/tmp/eeprom.hex:r

D pour dump, U pour la dire quoi.. ici l’Eeprom directement au format binaire ( :r pour raw) .

$ ./avrdude -carduino -P/dev/cu.usbmodem14101 -b115200 -p atmega328p -v -C /Applications/Arduino.app/Contents/Java/hardware/tools/avr/etc/avrdude.conf  -D -Ueeprom:r:/tmp/eeprom.hex:r

avrdude: Version 6.3-20171130
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2014 Joerg Wunsch

         System wide configuration file is "/Applications/Arduino.app/Contents/Java/hardware/tools/avr/etc/avrdude.conf"
         User configuration file is "/Users/thanat0s/.avrduderc"
         User configuration file does not exist or is not a regular file, skipping

         Using Port                    : /dev/cu.usbmodem14101
         Using Programmer              : arduino
         Overriding Baud Rate          : 115200
         AVR Part                      : ATmega328P
         Chip Erase delay              : 9000 us
         PAGEL                         : PD7
         BS2                           : PC2
         RESET disposition             : dedicated
         RETRY pulse                   : SCK
         serial program mode           : yes
         parallel program mode         : yes
         Timeout                       : 200
         StabDelay                     : 100
         CmdexeDelay                   : 25
         SyncLoops                     : 32
         ByteDelay                     : 0
         PollIndex                     : 3
         PollValue                     : 0x53
         Memory Detail                 :

                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           eeprom        65    20     4    0 no       1024    4      0  3600  3600 0xff 0xff
           flash         65     6   128    0 yes     32768  128    256  4500  4500 0xff 0xff
           lfuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           hfuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           efuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           lock           0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           calibration    0     0     0    0 no          1    0      0     0     0 0x00 0x00
           signature      0     0     0    0 no          3    0      0     0     0 0x00 0x00

         Programmer Type : Arduino
         Description     : Arduino
         Hardware Version: 3
         Firmware Version: 4.4
         Vtarget         : 0.3 V
         Varef           : 0.3 V
         Oscillator      : 28.800 kHz
         SCK period      : 3.3 us

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude: Device signature = 0x1e950f (probably m328p)
avrdude: safemode: lfuse reads as 0
avrdude: safemode: hfuse reads as 0
avrdude: safemode: efuse reads as 0
avrdude: reading eeprom memory:

Reading | ################################################## | 100% 2.10s

avrdude: writing output file "/tmp/eeprom.hex"

avrdude: safemode: lfuse reads as 0
avrdude: safemode: hfuse reads as 0
avrdude: safemode: efuse reads as 0
avrdude: safemode: Fuses OK (E:00, H:00, L:00)

avrdude done.  Thank you.

En plus tout se passe bien, la taille est bonne, MAIS le problème c’est que le dump au final est fort étrange… Il est ou le HELLO ?? c’est quoi ce fatra ??

$ hexdump -C /tmp/eeprom.hex | head
00000000  0c 94 34 00 0c 94 46 00  0c 94 46 00 0c 94 46 00  |..4...F...F...F.|
00000010  0c 94 46 00 0c 94 46 00  0c 94 46 00 0c 94 46 00  |..F...F...F...F.|
*
00000040  0c 94 4a 00 0c 94 46 00  0c 94 46 00 0c 94 46 00  |..J...F...F...F.|
00000050  0c 94 46 00 0c 94 46 00  0c 94 46 00 0c 94 46 00  |..F...F...F...F.|
00000060  0c 94 46 00 0c 94 46 00  11 24 1f be cf ef d8 e0  |..F...F..$......|
00000070  de bf cd bf 21 e0 a0 e0  b1 e0 01 c0 1d 92 a9 30  |....!..........0|
00000080  b2 07 e1 f7 0e 94 94 00  0c 94 05 01 0c 94 00 00  |................|
00000090  0c 94 f7 00 1f 92 0f 92  0f b6 0f 92 11 24 2f 93  |.............$/.|
000000a0  3f 93 8f 93 9f 93 af 93  bf 93 80 91 05 01 90 91  |?...............|

On se rend vite compte que le Bitonio nous prends pour un lapin. En fait, si on utilise son Arduino Uno directement via USB pour dumper l’Eeprom du microcontrolleur Atmel, on se rend vite compte que l’eeprom n’est pas accessible et que on n’as pas vraiment accès a tout ce que l’on croit. En place de l’eeprom avec la bonne commande pour eeprom sous avrdude, il dump toujours la flash !

Impossible de lui dumper l’eeprom. Ce qu’il faut comprendre c’est que la partie “flashing” du Arduino quand on passe par la carte Arduino Uno est controlée par un genre de bios. le BootLoader. Ce bootloader ( voir ici : https://github.com/Optiboot/optiboot ) nommé optiboot, s’occupe de la gestion du flash et est posé a la fin de l’espace mémoire de la flash du microcontrolleur.

C’est lui qui entre autre au reboot regarde si il voit arriver des commandes série pour flasher. Pour le détail de sa vie et son oeuvre c’est ici : ( https://github.com/Optiboot/optiboot/wiki/HowOptibootWorks ) Pour des raisons variée dont une est l’espace utilisé, tout n’est pas implémenté, il est impossible de dumper ou flasher l’eeprom via un Arduino Uno.

C’est documenté dans le code :)

   /* Write memory, length is big endian and is in bytes */
    else if(ch == STK_PROG_PAGE) {
    7ec4:	80 e0       	ldi	r24, 0x00	; 0
    7ec6:	e6 cf       	rjmp	.-52     	; 0x7e94 <main+0x90>
      // PROGRAM PAGE - we support flash programming only, not EEPROM
      uint8_t desttype;
      uint8_t *bufPtr;
      pagelen_t savelength;

Il faut donc pour dumper sereinement l’Eeprom du atmel avoir un vrai programmeur qui va parler  au Atmel directement via le protocol SPI ( Serial Peripheral Interface ), un protocole de communication qui nécessite 4 fils  ( MISO, MOSI, CLOCK et CS ) . Si vous voulez sombrer dans le détail c’est ici (https://fr.wikipedia.org/wiki/Serial_Peripheral_Interface).

Plusieurs options s’offrent alors a vous pour voir l’Eeprom, utiliser un montage de deux arduino pour avoir un programmeur SPI, ce montage s’appelle ArduinoISP voir ici  voir https://www.arduino.cc/en/Tutorial/ArduinoISP. Acheter un vrai programmeur, ou utiliser un Buspirate qui fera aussi l’affaire.

Dump…

$ ./avrdude -c buspirate -P /dev/cu.usbserial-AK05UZS1 -p atmega328p -v -C /Applications/Arduino.app/Contents/Java/hardware/tools/avr/etc/avrdude.conf  -D -Ueeprom:r:/tmp/eeprom.hex:r

avrdude: Version 6.3-20171130
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2014 Joerg Wunsch

         System wide configuration file is "/Applications/Arduino.app/Contents/Java/hardware/tools/avr/etc/avrdude.conf"
         User configuration file is "/Users/thanat0s/.avrduderc"
         User configuration file does not exist or is not a regular file, skipping

         Using Port                    : /dev/cu.usbserial-AK05UZS1
         Using Programmer              : buspirate
         AVR Part                      : ATmega328P
         Chip Erase delay              : 9000 us
         PAGEL                         : PD7
         BS2                           : PC2
         RESET disposition             : dedicated
         RETRY pulse                   : SCK
         serial program mode           : yes
         parallel program mode         : yes
         Timeout                       : 200
         StabDelay                     : 100
         CmdexeDelay                   : 25
         SyncLoops                     : 32
         ByteDelay                     : 0
         PollIndex                     : 3
         PollValue                     : 0x53
         Memory Detail                 :

                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           eeprom        65    20     4    0 no       1024    4      0  3600  3600 0xff 0xff
           flash         65     6   128    0 yes     32768  128    256  4500  4500 0xff 0xff
           lfuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           hfuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           efuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           lock           0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           calibration    0     0     0    0 no          1    0      0     0     0 0x00 0x00
           signature      0     0     0    0 no          3    0      0     0     0 0x00 0x00

         Programmer Type : BusPirate
         Description     : The Bus Pirate

Attempting to initiate BusPirate binary mode...
BusPirate binmode version: 1
BusPirate SPI version: 1
avrdude: Paged flash write enabled.
AVR Extended Commands not found.
avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.08s

avrdude: Device signature = 0x1e950f (probably m328p)
avrdude: safemode: lfuse reads as FF
avrdude: safemode: hfuse reads as DA
avrdude: safemode: efuse reads as FD
avrdude: reading eeprom memory:

Reading | ################################################## | 100% 32.76s

avrdude: writing output file "/tmp/eeprom.hex"

avrdude: safemode: lfuse reads as FF
avrdude: safemode: hfuse reads as DA
avrdude: safemode: efuse reads as FD
avrdude: safemode: Fuses OK (E:FD, H:DA, L:FF)
BusPirate is back in the text mode

avrdude done.  Thank you.

Et au final, victoire.

$ hexdump -C /tmp/eeprom.hex
00000000  48 45 4c 4c 4f ff ff ff  ff ff ff ff ff ff ff ff  |HELLO...........|
00000010  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|
*
00000400
Posted in Electro | Tagged , , | Leave a comment

MatBot, attaque du clair connu.

Ne voila t’il pas que, pour de sombres raisons, l’on m’a entrainé sur le chemin de Discord (ps.. je reste sur IRC) et de ses bots de tous poils. J’ai fait donc connaissance avec le bot “MatBot”.

https://discordbots.org/bot/265161580201771010
https://bots.discord.pw/bots/265161580201771010

En plus d’afficher des chats randoms il se propose de “chiffrer”…

Et là effectivement, ca donne envie de jouer avec dès que l’on se rend compte que “AAAAA” file toujours la même string chiffrée :)

Voici donc comment MatBot “Chiffre”.. si tenté qu’on puisse appeller cela chiffrer :).. Mais c’était sympas comme chall gratos, merci MatBot.

#!/usr/bin/env python3
# coding=utf-8
import sys
import base64

# wp3CnsKcwp3CpMKEwqfCosKnw47DiA==
key_a= [0x76, 0X7a, 0x71, 0x72, 0x76, 0xa5, 0x71, 0x74, 0x76, 0xa3, 0xa5, 0x79, 0x73, 0xa2, 0x72, 0xa6,
        0xa3, 0Xa7, 0xa3, 0x7a, 0x73, 0x72, 0x73, 0xa3, 0x7a, 0xa6, 0x7a, 0x78, 0x7a, 0x79, 0xa5, 0X75]


# Functions
def getparam(count):
    """Retrieve the parameters appended """
    if len(sys.argv) != count + 1:
        print('My command')
        print('To Use: %s ciphertext' % sys.argv[0])
        sys.exit(1)
    else:
        return sys.argv[1]


def main(): 
    bsecret = getparam(1)
    secret = base64.urlsafe_b64decode(bsecret.encode('utf8'))  # Decode B64
    i = 0
    delta = 0
    fresult = []
    for schar in secret:  # For each bytes
        if schar == 0xc3:  # Si c'est c3 on fera un shift moins grand
            delta = 0x40
        if (schar != 0xc2) and (schar != 0xc3):  # si c'est pas un char c2 c3
            cchar = schar - (key_a[i] - 0x41) + delta  # On shift le byte
            i = (i + 1) % (len(key_a))   # Rotation de l'index dans le tableau
            delta = 0
            fresult.append(chr(cchar))
    
    print(''.join(fresult))


if __name__ == '__main__':
    main()

Alors comment cela marche ?

Par exemple, la string “abcxyz” est chiffré en “wpbCm8KTwqnCrsOe”. c’est donc une string en base64… mais attention c’est la variante URL qui est utilisé (Avec des “_” et pas des “+” )
Cela donne pour “abcxyz” :

00000000  c2 96 c2 9b c2 93 c2 a9 c2 ae c3 9e              |Â.Â.Â.©®Ã.|

Il y a des 0xc2 et 0xc3 qui parsement aléatoirement ca et là le texte. Dans cet exemple c’est entre chaque charactères mais ce n’est pas systématique (why ?? j’ai pas compris). Et le chiffrement est en fait un décalage de byte basé sur des valeurs d’un array de 32 bytes. (On décale un peu moins si c’est un 0xc3 qui est devant ).

Dans le python ici pour la clef, c’est la valeur du codage de “A” (0x41) directement qui est dans le code. Je fais la soustraction dans la loop feignant que je suis…

J’ai regardé ce que ca pondait comme clef de chiffrement en ascii… c’est 59015d035bd82a1ebfb9212b9e9798d4 .. Ca sent le md5 mais on sais pas de quoi :) 

Et voila un chiffrement avec clef hardcodé fort étrange :)

$./uncryptit.py wwobCrlfCmsKhwoTClcKmwqnCgsOHwqfCoMKBwpTDisKCw4nDisKawqY=
Qu'il est con ce chat
$./uncryptit.py woHCqMKiwpbCosKEwpnCo8Kow5fDkVjClsOQwp3DlMOUwobDlcKiwqZRwpPDj8Kew5llV8KcwqfDksKnwprCnMKkwpbCqcOZwqJTwpbDhsONwqjCm8OUwpTDjsOQw43CgsKewp7CmsKmwo5Zw5jCnsKbWcKcw5NUwprCosKlwqTCosOTwpRTwqnDh8ORwqjCocOTUcOOw5DDicOLwp3Cm8KVwqfDkMKtwoXCrsKrWcKkw4XClsKkwqvClVHCmsOYUMKXwqTDjsOTwqrCl8KBwp7DhsOJw5TDg1nCk8KdwpvDk8Kuw4Zn
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
$./uncryptit.py wpbCpcKcwpbCr8KEwqPClMKhw5fDmFjCl8OVUcOHw5HDlMOQwp5Swp_Cp8OLwq3ChVo=
allez salut et bonne nuit !

Voila voila… c’est pas otr quoi faites gaffe jeunes teenagers :)

Posted in Challenge, Crypto | Tagged , , , | Leave a comment

Conservation Nationale

Google ayant supprimé le compte des petits margoulins vendant Infinity Keylogger (Et c’est bien normal). Il m’a quand même semblé important de conserver ce truc drolesque au possible…

Here it is ….

VIDEO Here : Infinity keylogger SMTP FTP PHP 13 STEALERS MUTEX UNICODE All OS 32-64 BIT

Ref initiale : https://www.youtube.com/watch?v=y1wkMf23bPY

 

 

Posted in BlaBla, Malware | Leave a comment

SSH agent qui marche sur MacOs Sierra

Bon, depuis l’uprgrade en sierra, cet animal ne se souvient pas que j’ai déja rentré le password de ma clef et me le demande a chaque connection…

La soluce est dans mon .ssh/config désormais avec le addkeystoagent.

host *

   UseKeychain yes

   AddKeysToAgent yes

   IdentityFile ~/.ssh/id_rsa

   UseRoaming no

 

Posted in BlaBla, Desktop, Mac | Tagged , | Leave a comment

CrossCompiler un python en PE pour windows avec juste ton linux console

Parce que défois, t’as besoins…  et que t’aime faire des trucs sales.

Soit ton super programme test.py et une debian.

pyinstaller pour faire les exe est livré avec python 2.7. On install le 2.6 via winetricks pour que ce soit facile.

sudo apt-get install winetricks
winetricks python26
wget https://www.python.org/ftp/python/2.7.13/python-2.7.13.msi
wine msiexec /i python-2.7.13.msi /L*v log.txt

Et il suffit de compiler

wine ~/.wine/drive_c/Python27/Scripts/pyinstaller.exe --onefile test.py

Victoire

#file dist/test.exe
dist/test.exe: PE32 executable (console) Intel 80386 (stripped to external PDB), for MS Windows, UPX compressed

 

Posted in Linux, Windows | Tagged | Leave a comment

Conservation Nationale

J’ai pris sur moi de mirrorer ce monument ludique qu’est ce tuto de RE de keygenning avec DORA. J’espère que les auteurs ++Meat et Haiklr que je ne connais pas ne m’en voudront pas ! Je suis Fan.

C’est un devoir de mémoire obligatoire !

Ze Tutorial !

Les fichiers et autre…

 

Enjoy !

Posted in BlaBla, Reverse | Tagged | 1 Comment

Determiner si on est sur une machine 32 ou 64bits ApiLess

Ca faisait longtemps hein… Je suis tombé sur un vieux truc, mais je n’en avait pas conscience. Un process 32Bits peut facilement déterminer si il tourne sur une machine 32 Bits ou 64 Bits sous WoW64 en regardant la valeur du registre de code CS. Ainsi, pas besoin de faire le moindre API Call.

Si c’est 0x1B c’est un Os 32Bits, Si c’est 0x23 c’est un Os 64Bits sur WoW… Si c’est 0x33 ca sera un process 64 bits dans un os 64Bits… (et là y a du trick pour faire du tourner du code 64bits dans un process 32 on fera plus tard, c’est fun).

Donc le code est simple avec un petit décalage de bit on a 0 pour 32 bits ou 1 pour 64 Bits os.

global _is3264
_is3264:

      xor   eax,eax  ; Cleanup partie haute du registre

      mov   ax,cs    ; Récupération du code segment

      shr   eax,5     ; Decalage des bits a droite 

      ret

Et c’est tout… un wrapper pour les plus feignants..

#include <stdio.h>
#include <string.h>

unsigned int extern is3264() asm ("_is3264"); 


// Main programm
int main(){
	if (is3264() == 0) {
        printf ("It is a 32bits Windows\n");
    } else {
        printf ("It is a 64bits Windows\n");
    }
    return(0);
}

Et le Makefile qui va bien

all: is3264.exe

clean:
	rm *.exe *.o

is3264.exe: is3264.c is3264.asm
	yasm -f win32 -g cv8 -m x86 is3264.asm -o is3264.o
	i586-mingw32msvc-gcc is3264.o is3264.c -o is3264.exe

A+

Posted in Asm, Hacking, Windows | Tagged | 2 Comments

Bypass de Cuckoo, la méthode HackedTeam

Bien… Comme tout le monde, c’est bien évidemment que je suis allé voir le code de nos amis transalpins. Et quel joie de trouver une solution de bypass de Cuckoo que je ne connaissait pas.

Le code officiel est là :
https://github.com/hackedteam/scout-win/blob/master/core-scout-win32/antivm.cpp

Et attention, c’est rapide :)

mov eax, fs:[0x44]; // save old value
mov _pOld, eax; 
mov eax, _pFake;  // replace with fake value
mov fs:[0x44], eax;

suivis de

CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) Sleep, (LPVOID) 1000, 0, NULL);•

Encore un tripotage obscur du PEB. Ce qu’il font c’est substituer le vrai FS[0x44] (alias PEB:TLSBitmapBits ) part un champ initialisé de 409600 bytes à n’importe quoi (mais pas 0). Et ils démarrent une tread (ici sleep mais n’importe quoi ca le fait aussi). Et force est de constater que cela stoppe NET notre brave cuckoo qui pense que c’est finis à en croire le rapport de Malwr.

Malwr Report

C’est affligeant de simplicité d’ou mon intérêt. Et j’ai du chercher pour comprendre le miracle… Donc, le TLSBitmap..TLS ca veut dire Thread Local Storage, C’est la que notre windows maintient les datas pour la thread courante. C’est que qui sert à notre windows pour stocker toutes plein d’infos relative à notre thread. Et le fait de switcher cela et d’appeler une api pour starter une nouvelle thread semble compliquer la vie de cukoo. J’avoue franchement ne pas avoir compris en quoi cela ne perturbait pas aussi un vrai windows, mais force est de constater, que sans cela, même sous wine, ce code fonctionne parfaitement.

$ wine anti_cuckoo.exe 2>/dev/null 
Malloc and Set to 1
Miracle begins
Back to work if not cuckoo

Il n’y a que sur cuckoo que cela stop tout !

Ci-dessous une version compilable avec MingGW

#include "windows.h"
#include <stdio.h>


PDWORD pOld, pFake;

int main() {
  printf("Malloc and Set to 1\n");
  pFake = (LPDWORD) malloc(4096*100);
  memset(pFake, 1, 4096*100);

  printf("Miracle begins\n");

  asm (
    "mov eax, fs:[0x44];" // save old value
    "mov _pOld, eax;"

    "mov eax, _pFake;" // replace with fake value
    "mov fs:[0x44], eax;"
  );

  // this will not be logged nor executed.
  CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) Sleep, (LPVOID) 1000, 0, NULL); 

  asm(
    "mov eax, _pOld;"  // restore old value, not reached if cuckoo
    "mov fs:[0x44], eax;"
  );

  printf("Back to work if not cuckoo\n");
  free(pFake);
  Sleep(10000);
  return(0);
}

Etonnant ces transalpins. !

Posted in Asm, Coding, Malware, Reverse | Tagged , , , , , | 4 Comments

Trouver le setup et le main sur l’arduino…

Suite a une question de mon unique lecteur :) voici quelque précisions concernant le loading et les routines de base d’un code arduino dans IDA.

Loader un binaire

Donc je ne revient pas sur le setup d’IDA et la création du fichier de RAM de votre programme (non il n’y a toujours pas de script magique :)… voir ici et faire le setup avant de continuer ici…

Petites précisions pour loader le binaire dans IDA;

Premièrement choisir AVR dans la grande liste de CPU

ida_a

 

Choisir uniquement ROM

 

ida_b

 

Choisir le cpu, si ca couine …. on dit ok hein :)

 

ida_c

 

Et enfin a la rom dire cancel…

ida_d

Vous pouvez alors suivre la procédure pour créer votre ram et la loader….

Trouver le main

Bon si on regarde juste après la procédure de recopie de la “rom” en “ram” expliqué dans notre précédent article on vois toujours la même structure de code par après. Un call et Un jmp.

ida_e

le jmp envois le code dans une loop infinie pour tanker le programme, le call sub_200 juste avant, c’est lui le main() “arduino”. main() que l’on ne vois jamais dans le code source et qui s’occupe d’appeler notre “setup()” et lancer le fameux “loop()”.

Le 1er call (sub_12D ici) s’occupe lui aussi d’initialiser des choses dont on n’a même pas conscience :)

ida_f

 

Voila bon RE

Posted in Asm, Reverse | Tagged , , | 6 Comments