netapi32.dll是Windows网络应用程序接口,用于支持访问微软网络。
远程执行代码
6a3K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6V1L8$3y4K6i4K6u0W2L8h3W2U0M7X3!0K6L8$3k6@1i4K6u0W2j5$3!0E0i4K6u0r3P5X3S2Q4x3X3c8U0L8W2)9J5c8Y4y4W2j5%4g2J5K9i4c8&6i4K6u0V1N6i4m8V1j5i4c8W2M7#2)9J5c8W2y4W2j5%4g2J5K9i4c8&6j5Y4g2D9L8r3g2@1K9h3&6K6i4K6u0r3x3U0l9H3y4W2)9J5c8X3#2K6x3o6k6Q4x3X3b7H3y4o6m8J5k6h3c8A6M7X3g2U0N6r3g2V1k6Y4u0G2L8g2)9K6c8p5#2e0c8p5&6Q4x3U0y4Q4x3U0g2q4y4W2)9J5y4f1u0o6i4K6t1#2z5p5k6Q4x3U0g2q4y4W2)9J5y4f1t1@1i4K6t1#2z5f1g2Q4x3U0g2q4z5q4)9J5y4f1q4r3i4K6t1#2b7e0k6Q4x3U0g2q4y4#2)9J5y4f1u0n7i4K6t1#2z5o6k6Q4x3U0g2q4z5q4)9J5y4f1t1#2i4K6t1#2z5o6c8Q4x3U0g2q4y4W2)9J5y4e0V1$3i4K6t1#2z5e0V1`.
将漏洞利用源码编译之后将NETAPI32.DLL放在一个目录下,执行程序,弹出框。
了解汇编语言,使用IDA。
1.1;首先我们先通过图片来大概理解一下该函数运行以及出现栈溢出的位置
1.2;使用IDA打开文件NETAPI32.DLL,且在“Functions window”搜索函数sub_7517FC68。
1.3;确定该函数的传参以及局部变量。
2.4;初始化栈帧
2.5;划分缓冲区为0X414h,我们知道栈溢出可以理解为大的缓冲区放入了小的缓冲区当中,造成了溢出情况。
2.6;保存之前的环境,即寄存器的值入栈。用于执行完函数返回之前函数继续执行。
2.7;第一个参数arg处理
2.7.1;判断第一个参数arg长度是否为0,如果不为0则继续向下执行代码,否则跳转至标号“loc_7517FCED”处执行代码
2.7.2;确定arg长度不为0,判断他的长度是否小于0X411h。
2.7.3;参数1确定长度范围在0~411h。那么接下来就是将参数1放入局部参数Dest并且判断字符串最后是否以"/"结尾。注意"0X5Ch"表示的是"\","0X2fh"表示的是"/"
2.8;参数2处理
2.8.1;接下来,我们来看一下针对第二个参数2 Source,函数有什么样的处理。第一步就是判断最后一个字符。
2.9;变量str和变量Source长度之和与0x411h进行比较。大于0x411h就会退出。
2.10;如何变量之和小于等于0x411h。注释:该位置导致溢出。详细原因请查看"3.漏洞函数分析"
我们知道“sub_7517FC68”会导致栈溢出,那么,我们看看如何调用呢?首先我们选中sub_7517FC68,使用快捷键Ctrl+x。查看什么函数调用了sub_7517FC68。
双击打开。我们发现了调用位置,并且我们回顾一下,刚刚的分析当中,我们知道导致溢出是第一个参数,以及第二个参数。也就是图中标识位置。接下来,我们向上定位,看看,这个参数在这个“NetpwPathCanonicalize”是怎么一个变化的,并且关注这两个参数会不会有其他的限定变化。
接下来,我们首先看一下第一个参数“ebx”的值,我们向上看。
[招生]科锐逆向工程师培训(2025年3月11日实地,远程教学同时开班, 第52期)!