]> mj.ucw.cz Git - misc.git/blob - false-true/mktrue
Merge branch 'master' of git+ssh://git.ucw.cz/home/mj/GIT/misc
[misc.git] / false-true / mktrue
1 #!/usr/bin/perl
2 #
3 #       'False True' -- An Example of How Not To Write Code
4 #
5 #       (c) 1998 Martin Mares <mj@ucw.cz>, GPL'ed
6 #
7 # This is an attempt to write a shortest possible program which is still
8 # useful. I decided to make a replacement for `true' (anyway, `false' would
9 # fit in the same space as well). It is _NOT_ a correct ELF program (the
10 # headers are a bit messy and we have non-zero values in reserved fields
11 # and certain mandatory parts are missing), but `file' still recognizes
12 # it as ELF (although `objdump' doesn't) and, which is much more important,
13 # Linux kernel still runs it. Share and enjoy...
14 #
15
16 open X, ">true" or die "No write access, no truth";
17 while (<DATA>) {
18         s/#.*$//; s/\b(\w{4})(\w{4})\b/$2 $1/g; s/\b(\w\w)(\w\w)\b/$2 $1/g;
19         foreach $a (split /\s+/) { print X pack("c",hex $a); }
20 } chmod 0755, "true" or die "Executables aren't";
21
22 __END__
23
24 7f 45 4c 46                     # Identification
25 01                              # We're 32-bit
26 01                              # Little endian
27 01                              # Header version
28 # Next 9 bytes are ELF header padding and RFU, but we dare to put
29 # our code into them.
30 31 c0                           # xor eax,eax (offset 9)
31 40                              # inc eax
32 31 db                           # xor ebx,ebx
33 cd 80                           # int 0x80
34 4d 4a                           # Author's Signature :-)
35 0002                            # Type: Executable File
36 0003                            # Machine: i386
37 00000001                        # Version: Current :)
38 10000007                        # Entry point
39 0000002c                        # PH offset
40 00000000                        # SH offset
41 00000000                        # Machine-specific flags
42 0034                            # EH size
43 0020                            # Size of single PH entry
44 0001                            # Number of PH entries
45 0000                            # Size of single SH entry
46 0000                            # Number of SH entries
47 0000                            # String table offset
48
49 # Offset 2C: Program Header
50
51 # These two entries are overlaid with the ELF header
52 #00000001                       # Type: Loadable
53 #00000000                       # Offset of section start
54 10000000                        # Virtual address
55 10000000                        # Physical address: ignored
56 0000004c                        # File image size
57 0000004c                        # Memory image size
58 00000007                        # Flags: rwx
59 # Linux doesn't use alignment, so we can omit it. The kernel will try
60 # to read the full header size and get 4 bytes less, but it won't
61 # complain and it will use whatever was left in the memory. Ugly.
62 #00001000                       # Align to page size