The program asks you your name, and prints out something like this (where the user input and program output are indicated by font style):
$ grader
What is your name?
Bob
Thank you, Bob.
I recommend that you get a grade of D on this assignment.
However, the author of the program inexplicably has forgotten to do bounds-checking on the array into which it reads the input, and therefore it is vulnerable to attack.
Lectures and precepts will explain such "buffer overrun" (alias "buffer overflow") attacks. The paper entitled "Detection and Prevention of Stack Buffer Overflow Attacks" by Kuperman et al also does so. That paper is on electronic reserve at Princeton's library; you can access it through Princeton's Blackboard system by selecting the COS 217 course and clicking on "E-Reserves."
$ grader < data
What is your name?
Thank you, Bob.
I recommend that you get a grade of A on this assignment.
As you can see from reading the program, it is not designed to give anyone an A under any circumstances. However, it is programmed sloppily: it reads the input into a buffer, but forgets to check whether the input fits. This means that a too-long input can overwrite other important memory, and you can trick the program into giving you an A.
This assignment has five parts:
"If you were to use a buffer overrun attack to knowingly gain unauthorized access or to cause damage to other people's computers, the Computer Fraud and Abuse Act provides a maximum penalty of _______ years in prison for a first offense. However, the creator of the Melissa virus plea-bargained down to ______ months in prison."
$ gdb grader (gdb) x/68i readStringCopy the resulting 68 lines of text into a text file named memorymap, and then annotate the code to explain what's going on. You should use the source code in grader.c as a reference, and indeed your annotation should consist of showing how the machine code corresponds to the C code. You don't need an annotation for every line of machine code. Your annotations should note where local variables and parameters are stored.
$ gdb grader (gdb) print &grade (gdb) print gradePlace a table in your memorymap file showing the layout of the data section. The table should have three columns: Address (in hex), Contents (in hex), and Description. The table should contain only one row.
$ gdb grader (gdb) print &NamePlace a table in your memorymap file showing the layout of the bss section. The table should have three columns: Address (in hex), Contents (in hex), and Description. The table should contain one row for each element of the Name array.
At the start of program execution, the contents of the Name array will be zeros. Later during program execution, the Name array will contain more interesting data. The table in your memorymap file should show the contents of the Name array near the end of program execution using data from Part A (as described below).
$ gdb grader (gdb) break *readString+73 (gdb) run Type a name (gdb) print $esp (gdb) print $ebp (gdb) x/??b $esp (where ?? is the appropriate number of bytes)Place a table in your memorymap file showing the layout of the stack frame. The table should have three columns: Address, Contents (in hex), and Description. Each address should be expressed as a positive offset relative to the ESP register. The table should contain one row for each byte in the readString() stack frame, from the first byte pointed to by ESP through the last byte of the return address. The table should show the contents of the readString() function's stack frame when the function has read "normal" data.
The createdataC.c program should write to the dataC file; it should not write to stdout.
The createdataB.c program should write to the dataB file; it should not write to stdout.
The createdataA.c program should write to the dataA file; it should not write to stdout.
For parts B and A, if your name is very long, you should use just the first 15 characters of your name for the purposes of this assignment.
On some versions of Linux, executing instructions from the data section causes a segmentation violation. The purpose of this is to defend against buffer overrun attacks! The mprotect() call in our sample program is to disable this protection. You're not required to understand or explain how this line works. Note, however, that this mechanism (even if we didn't disable it) would not defend against the "B" attack.
You may work with one partner on this assignment. You need not work with a partner, but we prefer that you do. If you work with a partner, then only one of the partners should submit work. The readme file should contain your name and your partner's name.
Create your programs on hats using the bash shell, xemacs, gcc, and gdb.
The directory /u/cos217/Assignment6 contains the grader.c and grader files. It also contains a makefile that you might find useful during development.
Create a readme text file that contains:
Submit your work electronically on hats via the commands:
/u/cos217/bin/i686/submit 6 createdataC.c createdataB.c createdataA.c /u/cos217/bin/i686/submit 6 memorymap readme
When we grade this assignment, we will take the recommendation of the grader program into account. But that will not be the only criterion. In particular, see the grade percentages noted above.
As always, we will grade your work on quality from both the user's and programmer's points of view. Each C program should contain function-level and local comments as appropriate, as well as an explanation of the program's principles of operation. To encourage good coding practices, we will compile using "gcc -Wall -ansi -pedantic" and take off points based on warning messages during compilation.
This assignment was written by Andrew Appel with contributions by Robert M. Dondero, Jr.