fix more broken markdown links
We fix more markdown links in markdown files that refer to files internally to the web site. Added tmp tools to find and print various markdown links: * `tmp/md-links.sh` - print all markdown links * `tmp/md-token-links.sh` - print all markdown links that start with a **%%TOKEN%%** * `tmp/md-local-links.sh` - print all markdown links to a local file * `tmp/md-link-paths.sh` - print local file paths referenced in markdown links Fixed a number of markdown formatting problems with `thanks-for-help.md`. Fixed markdown links to files in `thanks-for-help.md`. Improved heading levels in `thanks-for-help.md`, and made entry sections consistent. Changed all markdown links that end in "))" to end in a better way. Explained in `markdown.md` why we are avoiding markdown links that end in "))". Ran `make www` to perform the above. TODO: Fix stuff we broke by mistake doing the above. TODO: Fix more broken markdown links.
This commit is contained in:
1 parent
60960e1650
commit
4f95e3f3d6
174 files changed
+4008
-2029
No files matched your search
+14
-14
@@ -93,7 +93,7 @@ the rules were changed, requesting non-machine specific code.
|
||||
|
||||
This program was selected for the 1987 t-shirt collection.
|
||||
|
||||
The C startup routine (via [crt0.o](https://en.wikipedia.org/wiki/Crt0))
|
||||
The C startup routine, via [crt0.o](https://en.wikipedia.org/wiki/Crt0),
|
||||
transfers control to a location named `main`. In this case, `main` just happens
|
||||
to be in the data area. The array of `short`s, which has been further
|
||||
obfuscated by use of different data types, just happens to form a meaningful set
|
||||
@@ -188,10 +188,10 @@ since there was no CS curriculum when we started). We had an assignment to
|
||||
create a pair of programs for the computer networks course. The programs were
|
||||
supposed to send data reliably from one program to the other over an unreliable
|
||||
channel. This channel was simulated with a pair of
|
||||
[pipes](https://en.wikipedia.org/wiki/Pipeline_(software)).
|
||||
[pipes](https://en.wikipedia.org/wiki/Pipeline_(software)).
|
||||
|
||||
We decided for fun to create an
|
||||
[obfuscated](https://en.wikipedia.org/wiki/Obfuscation_(software)) set of
|
||||
[obfuscated](https://en.wikipedia.org/wiki/Obfuscation_(software)) set of
|
||||
programs, only for the
|
||||
[PDP](https://en.wikipedia.org/wiki/Programmed_Data_Processor), to do this, but
|
||||
circumventing the channel (i.e. cheating, hence the needed obfuscation). Our
|
||||
@@ -207,12 +207,12 @@ there](https://groups.google.com/g/net.lang.c/c/lx-TAuEyeRI/m/HdOOnNx6LC0J) and
|
||||
it.
|
||||
|
||||
Since we had just recently created these [obfuscated
|
||||
programs](https://en.wikipedia.org/wiki/Obfuscation_(software)) we decided we could
|
||||
programs](https://en.wikipedia.org/wiki/Obfuscation_(software)) we decided we could
|
||||
use the same technique for an obfuscated C program. We upped the ante a bit by
|
||||
making it "portable".
|
||||
|
||||
To add to the
|
||||
[obfuscation](https://en.wikipedia.org/wiki/Obfuscation_(software)), we used
|
||||
[obfuscation](https://en.wikipedia.org/wiki/Obfuscation_(software)), we used
|
||||
different formats for the integers in the array: some in decimal, some in octal,
|
||||
some in hexadecimal, and when the value would fit, some as an ASCII character.
|
||||
|
||||
@@ -230,7 +230,7 @@ Our program is idempotent under `cb`.
|
||||
|
||||
When this program is compiled, the compiler places the array somewhere in
|
||||
memory, just like it places any compiled code somewhere in memory. Usually, the
|
||||
C startup code ([crt0.o](https://en.wikipedia.org/wiki/Crt0)) calls a routine
|
||||
C startup code, [crt0.o](https://en.wikipedia.org/wiki/Crt0), calls a routine
|
||||
named `main()`. The loader fills in the address in the startup code, but at
|
||||
least on the old systems where this program ran, it doesn't know that the
|
||||
`main()` in this program isn't code but data!
|
||||
@@ -242,13 +242,13 @@ both a [PDP-11](https://en.wikipedia.org/wiki/PDP-11) and a
|
||||
|
||||
On the [VAX](https://en.wikipedia.org/wiki/VAX), the routine `main()` is called
|
||||
with the `calls` instruction. This instruction uses the first (2-byte)
|
||||
[word](https://en.wikipedia.org/wiki/Word_(computer_architecture)) of the called
|
||||
[word](https://en.wikipedia.org/wiki/Word_(computer_architecture)) of the called
|
||||
routine as a mask of
|
||||
[registers](https://en.wikipedia.org/wiki/Processor_register) that are to be
|
||||
saved on the [stack](https://en.wikipedia.org/wiki/Stack_(abstract_data_type)).
|
||||
saved on the [stack](https://en.wikipedia.org/wiki/Stack(abstract_data_type)).
|
||||
In other words, on the VAX the first word can be anything. On the
|
||||
[PDP](https://en.wikipedia.org/wiki/Programmed_Data_Processor), the first word
|
||||
is a [branch](https://en.wikipedia.org/wiki/Branch_(computer_science))
|
||||
is a [branch](https://en.wikipedia.org/wiki/Branch_(computer_science))
|
||||
[instruction](https://en.wikipedia.org/wiki/Instruction_set_architecture#Instructions)
|
||||
that branches over the VAX code. The PDP and VAX codes are thus completely
|
||||
separate.
|
||||
@@ -356,7 +356,7 @@ program that we came up with is as follows:
|
||||
|
||||
The first word (after the label `vax`) is the
|
||||
[PDP](https://en.wikipedia.org/wiki/Programmed_Data_Processor) [branch
|
||||
instruction](https://en.wikipedia.org/wiki/Branch_(computer_science)).
|
||||
instruction](https://en.wikipedia.org/wiki/Branch_(computer_science)).
|
||||
[PDP](https://en.wikipedia.org/wiki/Programmed_Data_Processor) branch
|
||||
instructions are octal `400` + the distance divided by `2`. The string that both
|
||||
the [PDP](https://en.wikipedia.org/wiki/Programmed_Data_Processor) and
|
||||
@@ -366,10 +366,10 @@ programs use is after the `str` label, and the
|
||||
`pdp` label.
|
||||
|
||||
On the [VAX](https://en.wikipedia.org/wiki/VAX), the program
|
||||
[pushes](https://en.wikipedia.org/wiki/Stack_(abstract_data_type)) 9 (the length
|
||||
of the string), the address of the string and 1 (the [file
|
||||
[pushes](https://en.wikipedia.org/wiki/Stack_(abstract_data_type)) 9 (the length
|
||||
of the string), the address of the string and 1, the [file
|
||||
descriptor](https://en.wikipedia.org/wiki/File_descriptor) on the
|
||||
[stack](https://en.wikipedia.org/wiki/Stack_(abstract_data_type))) and calls
|
||||
[stack](https://en.wikipedia.org/wiki/Stack_(abstract_data_type)), and calls
|
||||
`write(2)`. Since we didn't know the exact calling sequence for [system
|
||||
calls](https://en.wikipedia.org/wiki/System_call), we just copied the source for
|
||||
the `write(2)` system call stub into our program. After `write(2)` finishes, the
|
||||
@@ -455,7 +455,7 @@ The only problem we had was that the program had chosen an
|
||||
Since everybody knows what a [PDP-11](https://en.wikipedia.org/wiki/PDP-11)
|
||||
branch instruction looks like (everyone knows that the traditional magic word
|
||||
for an executable, `0407`, is a [PDP-11](https://en.wikipedia.org/wiki/PDP-11)
|
||||
[branch](https://en.wikipedia.org/wiki/Branch_(computer_science))), we changed
|
||||
[branch](https://en.wikipedia.org/wiki/Branch_(computer_science)), we changed
|
||||
that to [decimal](https://en.wikipedia.org/wiki/Decimal). After checking the
|
||||
size of the resulting program we saw that it was one byte too long. The limit
|
||||
was 512 bytes, and our program was 513 bytes. So we changed the word `and` in
|
||||
|
||||
@@ -452,7 +452,7 @@ that has ever been received! Like all great contest entries, it resulted in a
|
||||
change of rules for the following year. To prevent a flood of similar programs,
|
||||
the rules were changed, requesting non-machine specific code.</p>
|
||||
<p>This program was selected for the 1987 t-shirt collection.</p>
|
||||
<p>The C startup routine (via <a href="https://en.wikipedia.org/wiki/Crt0">crt0.o</a>)
|
||||
<p>The C startup routine, via <a href="https://en.wikipedia.org/wiki/Crt0">crt0.o</a>,
|
||||
transfers control to a location named <code>main</code>. In this case, <code>main</code> just happens
|
||||
to be in the data area. The array of <code>short</code>s, which has been further
|
||||
obfuscated by use of different data types, just happens to form a meaningful set
|
||||
@@ -549,7 +549,7 @@ Our program is idempotent under <code>cb</code>.</p>
|
||||
<h3 id="more-detailed-analysis">More detailed analysis</h3>
|
||||
<p>When this program is compiled, the compiler places the array somewhere in
|
||||
memory, just like it places any compiled code somewhere in memory. Usually, the
|
||||
C startup code (<a href="https://en.wikipedia.org/wiki/Crt0">crt0.o</a>) calls a routine
|
||||
C startup code, <a href="https://en.wikipedia.org/wiki/Crt0">crt0.o</a>, calls a routine
|
||||
named <code>main()</code>. The loader fills in the address in the startup code, but at
|
||||
least on the old systems where this program ran, it doesn’t know that the
|
||||
<code>main()</code> in this program isn’t code but data!</p>
|
||||
@@ -562,7 +562,7 @@ with the <code>calls</code> instruction. This instruction uses the first (2-byte
|
||||
<a href="https://en.wikipedia.org/wiki/Word_(computer_architecture)">word</a> of the called
|
||||
routine as a mask of
|
||||
<a href="https://en.wikipedia.org/wiki/Processor_register">registers</a> that are to be
|
||||
saved on the <a href="https://en.wikipedia.org/wiki/Stack_(abstract_data_type)">stack</a>.
|
||||
saved on the <a href="https://en.wikipedia.org/wiki/Stack(abstract_data_type)">stack</a>.
|
||||
In other words, on the VAX the first word can be anything. On the
|
||||
<a href="https://en.wikipedia.org/wiki/Programmed_Data_Processor">PDP</a>, the first word
|
||||
is a <a href="https://en.wikipedia.org/wiki/Branch_(computer_science)">branch</a>
|
||||
@@ -664,9 +664,9 @@ programs use is after the <code>str</code> label, and the
|
||||
<code>pdp</code> label.</p>
|
||||
<p>On the <a href="https://en.wikipedia.org/wiki/VAX">VAX</a>, the program
|
||||
<a href="https://en.wikipedia.org/wiki/Stack_(abstract_data_type)">pushes</a> 9 (the length
|
||||
of the string), the address of the string and 1 (the <a href="https://en.wikipedia.org/wiki/File_descriptor">file
|
||||
of the string), the address of the string and 1, the <a href="https://en.wikipedia.org/wiki/File_descriptor">file
|
||||
descriptor</a> on the
|
||||
<a href="https://en.wikipedia.org/wiki/Stack_(abstract_data_type)">stack</a>) and calls
|
||||
<a href="https://en.wikipedia.org/wiki/Stack_(abstract_data_type)">stack</a>, and calls
|
||||
<code>write(2)</code>. Since we didn’t know the exact calling sequence for <a href="https://en.wikipedia.org/wiki/System_call">system
|
||||
calls</a>, we just copied the source for
|
||||
the <code>write(2)</code> system call stub into our program. After <code>write(2)</code> finishes, the
|
||||
@@ -745,7 +745,7 @@ The only problem we had was that the program had chosen an
|
||||
Since everybody knows what a <a href="https://en.wikipedia.org/wiki/PDP-11">PDP-11</a>
|
||||
branch instruction looks like (everyone knows that the traditional magic word
|
||||
for an executable, <code>0407</code>, is a <a href="https://en.wikipedia.org/wiki/PDP-11">PDP-11</a>
|
||||
<a href="https://en.wikipedia.org/wiki/Branch_(computer_science)">branch</a>), we changed
|
||||
<a href="https://en.wikipedia.org/wiki/Branch_(computer_science)">branch</a>, we changed
|
||||
that to <a href="https://en.wikipedia.org/wiki/Decimal">decimal</a>. After checking the
|
||||
size of the resulting program we saw that it was one byte too long. The limit
|
||||
was 512 bytes, and our program was 513 bytes. So we changed the word <code>and</code> in
|
||||
|
||||
Reference in new issue
Block a user