The bufbomb program reads a string from standard input with a
function getbuf having the following C code:
1. int getbuf()
2. {
3. char buf[12];
4. Gets(buf);
5. return 1;
6. }
The function Gets() is similar to the standard library function
gets()---it reads a string from standard input (terminated by
`\n' or end-of-file) and stores it (along with a null
terminator) at the specified destination. In this code, the
destination is an array buf having sufficient space for 12
characters.
Neither Gets() nor gets() have any way to determine whether
there is enough space at the destination to store the entire string.
Instead, they simply copy the entire string, possibly overrunning the
bounds of the storage allocated at the destination.
If the string typed by the user to {\tt getbuf} is no more than 11
characters long, it is clear that {\tt getbuf} will return 1, as shown
by the following execution example:
unix> bufbomb
Type string: howdy doody
Dud: getbuf returned 0x1
If we type a longer string, typically an error occurs:
unix> bufbomb
Type string: This string is too long
Ouch!: You caused a segmentation fault!
As the error message indicates, overrunning the buffer typically
causes the program state to be corrupted, leading to a memory access
error. Your task is to be more clever with the strings you feed
bufbomb so that it does more interesting things. These are called
exploit strings.
Bufbomb takes several different command line arguments:
- -t TEAM: Operate the bomb for the indicated team.
You should always provide this argument for several reasons:
- It is required to log your successful attacks.
- Bufbombdetermines the cookie you will be using based on
your team name, just as does the program makecookie.
- We have built features into bufbomb so that some of the key
stack addresses you will need to use depend on your team's cookie.
- -h: Print list of possible command line arguments
- -n: Operate in ``Nitro'' mode, as is used in Level 3 below.
Your exploit strings will typically contain byte values that do not
correspond to the ASCII values for printing characters. The program
sendstring can help you generate these raw strings. It
takes as input a hex-formatted string. In this format, each
byte value is represented by two hex digits. For example, the string
"012345" could be entered in hex format as "30 31 32 33 34 35", since
the ASCII code for decimal digit x is 0x3x.
Non-hex digit characters are ignored, including the blanks in the
example shown.
If you generate a hex-formatted exploit string in the file exploit.txt,
you can apply the raw string to bufbombin several different ways:
- You can set up a series of pipes to pass the string through
SENDSTRING.
unix> cat exploit.txt | sendstring | bufbomb -t bovik
- You can store the raw string in a file and use I/O redirection to
supply it to bufbomb:
unix> sendstring < exploit.txt > exploit-raw.txt
unix> bufbomb -t bovik < exploit-raw.txt
This approach can also be used when running bufbomb from within
gdb:
unix> gdb /afs/cs/academic/class/15213-s02/labs/L3/bufbomb
(gdb) run -t bovik < exploit-raw.txt
One important point: your exploit string must not contain byte value
0x0A at any intermediate position, since this is the ASCII code for
newline '\n'. When Gets() encounters this byte, it will assume you
intended to terminate the string. Sendstring will warn you if
it encounters this byte value.
When you correctly solve one of the levels, bufbomb
will automatically send an email notification to our grading server.
The server will test your exploit string to make sure it really works,
and it will update the lab web page indicating that your team (listed
by cookie) has completed this level.
Unlike the bomb lab, there is no penalty for making mistakes in this
lab. Feel free to fire away at bufbomb with any string you
like.