Mais um blog inútil.

Fail

Agosto 3, 2018

Arvorezinha em Progress 4GL

Arquivado em: arvorezinha, coding, drama, fail, serious-business, useless, work — madinfo @ 16:35

Boa tarde,

Já não blolava á anos… resolvi blolar sobre uma linguagem que se chama Progress 4GL ou OpenEdge Advanced Business Language (OpenEdge ABL).
É uma linguagem linda que mais se devia chamar REGRESS em vez de Progress.

Aqui fica o código:

DEFINE VARIABLE i AS INTEGER NO-UNDO.
&SCOPED-DEFINE NumLoops  5    
DEFINE VARIABLE charz AS CHARACTER NO-UNDO INITIAL "*".

 REPEAT i = 1 TO {&NumLoops}:
     
     DISPLAY charz.
     charz = charz + "*".
END.


MESSAGE "Fim!!"
    VIEW-AS ALERT-BOX INFO BUTTONS OK.

Digam lá que não é a melhor coisa do mundo ?

Outubro 13, 2017

Novo Speedtester da NOS

Arquivado em: drama, fail, windows — falso @ 21:49

Ora viva,

Eu recentemente tenho tido vários problemas com as internets da NOS à noite, e isso tem me feito andar a fazer diversos telefonemas a reclamar e a ser sempre obrigado a correr o speedtester deles.

Até há poucos dias era uma cena normal.js que funcionava na maioria dos browsers, e uma applet JEWVA para o IE com extra faggotry. Mas agora decidiram INOVAR, e quando se inicia o teste, força o download de um .exe que supostamente tens que correr para fazer o speedtest, se não tiveres Windoze, azarito, não tens direito a te queixares com problemas de internets.

Bem, um .exe vindo da NOS não me parece uma boa ideia, então primeiro decidi enviar o executável para o virustotal para fazer scans, e o resultado foi:

Achei estranho como é normal, e ainda mais estranho eles não terem visto isto antes. Bora la então tentar ver o que isto faz. Vi que o executável era .NET portanto fui procurar um .NET decompiler, usei o ILSpy e vi o seguinte:

Achei que aquela string era um argumento para qualquer coisa Windoze based devido aos /qqcoisa, então googlando pela string achei este artigo, que explica que isto é usado para correr uma aplicação e apaga-la quando ela termina.

Passando para o MainForm, vi o seguinte:

Que mostra que tem outro executável embutido nele, extrai-o e executa, reparei também que no site da NOS, cada utilizador que faz download do speedtest, o ficheiro tem um nome diferente, chama-se “xperienceApp_XXXXXXXXXXXXXXXXXXXXX.exe” sendo o X diferente para cada utilizador ou cada IP da NOS que faz download do ficheiro, ainda não entendi bem isso, mas pelo que entendi esse ID é que depois é utilizado quando se faz o upload do resultado dos testes, portanto deve ser possível aldrabar isto :-P

Fui então tentar sacar os executaveis embutidos, e lembrei-me logo do binwalk, o resultado é o seguinte:

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             Microsoft executable, portable (PE)
...
507768        0x7BF78         Microsoft executable, portable (PE)
...
887308        0xD8A0C         Microsoft executable, portable (PE)
...

Mandei um binwalk -D ‘microsoft:exe’ xperienceApp_XXX.exe e passei ter mais dois executáveis gulosos. Então siga aprender a usar o radare2 só para dar numa de elite!

O primeiro executável, nas strings tem referencias ao curl, portanto faz requests para algum lado :-)

Depois fui cuscar o main, como vi antes, parece ir buscar um id, que pelos vistos é um ticket number ao NOME do executável, não ponho o dissassembly todo porque são mil linhas:

push str.xperienceApp       ; 0x457728 ; "xperienceApp"
...
push 0x457738               ; "_"
...
push 0x457740               ; ".exe"
...
push 0x456c68               ; "_"
...
push str.Ticket_Number:__s_n ; 0x456c6c ; "Ticket Number: %s\n"
...
push str.Wrong_Application_Name__Please_download_the_application_again__n ; 0x456c80 ; "Wrong Application Name (Please download the application again)\n"

Mais para baixo também tem umas strings gulosas:

push 0x456e50               ; "Kanguru.exe"
...
push 0x456e5c               ; "UIMain.exe"
...
push 0x456e68               ; "Optimus Kanguru.exe"
...
push 0x456e7c               ; "MphoneTools.exe"
...
push 0x456e8c               ; "AT+CIMI\r"
...
push 0x456edc               ; "AT+CGSN\r"
...
push str.IMEI               ; 0x456e98 ; "IMEI"
...
push str.Exception_when_try_to_open_COM_Port_n ; 0x456ee8 ; "Exception when try to open COM Port\n"

