漏洞基础打底(一)

0x0000   名词解释

       漏洞利用(exploit)                             恶意代码(shellcode)

 

0x0001     初级栈溢出

         代码:

#include <stdio.h>
#define PASSWORD "1234567"
int verify_password (char *password)
{
  int authenticated;
  char buffer[8];  // add local buff to be overflowed
  authenticated=strcmp(password,PASSWORD);
  strcpy(buffer,password);  //over flowed here!  
  return authenticated;
}
main()
{
  int valid_flag=0;
  char password[1024];
  while(1)
  {
    printf("please input password:       ");
    scanf("%s",password);
    valid_flag = verify_password(password);
    if(valid_flag)
    {
      printf("incorrect password!\n\n");
    }
    else
    {
      printf("Congratulation! You have passed the verification!\n");
      break;
    }
  }
}

代码分析:定义PASSWORD = 1234567与输入的password比较,一样返回0 ,否则1或-1,把password给buffer,主函数if(flag)为0则假,不执行,

溢出原因分析:没考虑buffer的容纳长度,如果输入大于8个长度,则超出buffer申请的内存长度,造成溢出。

详解:当函数verify_password被调用时,会分配一段连续内存空间变量与紧紧相邻

用户输入拷贝进buffer,当超过8个,就会溢出到紧邻的authenticated,破坏他的值,内存中的数据按照4字节(DWORD)逆序存储,所以authenticated为1时,内存中存的是0x01000000,而代码中

If(0)则为假,所以当你错误密码进入时,改变值后,程序就会出错。

posted @ 2016-10-14 22:33  Sm411Veg  阅读(189)  评论(0编辑  收藏  举报