漏洞基础打底(一)

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)则为假,所以当你错误密码进入时,改变值后,程序就会出错。

转载于:https://www.cnblogs.com/Sm411Veg/articles/5962350.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值