Diria que estão a procurar se esses executáveis estão a correr, que são clientes de modems 3G, e a ligar-se ao modem, a sacar a rede a que está ligada, o serial number e o IMEI, vai-se la entender porque é que o speedtest precisa disto tudo :-)

Mais para baixo, faz downloads em modo sequencial e paralelo via curl, e envia os dados para um servidor, por HTTP, porque HTTPS é coisa do futuro. E não tem mais nada.

Seguindo para o próximo, cuscando as strings, também usa o curl, porque raio é preciso outro programa?

string=\pcdiag_tempFile.txt
string=wmic os get freephysicalmemory
string=%s > %s%s
string=wmic os get caption
string= nicconfig where IPEnabled=True get Caption /format:table
string=netsh wlan show interfaces
string= PROCESS get name / Format:table
string=wmic /output:%s%s %s
string=netsh advfirewall show allprofiles state
string=wmic NIC where NetEnabled=true get Name, Speed | find "%s"
string=results_content: %s \n
string=PC Results Sended\n

( SENDED LOL)

Pelo que vi no dissassembly deste, tem as mesmas funcionalidades do anterior, mas tem uma parte EXTRA chamada “PC_Diagnostic” que cria um ficheiro temporário, e corre uma carrada de comandos do Windoze, manda o output para la, e provavelmente depois envia esse ficheiro para o servidor deles, novamente por http.

  • Vê a lista dos processos que estão a correr;
  • Corre o wmic para obter montes de informações do PC e dos interfaces de rede;
  • Apaga a KEY “ProxyBypass” no registry em HKCU\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\INTERNET SETTINGS\ZONEMAP e em “HKLM\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\INTERNET SETTINGS\ZONEMAP”;
  • Le o “HKLM\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\APP PATHS\CMD.EXE” que contem uma lista de apps instaladas;

Bem, para poder reclamar sem correr esta sida no meu PC, decidi sacar uma VM com o Windoze, e testar isto lá.

Pelos vistos analisar o executável no virustotal foi o que chegou para ficar blacklisted no Windoze Defender. Que LOLocausto. Então siga desactivar o Windoze Defender para poder correr isto numa VM para poder ligar para la a reclamar que tenho a net lixada…

Após estar ali um tempo a engonhar, a app saiu, o browser ficou à espera, e acabou por dar esse erro.

O pessoal que só usa Linux ou OSX deve também estar fascinado com esta mudança, não consigo entender como em 2017, onde existem mil ferramentas em JS pro browser, fds… o speedtest.net usa js e html5 e funciona bem, não entendo como pareceu bem na cabeça de alguém obrigar as pessoas a sacar um executável para correr.

Entendo que queiram sacar essas informações ao utilizador NORMIE para ajudar a diagnosticar problemas que possam não estar relacionados com o serviço deles, mas ao menos separavam isso numa ferramenta diferente, não punham isso no speedtest.
E também convinha fazerem isto de uma forma menos SHADY porque esconder executáveis dentro de outro executável é logo meio caminho andado para bater com os dentes no anti vírus.

Sinceramente agora nem sei o que fazer, porque nem consigo correr o speedtest para reclamar do serviço, portanto decidi vir blogar sobre isso.

Edit: Pelos vistos eles já adicionaram o tester antigo novamente ao site, portanto já não devo pelo menos ser obrigado a correr isto :-)

Edit2: Já rolaram cabeças em algum lado, e o teste já não está online, já voltou o antigo a ser o default.

Dezembro 26, 2011

Como não ganhar um iPad 2

Arquivado em: coding, cracking, drama, fail, useless — falso @ 03:09

Boas noites,

Venho hoje aqui blogar a minha tristeza ao saber que a password do concurso para ganhar um iPad 2 no Pplware é alta string manhosa.

Vou começar então a falar da minha jornada para tentar ganhar isto…

Comecei por andar a procurar qual era o software que usava a extensão “xcon”, um amigo meu descobriu entretanto que era o Conceal, um software todo manhoso em .NET.
Experimentei umas passwords básicas no programa só para ver se advinhava antes de fazer alguma coisa mais complexa, mas o programa era tão manhoso que se usasse uma password invalida ele crashava, então desisti dessa aproximação.

