-
-
[原创]攻防世界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直播授课
赞赏
他的文章
- 关于迷宫题的一些求解思路 11599
- [原创]攻防世界PWN新手区:int_overflow 8029
- [原创]攻防世界PWN新手区:guess_num 11751
- [原创]攻防世界PWN新手区:level2 12032
- [原创]攻防世界PWN新手区:level0 6301
赞赏
雪币:
留言: