Objectives
The purpose of this tutorial is to establish the fact that an external input being stored in a buffer can change the contents of another local variable in vicinity.
Jargon
- Buffer
- Continuous bytes of data / information stored in memory to temporary use
Pre-requisite installations
None
Exercises
Files for exercise
buffovfvar.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char const *argv[])
{
volatile int flag = 0;
unsigned char username[16];
if(argc > 1) {
strcpy(username, argv[1]);
} else {
printf("Usage: buffovfvar username\n");
exit(EXIT_FAILURE);
}
if (flag == 0) {
printf("Flag is zero: %d\n", flag);
} else {
printf("Flag is non-zero: %d\n", flag);
}
return 0;
}
1
2
gcc -o buffovfvar buffovfvar.c --no-stack-protector\
-mpreferred-stack-boundary=2 -m32 -z execstack
Exercise 1: Overflow the buffer such that the variables in vicinity are in our control
After compiling the program bufferovfvar.c
, lets execute it with two set of inputs as follows:
Input | Value | Description |
---|---|---|
Input 1 | aaaaaaaaaaaaaaaab | 16 bytes of a followed by 1 byte of character b |
Input 2 | aaaaaaaaaaaaaaaabb | 16 bytes of a followed by 2 bytes of character bb |
Below is the outcome when the we execute the binary with Input 1
and Input 2
When we give the first Input 1
the flag gets printed as value 98
decimal. The following snapshot validate the results. For quick reference of ascii
chart type the following command:
1
man ascii
Look at the snapshot below to understand why the flag
variable has the decimal value 25186
when we pass the second Input 2
to the binary.
Conclusion
Thus this proves that we are able to control the value of variables in vicinity of our buffer.