Falei com um amigo meu todo cromo da criptografia e ele automagicamente disse-me que aquilo eram blocos de TripleDES CBC.

Caso os senhores do Pplware não saibam, bruteforcar TripleDes não é assim pêra doce, citando a Wikipedia (está sempre correcta :-P):

“Deep Crack was designed by Cryptography Research, Inc., Advanced Wireless Technologies and the EFF. …  Advanced Wireless Technologies built 1856 custom ASICDES chips housed on 29 circuit boards of 64 chips each. The boards were then fitted in six cabinets and mounted in a Sun-4/470 chassis. … The entire machine was capable of testing over 90 billion keys per second. It would take about 9 days to test every possible key at that rate. On average, the correct key would be found in half that time.

Entretanto, eu sem sabendo que era alta string manhosa, e pensando que a password poderia ser o titulo de algum dos produtos entre 50 e 100€, fiz um scriptzinho que ia la parsar o site do OfficeLan e sacar de la os títulos todos (faz uso do phpQuery):

<head>
  <meta http-equiv="content-type" content="text/html; charset=utf-8" />
</head>
<?php

require('phpQuery.php');

// batota, tem o total hardcoded
for($start = 0; $start <= 120; $start = $start + 20) {
	$url = 'http://shop.officelan.pt/pesquisa.html?start='.$start;
	$fields = array(
		'yagendoo_price_min'=>urlencode('50'),
		'yagendoo_price_max'=>urlencode('100'),
		'option'=>urlencode('com_yagendoo_vmsearch'),
	);
	$fields_string = "";
	foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&'; }
	rtrim($fields_string,'&');

	$ch = curl_init();
	curl_setopt($ch,CURLOPT_URL,$url);
	curl_setopt($ch,CURLOPT_POST,count($fields));
	curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

	$result = curl_exec($ch);

	curl_close($ch);

	$doc = phpQuery::newDocument($result);
	phpQuery::selectDocument($doc);

	foreach(pq('span.yagendoo_searchresult_title a') as $product) {
			echo $product->nodeValue;
			echo '<br/>';
	}
}

E com o resultado fui experimentar o seguinte:

<?php

$produtos = array(
  'MikroTik RouterBOARD 411U (Level 4) - RB411U - RB/411U',
  'MikroTik RouterBOARD 411AR (Level 4) - RB411AR - RB/411AR',
  ...
  'ANTENA INTERLINE SECTORIAL 12dBi/2.4GHz Mimo',
  'ANTENA INTERLINE SECTORIAL 12dBi/2.4GHz',
  'Presente', 'Presente_Natal', 'Presente_Natal.zip',
  'OfficeLan', 'pplware', 'natal',
);

$string = file_get_contents('nome_produto_offiLan.xcon');
foreach($produtos as $key) {
	$output = mcrypt_decrypt( MCRYPT_3DES , $key , $string , 'cbc');
	echo '<h4>'.$key.'</h4>';
	echo '<pre>'.$output.'</pre>';
}

Mas sem grandes resultados… Então foi que me disseram que o TripleDES CBC alem de uma key na cifra usa também outra variável, que é o IV (Initialization vector), que pelo que entendi, são dados usados para “inicializar” a cifra.
Então o tal programa tinha de usar algum algoritmo para “gerar” um IV a partir da nossa password ou então usava algum valor fixo, decidi tentar descobrir.

Andei a procura de técnicas sobre reversing a cenas .NET e achei alta programinha hacker, .NET Reflector.
Neste belo software, abre-se um executável .NET e ele escreve mais ou menos o codigo desse executável em belíssimo código C#, só os nomes de algumas funções e variáveis é que se perdem…

Então abri o executável do Conceal, e andei la a vasculhar, e no Form2 achei lá uma função chamada tdes_decrypt() e vi que era a função desejada, mas que a key e o IV eram calculados noutro lado, então com outra feature bonita deste programa, fiz Analyze nessa função e vi que era chamada pela func2(), e BINGO nessa achei o algoritmo que era usado para a key e o IV.

Decidi então criar um novo projecto C# no Visual Studio, onde iria utilizar o código do programa gerado pelo Reflector, mas podia-lhe alimentar um array gigante de passwords (a lista de produtos anterior). E com poucas dificuldades consegui mete-lo a funcionar, mas rapidamente vi que nenhuma das passwords que estava tentar usar era a correcta.
Sem saber mais o que tentar, rapidamente desisti…

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;
using System.IO;

