Description
Buffer overflow errors are characterized by the overwriting of memory fragments of the process, which should have never been modified intentionally or unintentionally. Overwriting values of the IP (Instruction Pointer), BP (Base Pointer) and other registers causes exceptions, segmentation faults, and other errors to occur. Usually these errors end execution of the application in an unexpected way. Buffer overflow errors occur when we operate on buffers of char type.
BO errors (common name for this kind of errors) are simply stack overflow or he overflow errors. We don't distinguish between these two in this article to avoid reader's confusion.
Below examples are written in C language under GNU/Linux system on x86 architecture.
Risk Factors
TBD
Examples
Example 1
#include <stdio.h> int main(int argc, char **argv) { char buf[8]; // buffer for eight characters gets(buf); // read from stdio (sensitive function!) printf("%s\n", buf); // print out data stored in buf return 0; // 0 as return value }
This very simple application reads from the standard input an array of the characters, and copies it into the buffer of the char type. The size of this buffer is eight characters. After that, the contents of the buffer is displayed and the application exits.
Program compilation:
rezos@spin ~/inzynieria $ gcc bo-simple.c -o bo-simple /tmp/ccECXQAX.o: In function `main': bo-simple.c:(.text+0x17): warning: the `gets' function is dangerous and should not be used.
At this stage, even the compiler suggests that the function gets() isn't safe.
Usage example:
rezos@spin ~/inzynieria $ ./bo-simple // program start 1234 // we eneter "1234" string from the keyboard 1234 // program prints out the conent of the buffer rezos@spin ~/inzynieria $ ./bo-simple // start 123456789012 // we eneter "123456789012" 123456789012 // content of the buffer "buf" ?!?! Segmentation fault // information about memory segmenatation fault
We manage (un)luckily to execute the faulty operation by the program, and provoke it to exit abnormally.
Problem analysis:
The program calls a function, which operates on the char type buffer and does no checks against overflowing the size assigned to this buffer. As a result, it is possible to intentionally or unintentionally store more data in the buffer, which will cause an error. The following question arises: The buffer stores only eight characters, so why did function printf() display twelve?. The answer comes from the process memory organisation. Four characters which overflowed the buffer also overwrite the value stored in one of the registers, which was necessary for the correct function return. Memory continuity resulted in printing out the data stored in this memory area.
Example 2
#include <stdio.h> #include <string.h> void doit(void) { char buf[8]; gets(buf); printf("%s\n", buf); } int main(void) { printf("So... The End...\n"); doit(); printf("or... maybe not?\n"); return 0; }
This example is analogous to the first one. In addition, before and after the doit() function, we have two calls to function printf().
Compilation: rezos@dojo-labs ~/owasp/buffer_overflow $ gcc example02.c -o example02 -ggdb /tmp/cccbMjcN.o: In function `doit': /home/rezos/owasp/buffer_overflow/example02.c:8: warning: the `gets' function is dangerous and should not be used. Usage example: rezos@dojo-labs ~/owasp/buffer_overflow $ ./example02 So... The End... TEST // user data on input TEST // print out stored user data or... maybe not?
The program between the two defined printf() calls displays the content of the buffer, which is filled with data entered by the user.
rezos@dojo-labs ~/owasp/buffer_overflow $ ./example02 So... The End... TEST123456789 TEST123456789 Segmentation fault
Because the size of the buffer was defined (char buf[8]) and it was filled it with thirteen characters of char type, the buffer was overflowed.
If our binary application is in ELF format, then we are able to use an objdump program to analise it and find necessery information to exploit the buffer overflow error.
Below is output produced by the objdump. From that output we are able to find addresses, where printf() is called (0x80483d6 and 0x80483e7).
rezos@dojo-labs ~/owasp/buffer_overflow $ objdump -d ./example02 080483be <main>: 80483be: 8d 4c 24 04 lea 0x4(%esp),%ecx 80483c2: 83 e4 f0 and $0xfffffff0,%esp 80483c5: ff 71 fc pushl 0xfffffffc(%ecx) 80483c8: 55 push %ebp 80483c9: 89 e5 mov %esp,%ebp 80483cb: 51 push %ecx 80483cc: 83 ec 04 sub $0x4,%esp 80483cf: c7 04 24 bc 84 04 08 movl $0x80484bc,(%esp) 80483d6: e8 f5 fe ff ff call 80482d0 <puts@plt> 80483db: e8 c0 ff ff ff call 80483a0 <doit> 80483e0: c7 04 24 cd 84 04 08 movl $0x80484cd,(%esp) 80483e7: e8 e4 fe ff ff call 80482d0 <puts@plt> 80483ec: b8 00 00 00 00 mov $0x0,%eax 80483f1: 83 c4 04 add $0x4,%esp 80483f4: 59 pop %ecx 80483f5: 5d pop %ebp 80483f6: 8d 61 fc lea 0xfffffffc(%ecx),%esp 80483f9: c3 ret 80483fa: 90 nop 80483fb: 90 nop
If the second call to printf() would inform the administrator about user logout (e.g. closed session), then we can try to omit this step and finish without the call to printf().
rezos@dojo-labs ~/owasp/buffer_overflow $ perl -e 'print "A"x12 ."\xf9\x83\x04\x08"' | ./example02 So... The End... AAAAAAAAAAAAu*. Segmentation fault
The application finished its execution with segmentation fault, but the second call to printf() had no place.
A few words of explanation:
perl -e 'print "A"x12 ."\xf9\x83\x04\x08"' - will print out twelve "A" characters and then four characters, which are in fact an address of the instruction we want to execute. Why twelve?
8 // size of buf (char buf[8]) + 4 // four additional bytes for overwriting stack frame pointer ---- 12
Problem analysis:
The issue is the same as in the first example. There is no control over the size of the copied buffer into the previously declared one. In this example we overwrite the EIP register with address 0x080483f9, which is in fact a call to ret in the last phase of the program execution.
How to use buffer overflow errors in a different way?
Generally, exploitation of these errors may lead to:
- application DoS
- reordering execution of functions
- code execution (if we are able to inject the shellcode, described in the separate document)
How are buffer overflow errors are made?
These kinds of errors are very easy to make. For years they were a programmer's nightmare. The problem lies in native C functions, which don't care about doing appropriate buffer length checks. Below is the list of such functions and, if they exist, their safe equivalents:
- gets() -> fgets() - read characters
- strcpy() -> strncpy() - copy content of the buffer
- strcat() -> strncat() - buffer concatenation
- sprintf() -> snprintf() - fill buffer with data of different types
- (f)scanf() - read from STDIN
- getwd() - return working directory
- realpath() - return absolute (full) path
Use safe equivalent functions, which check the buffers length, whenever it's possible. Namely:
- gets() -> fgets()
- strcpy() -> strncpy()
- strcat() -> strncat()
- sprintf() -> snprintf()
Those functions which don't have safe equivalents should be rewritten with safe checks implemented. Time spent on that will benefit in the future. Remember that you have to do it only once.
Use compilers, which are able to identify unsafe functions, logic errors and check if the memory is overwritten when and where it shouldn't be.
Hello, Need hacking services?Be warned, most of these so called hackers here are impostors, I know how real hackers work, they never advertise themselves in such a credulous manner and they are always discrete. I’ve been ripped off so many times out of desperation trying to find urgent help to change my school results, finally my friend introduced me to a reliable hacker who work with discretion and delivers, he does all sorts of hacks but he helped me;
ReplyDelete-Changed my school grades
-Hacked my cheating boyfriend email/facebook,whatsapp,instagram,with snapchat
-The most of it all, he helped me with Western union money transfer and i tracked and confirm the money before i paid him his fee. I have made him my permanent hacker and you can as well enjoy his services.You can contact him at BESTHACKGAME@GMAIL.COM request for any hacking services and also endeavor to spread the good news on how he helped you.
Tell him Sandra reffered you.
Hello, Need hacking services?Be warned, most of these so called hackers here are impostors, I know how real hackers work, they never advertise themselves in such a credulous manner and they are always discrete. I’ve been ripped off so many times out of desperation trying to find urgent help to change my school results, finally my friend introduced me to a reliable hacker who work with discretion and delivers, he does all sorts of hacks but he helped me;
ReplyDelete-Changed my school grades
-Hacked my cheating boyfriend email/facebook,whatsapp,instagram,with snapchat
-The most of it all, he helped me with Western union money transfer and i tracked and confirm the money before i paid him his fee. I have made him my permanent hacker and you can as well enjoy his services.You can contact him at BESTHACKGAME@GMAIL.COM request for any hacking services and also endeavor to spread the good news on how he helped you.
Tell him Sandra reffered you.
This professional hacker is absolutely reliable and I strongly recommend him for any type of hack you require. I know this because I have hired him severally for various hacks and he has never disappointed me nor any of my friends who have hired him too, he can help you with any of the following hacks:
ReplyDelete-Phone hacks (remotely)
-Credit repair
-Bitcoin recovery (any cryptocurrency)
-Make money from home (USA only)
-Social media hacks
-Website hacks
-Erase criminal records (USA & Canada only)
-Grade change
Email: onlineghosthacker247@ gmail .com
ReplyDeleteIf you ever want to change or up your university grades contact cybergolden hacker he'll get it done and show a proof of work done before payment. He's efficient, reliable and affordable. He can also perform all sorts of hacks including text, whatsapp, password decrypt,hack any mobile phone, Escape Bancruptcy, Delete Criminal Records and the rest
Email: cybergoldenhacker at gmail dot com
ReplyDeleteAre you interested in the service of a hacker to get into a phone, facebook account, snapchat, Instagram, yahoo, Whatsapp, get verified on any social network account, increase your followers by any amount, bank wire and bank transfer. Contact him on= hackintechnology.com hackintechnology@gmail.com +12132951376(WHATSAPP)
I was so anxiuos to know what my husband was always doing late outside the house so i started contacting hackers and was scamed severly until i almost gave up then i contacted this one hacker and he delivered a good job showing evidences i needed from the apps on his phone like whatsapp,facebook,instagram and others and i went ahead to file my divorce papers with the evidences i got,He also went ahead to get me back some of my lost money i sent to those other fake hackers,every dollar i spent on these jobs was worth it.Contact him so he also help you.
ReplyDeletemail: premiumhackservices@gmail.com
text or call +1 4016006790
He is a professional hacker, he is absolutely reliable and I strongly recommend him for any types of hacking jobs you require. why i said this is because I have engaged him severally in various hacking jobs and he has never disappointed me nor any of my friends who have hired him also, He has really proven himself to be a professional and a reliable hacker, He can help you out with any hacking jobs including this:
ReplyDelete-Cell Phones hacking (remotely)
-Credit Repair
-Bitcoin Recovery (Any type of Cryptocurrencies)
-Make money from Home (Any Countries)
-Social media Hacking
-Website Hacking
-Erasing of criminal Records (Any Countries)
-Grade Change
Email him via: hackingsetting50@gmail.com