首页
社区
课程
招聘
[原创]攻防世界PWN新手区:int_overflow
发表于: 2022-4-6 11:17 8028

[原创]攻防世界PWN新手区:int_overflow

2022-4-6 11:17
8028

一、基础信息探查:

常规流程:file、checksec和运行程序

 


 

开了NX保护

二、整数溢出:

根据题目的提示,这里的知识点是整数溢出,那么What is the int_flow?

 

由于整数在内存里面保存在一个固定长度的空间内,它能存储的最大值和最小值是固定的,如果我们尝试去存储一个数,而这个数又大于这个固定的最大值时,就会导致整数溢出。

 

具体的证书溢出看之前的笔记分析:
f17K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6E0j5h3N6F1K9h3k6A6j5$3g2F1N6q4)9J5k6s2y4&6M7Y4g2H3i4K6u0V1y4U0q4X3i4K6u0W2L8X3!0@1K9h3!0F1i4K6u0W2M7$3W2@1k6g2)9J5c8X3j5K6k6e0W2T1k6e0R3K6y4U0p5$3k6e0b7#2j5e0S2S2y4o6R3$3y4e0M7H3z5h3j5%4x3K6M7@1x3e0y4U0

三、逆向分析:

丢进ida32分析:

main()函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
int __cdecl main(int argc, const char **argv, const char **envp)
{
  int v4; // [esp+Ch] [ebp-Ch] BYREF
 
  setbuf(stdin, 0);
  setbuf(stdout, 0);
  setbuf(stderr, 0);
  puts("---------------------");
  puts("~~ Welcome to CTF! ~~");
  puts("       1.Login       ");
  puts("       2.Exit        ");
  puts("---------------------");
  printf("Your choice:");
  __isoc99_scanf("%d", &v4);
  if ( v4 == 1 )
  {
    login();
  }
  else
  {
    if ( v4 == 2 )
    {
      puts("Bye~");
      exit(0);
    }
    puts("Invalid Choice!");
  }
  return 0;
}

结合运行的结果可以知道主函数会接收一个值,然后做分支语句选择调用login()函数还是输出“Bye~”

login( )函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
char *login()
{
  char buf[512]; // [esp+0h] [ebp-228h] BYREF
  char s[40]; // [esp+200h] [ebp-28h] BYREF
 
  memset(s, 0, 0x20u);
  memset(buf, 0, sizeof(buf));
  puts("Please input your username:");
  read(0, s, 0x19u);
  printf("Hello %s\n", s);
  puts("Please input your passwd:");
  read(0, buf, 0x199u);
  return check_passwd(buf);
}

这个函数主要负责的就是接收用户名和密码,先判断这里是否有溢出点:buf变量负责接收密码,它定义的空间大小为512字节,而read函数只读取了409字节,它读取的空间小于自己本身所占的空间所以不满足溢出条件。再看s变量,它负责接收用户名,定义的空间大小为40字节,而接收的最大空间大小只有25字节,同样也不满足溢出条件,这里接收的两个值在这个函数的栈空间都不满足溢出条件,只能另找出路。可以看到返回时还调用了check_passwd函数,接着分析该函数:

check_passwd()函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
char *__cdecl check_passwd(char *s)
{
  char *result; // eax
  char dest[11]; // [esp+4h] [ebp-14h] BYREF
  unsigned __int8 len; // [esp+Fh] [ebp-9h]
 
  len = strlen(s);
  if ( len <= 3u || len > 8u )
  {
    puts("Invalid Password");
    result = (char *)fflush(stdout);
  }
  else
  {
    puts("Success");
    fflush(stdout);
    result = strcpy(dest, s);
  }
  return result;
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 2
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回