namespace unconceal
{
    class Program
    {
        public static void tdes_decrypt(String inputfile, String outputfile, byte[] key, byte[] IV)
        {
            long bytecount = 0L;
            long fread_len = 0L;
            int numbytes = 0;
            byte[] mybuffer = new byte[0xf4241]; 
            TripleDESCryptoServiceProvider tdesProvider;
            CryptoStream cryptStream;

            FileStream freader = new FileStream(inputfile, FileMode.Open, FileAccess.ReadWrite);
            FileStream fwriter = new FileStream(outputfile, FileMode.OpenOrCreate, FileAccess.Write);

            fread_len = freader.Length;

            tdesProvider = new TripleDESCryptoServiceProvider();
            tdesProvider.Key = key;
            tdesProvider.IV = IV;
            tdesProvider.Padding = PaddingMode.Zeros;

            cryptStream = new CryptoStream(fwriter, tdesProvider.CreateDecryptor(), CryptoStreamMode.Write);
            int num = 0;
            num = inputfile.Length - 1;

            while (bytecount < fread_len)
            {
                numbytes = freader.Read(mybuffer, 0, 0xf4240);
                cryptStream.Write(mybuffer, 0, numbytes);
                bytecount += numbytes;
            }

            while (bytecount % 8 != 0)
            {
                cryptStream.WriteByte(0);
                bytecount++;
            }

            freader.Close();
            cryptStream.Close();
        }

        static void Main(string[] args)
        {
            List<string> passwords = new List<string>(new string[]
	        {
                "MikroTik RouterBOARD 411U (Level 4) - RB411U - RB/411U",
                "MikroTik RouterBOARD 411AR (Level 4) - RB411AR - RB/411AR",
                ...
                "ANTENA INTERLINE SECTORIAL 12dBi/2.4GHz Mimo",
                "ANTENA INTERLINE SECTORIAL 12dBi/2.4GHz",
                "Presente",
                "Presente_Natal",
                "Presente_Natal.zip",
                "OfficeLan",
                "pplware",
                "natal",
                "Natal",
                "iPad2",
                "Natal 2011",
                "PPLWARE.COM",
                "EBA428ECA16691133FA946FED56AF824E8527BB6",
                "_F2Liz12!" // password correct, mas só agora :(
        	});

            int x = 0;
            foreach (String for_keyf1 in passwords)
            {
                String password = for_keyf1.ToString();

                byte[] bytes = new byte[0x2710];
                int charIndex = 0;
                int length = for_keyf1.Length;
                byte[] buffer2 = new byte[length + 1];
                int index = 0;
                int num4 = 0;
                int num7 = length - 1;
                for (index = 0; index <= num7; index++)
                {
                    num4 += 3;
                    buffer2[index] = (byte)(Convert.ToInt64(for_keyf1[index]) + (index + num4));
                    num4--;
                }
                new ASCIIEncoding().GetBytes(Encoding.ASCII.GetString(buffer2), charIndex, Encoding.ASCII.GetString(buffer2).Length, bytes, charIndex);
                byte[] buffer3 = new SHA1CryptoServiceProvider().ComputeHash(bytes);

                byte[] key = new byte[24];
                key[0] = buffer3[2];
                key[1] = buffer3[6];
                key[2] = buffer3[0x12];
                key[3] = buffer3[0x10];
                key[4] = buffer3[0x13];
                key[5] = buffer3[1];
                key[6] = buffer3[9];
                key[7] = buffer3[7];
                key[8] = buffer3[14];
                key[9] = buffer3[3];
                key[10] = buffer3[8];
                key[11] = buffer3[0x11];
                key[12] = buffer3[10];
                key[13] = buffer3[15];
                key[14] = buffer3[0];
                key[15] = buffer3[11];
                key[0x10] = buffer3[9];
                key[0x11] = buffer3[4];
                key[0x12] = buffer3[0x12];
                key[0x13] = buffer3[5];
                key[20] = buffer3[11];
                key[0x15] = buffer3[2];
                key[0x16] = buffer3[0x13];
                key[0x17] = buffer3[0];

                byte[] iv = new byte[8];
                iv[0] = buffer3[2];
                iv[1] = buffer3[6];
                iv[2] = buffer3[0x12];
                iv[3] = buffer3[0x10];
                iv[4] = buffer3[0x13];
                iv[5] = buffer3[1];
                iv[6] = buffer3[9];
                iv[7] = buffer3[7];

                tdes_decrypt(@"C:\Users\falso\Documents\Visual Studio 2010\Projects\unconceal\unconceal\nome_produto_offiLan.xcon",
                    @"C:\Users\falso\Documents\Visual Studio 2010\Projects\unconceal\unconceal\" + x.ToString() + ".txt",
                    key, iv);

                string text = System.IO.File.ReadAllText(@"C:\Users\falso\Documents\Visual Studio 2010\Projects\unconceal\unconceal\" + x.ToString() + ".txt");
                System.Console.WriteLine("String = {0}", text);
                x++;
            }
        }
    }
}

Hoje dia 26 de Dezembro, lembrei-me de ir ver qual era afinal a password do concurso, e foi então que descobri que era “_F2Liz12!”, adicionei essa string ao meu programinha em C# e não é que funcionou?

Download do projecto unconceal (belo nome :-P) para Visual Studio, para caso alguém esteja interessado em brincar mais com isto. Não esquecer os caminhos que estão hardcoded ao chamar a função tdes_decrypt().

Acho que para a próxima os senhores do Pplware deviam fazer concursos mais bem pensados, onde ganhe quem acha o resultado final, e não quem escolhe um produto à sorte que esteja no intervalo de preços dito inicialmente (dor de corno).

Um abraço e até à próxima!

Outubro 28, 2010

Scam nos leilões do ClubeFashion

Arquivado em: drama, fail, serious-business, useless — falso @ 09:32

Ora viva amigos!

Hoje não venho aqui blogar de nada relativo a Informáticas, mas sim a um scam lindo que achei nas Internets portuguesas.

Então estava eu ontem muito bem no meu covil, a fazer a lida das coisas inúteis do dia-a-dia, quando a minha FC se vira para mim e diz-me que o site ClubeFashion (que já é conhecido por dar altas baldas de 1 e 2 meses para entregar as coisas que se compra la) agora tem leilões, e que haviam la pessoas a ganhar coisas mirabolantes por preços bues baratos.

Eu achei que isso cheirava a esturro, porque em Portugal, ninguém da nada a ninguém. Então decidi investigar melhor a coisa.

Então funciona desta maneira, para se licitar em algo, tem de se fazer um carregamento de “Bids” do site. 10 Bids = 5€, 20 Bids = 10€, etc.
Então basicamente sempre que se faz uma licitação, mesmo que não se ganhe, ou se alguém der um valor superior eles ganham logo 0.50€. Até aqui está MAIS ou MENOS bem, até que se entra na pagina de um leilão a decorrer actualmente…

Agora aqui é que parte a loiça toda. Pelos vistos (já tinha visto ontem à noite) os leilões arrancam sempre com o valor inicial de 1€. E depois temos a seguinte informação:

\* A sua licitação subirá o valor em 0.01€.
\* Abaixo de 2 MINUTOS, qualquer licitação reinicia o contador.

Então isto funciona mais ou menos assim, eles têm uma coisa para leiloar, mas com o dinheiro que vão ganhar com as licitações, vai chegar para pagar o que quer que estejam a leiloar, e ainda um lucro de mais de 100%. E claro que se o leilão estiver a acabar, sem terem sido feitas licitações suficientes, eles têm um script que faz automaticamente licitações com fake accounts, para o tempo nunca terminar até fazerem o dinheiro suficiente.

Vamos ver então um exemplo, a “Viagem Lufthansa para a Europa”, dizem que o PVP Loja é 358€ e quem ganhou o leilão, ganhou por 79.90€.
Então o leilão começa a 1€. 79.90€-1€ da 78.90, que dá 7890 licitações, então vamos ver, 7890 * 0.50€ = 3945€, então eles com este leilão da viagem que custava 358€ ganharam 3587€, está um belo negocio hein?

Bem, eu achei isto tanta roubalheira, que necessitei de vir blogar sobre isto, espero que gostem! E leiam tudo bem antes de serem enganados por estes sites malandros. Até à proxima, fiquem bem e joguem muito.

Setembro 2, 2010

Cena de Urso da Tipp-Ex

Arquivado em: fail, lulz, useless — armorfist @ 23:01

Boas amiguinhos!

Já não blogo há algum tempo, portanto aqui vai um post sobre uma coisa completamente inútil:

Um amigo meu mostrou-me nas internets uma cena fofi, que podem ver aqui:
http://www.youtube.com/profile?user=tippexperience&feature=iv&annotation_id=annotation_820885

Basicamente tens alto player etc e depois metes palavras (verbos) na caixinha de texto e mostra-te um video se existir. O problema é que eu sou preguiçoso e não me apetecia tar a pensar em palavras. Então decidi fazer alto scripte em php. Fui às internets, saquei uma lista de 600 e tais verbos mais usados em inglês e fiz o seguinte:

<?php
/*
Output:

No match:
<?xml version="1.0" encoding="utf-8" ?><datas><status>NO MATCH</status><url>gaC_66xPvBc</url><id>1</id><duration>0.001227855682373</duration></datas>
Match:
<?xml version="1.0" encoding="utf-8" ?><datas><status>MATCH</status><url>Ks_2nKOKVGg</url><cost>0</cost><id>38</id><duration>0.00061297416687012</duration></datas>
*/

//No execution timeout
set_time_limit(0); 

// Open Verb list
$handle = @fopen("verb_list.txt", "r");

if ($handle) 
    while (!feof($handle)) 
    {
		// Get word
        $word = fgets($handle, 4096);
		
		//Filter Word
		$word = trim(str_replace(array("\r\n", "\n", "\r"),'',$word));
		
		// Create a stream
		$opts = array(
		  'http' =>array(
			'header'  => "Content-type: application/x-www-form-urlencoded\r\n", 
			'method' =>"POST",
			'content' => http_build_query(array('words' => $word, 'language' => 'en')),
			'timeout' => 5, 
		  )
		);

		$context = stream_context_create($opts);

		// Open the file using the HTTP headers set above
		$file = file_get_contents('http://217.174.206.135/tippex/scripts/matchfinder.php', false, $context);

		// Make an Object out of the XML
		$xmlobj = simplexml_load_string($file);

		// Is it a MATCH?
		if ($xmlobj->status == 'MATCH')
			echo "<a href='http://www.youtube.com/watch?v=".$xmlobj->url."'>".$word."</a> - http://www.youtube.com/watch?v=".$xmlobj->url."<br/>";
		
		// No flood
		sleep(1);
    }
	
// Close file
fclose($handle);
?>

Os comentários estão em inglês porque estou habituado a faze-los em inglês. Basicamente deu-me a seguinte lista:

Lista Completa

Muitos vídeos estão repetidos, o que poderia ter sido evitado pois eles dão o ID do video no XML, mas só me lembrei disso depois e não me apetece fazer a filtragem agora. Talvez amanhã.

Espero que gostem!

Beijinhos abraços e muitos palhaços.

Setembro 1, 2010

Bus Pirate - Firmware update

Arquivado em: drama, fail, useless — thread @ 23:04

Bom noite amiguinhos!! (disseram-me que “amiguinhos” ficava muito gay, então decidi editar).

Estive quase para blogar sobre a aventura que foi conseguir recuperar a password neste blog inútil… mas fica para outra vez.

Ora estava eu hoje com vontade de arranjar problemas e decidi fazer um firmware update ao meu Bus Pirate. Dei uma vista de olhos na diagonal no site mas como não estava com muita paciencia para ler, decidi logo zergar à campeão e fiz logo o download do maior numero que sufixava o nome dos ficheiros de firmware disponiveis para download no repositório.

Mal aquilo acabou de sacar a coisa, liguei-me via serie ao Bus Pirate, activei o bootloader mode, e em seguida fiz logo cócó:

Pronto… depois de rapidamente perceber que tinha brickado o Bus Pirate, também percebi que esta coisa ia tentar rescrever o bootloader que por sua vez estava activo.. e não ia poder ser re-escrito!

Agora sim, tinha um desafio e uma vontade enorme de fazer serão à volta disto para o unbrickar.
E decidi também blogar sobre isto caso alguem faça o mesmo cócó que eu fiz… pode ser que seja uma coisa pouco útil dentro desta vasta inutiilidade que estão para ver!

Comecei pelo que pensei ser o caminho mais simples… dado que o Bus Pirate tem uma interface ICSP, decidi tentar aceder directamente à pic com o auxilio dum pic debugger/programmer.

Portanto peguei então no lixo seguinte:

Montei o estaminé seguinte:

Alimentado pela besta seguinte:

Ora resumindo pseudo-tecnicamente a coisa, fiz o seguinte:
Interliguei o pickit3 ao interface ICSP do bus pirate com os cabinhos e alimentado por uma fonte de alimentação… (que podia ser 2 pilhas ou usar o próprio pickit3.. mas achei que assim ficava mais giro e tenho de dar uso as inutilidades cá de casa!) E as relações de cor/função na foto são:

amarelo -> MCLR | vermelho -> 3.3V | preto -> ground | azul -> PGD | verde -> PGC

Após esta cangalhada estar bem ligada, deve acender um led vermelhinho e outro verde no bus pirate. Se não acender e se eventualmente cheirar a queimado significa que têm de encomendar umas coisinhas na farnell ou assim.
Dado isto, está na altura de aproveitar o que o opensource tem de bom, e descarregar uma versão qualquer das sources do bus pirate para a sua amada pic. Decidi descarregar primeiro as sources da versão 4.3 e abri no mplab. (Nota… se realmente estiverem a salvar um bus pirate e queiram poupar tempo e trabalho… passem já para a parte final do post onde tem uns procedimentos de 1 a 15, que indica como flashar um bootloader e firmware com hex files, poupando assim a trabalhera de compilar as coisas todas.)

Algo importante a referir aqui, é que caso estejam a fazer este procedimento, devem instalar o mplab juntamente com outro pacote da microchip -> O mplab c30 (pode ser a versão LITE) que contem o toolkit para compilar e linkar os projects para pic24’s (que vêm no bus pirate v3).

Caso tudo esteja correcto, indo a Project -> Build all deverão obter o resultado seguinte:

Agora só se tem que selecionar o programador que vai ser usado para escrever o firmware.. que neste caso é um pickit3: Programmer -> Select Programmer -> 4 Pickit3.

E selecionar o pic em questão… que no caso do meu bus pirate v3 é o PIC24FJ64GA002 (mais alguem que esteja a fazer isto, deverá conferir a sopa de letras na pic do seu bus pirate e selecionar a correspondente): Configure -> Select Device -> Device:

Com isto, penso que é seguro dizer que se pode ir a Programmer -> Program, que deverá dar o seguinte resultado:

Agora só têm que desligar a fonte de alimentação, desligar o pickit3, retirar os cabinhos todos do interface ICSP, ligar por usb ao pc, e abrir um terminal na COMx correspondente e ver se o gajo respira:

E parece que sim! De novo à vida inútil, pronto para ir para a prateleira mais uns meses apanhar pó…

Agora já só falta colocar um bootloader nisto, que como podem ver está com a v255.255 que quer dizer isso mesmo que estão a pensar.

Para poupar espaço no blog, vou apenas referir os procedimentos sem estar a largar mais screenshots.

1 - ligar novamente o bus pirate ao pickit3 com os passinhos todos anteriores.
2 - abrir o mplab
3 - ir a File -> Import -> selecionar o .hex file que contem o bootloader desejado. No meu caso: BPv3-Bootloader-v4.4.hex
4 - Selecionar o programador em Programmer -> Select Programmer e selecionar o device em Configure -> Select Device
5 - ir a Programmer -> Program
6 - se não houver erros, desligar o bus pirate do pickit3 e da alimentação (verificar que o bus pirate está mesmo desligado)
7 - short entre PDC e PGD (basicamente, ligar o cabo azul ao verde)
8 - Ligar o bus pirate por usb
9 - tentar pingar o bootloader com: pirate-loader.exe –dev=COM3 –hello
10 - Se não houver erros até aqui, estamos prontos para colocar novamente um firmware, neste caso será o último, o 5.7
11 - Abrir o ds30 Loader GUI.exe (esta util bem como o pirate-loader encontram-se no pacote de update de firmware/bootloader que se pode descarregar do repositorio de code do bus pirate).
12 - Selecionar o BPv3-Firmware-v5.7.hex e pressionar “Download” (claro está que se quiserem uma versão custom da coisa, têm que sacar a source, compilar, etc.. basicamente seguir os passos descritos anteriormente neste post).
13 - Se não houver erros, desligar o bus pirate do usb
14 - retirar o short entre o PDC e PGD (melhor ainda -> desligar todos os cabos… já não vão ser necessários)
15 - Ligar o bus pirate por usb novamente e aceder à consola pela respectiva COMx

Deverão ter o seguinte aspecto:

E pronto…

Agora que já vos gastei 5 ou 10 minutos do vosso tempo, já posso ir jogar Starcraft II.

Agosto 22, 2010

McEliece e a QFT

Arquivado em: fail, serious-business — dcoder @ 04:17

Nos últimos dias, tem andado uma notícia a passar pelos sites de notícias “científicas” que me chamou a atenção. Pela negativa. Pois parece que uns gajos quaisquer descobriram que o algoritmo proposto pelo McEliece em 1978 é resistente a “todos os ataques quânticos”. Que valente merda de “jornalismo”.

Quem se tivesse dado ao trabalho de ler o artigo tinha reparado que só foram considerados ataques baseados na QFT (Quantum Fourier Transform). A QFT é extremamente útil na análise de sistemas criptográficos, dado que permite detectar períodos de uma função consideravelmente mais rápido que um computador clássico. Isto é posto em uso no algoritmo de Shor e extensões do mesmo para quebrar sistemas baseados em factorização de inteiros (RSA), logaritmo discreto (DH, DSA), logaritmo discreto em curvas elípticas (ECDH, ECDSA), etc.

No caso do algoritmo de McEliece (mal escrito num dos artigos — será assim tão difícil?), o problema a resolver é consideravelmente diferente — trata-se de descodificar um código de Goppa aleatório. No caso genérico, este problema está na classe NP-hard, e não vai ter nenhuma aceleração exponencial no futuro. Como tal, o resultado obtido não é nenhuma surpresa, e nem sequer justifica chegar às notícias.

Finalmente, o argumento que o McEliece resiste a todos os ataques quânticos conhecidos simplesmente não é verdade. É sabido que o algoritmo de Grover acelera o processo de pesquisa quadraticamente; isto é usado eficientemente para acelerar o algoritmo clássico que quebra o McEliece, de forma a que sejam necessárias chaves 4 vezes maiores.

Maio 21, 2010

Cracking 102

Arquivado em: assembly, cracking, fail, useless — falso @ 20:21

Ora viva amigos!
Há uns dias lembrei-me do mítico Championship Manager Itália 94/95, e das múltiplas tentativas que fazia para o conseguir jogar devido à protecção anti-copia, que basicamente pedia o resultado do jogo X da pagina Y do manual.

Então lá eu ficava montes de tempo a experimentar combinações ate conseguir jogar. Nessa altura sonhava em conseguir crackar aquilo, mas skills de cracking nesse tempo eram quase nulos. Decidi então tentar hoje.

Abri o CM.EXE num dissassembler e procurei por “Please enter the result”, e vi onde essa string era referenciada, fui parar a uma função que me parecia que era onde era feito o check dos resultados, mas parecia um bocado complexa portanto decidi tentar outra aproximação, fui ver onde esta função do check era chamada e…

seg001:0054                         loc_18FE4:                              ; CODE XREF: _main+47j
seg001:0054 9A 25 00 E4 61                          call    sub_61E65       ; Função do check
seg001:0059
seg001:0059                         loc_18FE9:                              ; CODE XREF: _main+99j
seg001:0059 1E                                      push    ds
seg001:005A 68 18 01                                push    offset aChampionshipMa ; "Championship Manager Italia"
seg001:005D 9A F9 48 83 1A                          call    sub_1F129       ; Call Procedure
seg001:0062 1E                                      push    ds
seg001:0063 68 35 01                                push    offset aHelpNewGameCon ; "*Help|New Game|Continue Season|Quick St"...

Vi que o código a seguir ao CALL parecia ser o menu inicial do jogo então alterei os 5 bytes do CALL para 90 (NOP - No OPeration) e não é que foi logo? A parte do check já nem aparece, vai logo directamente para o menu inicial!
Melhor que isto só mesmo o Benfica ser campeão, oh wait…

Março 9, 2010

Mais um ano, mais um ataque.

Arquivado em: fail, serious-business, useless — dcoder @ 16:45

As notícias sobre tecnologia cada vez mais se aproximam às notícias sobre terrorismo ou epidemias. Há dias, foi apresentado um artigo sobre um novo ataque ao RSA [PDF], baseado em falhas, que pôs a blogosfera em polvorosa. Existe alguma razão para isto? Absolutamente não.

É bem sabido que existem imensas classes de ataques que podem afectar implementações perfeitamente correctas do RSA (e não só).  Em particular, este novo ataque usa falhas geradas por flutuações de voltagem exteriores à máquina para derivar bits da chave privada. Nada de novo. Este ataque já tinha sido proposto em pelo menos 2006. Ataques baseados em outros tipos de falhas são mais do que conhecidos, alguns deles tendo sido usados para quebrar os smartcards da TV Cabo (glitching).

Como é comum para qualquer ataque bem conhecido, existem maneiras de proteger implementações contra o mesmo. Isto é uma completa não-notícia, e só mostra como blogs e bloggers são absolutamente lixo no que toca a apresentar notícias com algum tipo de rigor e isenção.

Fevereiro 7, 2010

COMIC STRIP OFICIAL DO BLOL, LOL (UPDATED)

Arquivado em: fail, lulz, useless — sadik @ 23:45