Wargames:io.smashthestack Level 2

本文深入探讨了编程领域的复杂挑战,通过两种独特的方法解决数学运算难题:一种利用信号处理引发异常,另一种则巧妙地利用特殊数值。文章进一步展示了通过输入特定值如NAN,轻松应对计算挑战。此外,文章还揭示了隐藏的解法,以及通过有效位匹配实现的意外发现,最终以简洁而富有创意的代码示例结束。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第二关,提供了2种通关方式。

//a little fun brought to you by bla

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <setjmp.h>

void catcher(int a)
{
        setresuid(geteuid(),geteuid(),geteuid());
        printf("WIN!\n");
        system("/bin/sh");
        exit(0);
}

int main(int argc, char **argv)
{
        puts("source code is available in level02.c\n");

        if (argc != 3 || !atoi(argv[2]))
                return 1;
        signal(SIGFPE, catcher);
        return abs(atoi(argv[1])) / atoi(argv[2]);
}

需要提供2个数字进行除法,并触发SIGFPE,其中除数还不能为0。

这个地方有2个解法,通过kill的方式,手动发送SIGFPE信号触发。另外就是利用最大的负数除以-1的溢出也会导致SIGFPE。

第二个通关方式:

/* submitted by noname */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>


#define answer 3.141593

void main(int argc, char **argv) {

        float a = (argc - 2)?: strtod(argv[1], 0);

        printf("You provided the number %f which is too ", a);


        if(a < answer)
                 puts("low");
        else if(a > answer)
                puts("high");
        else
                execl("/bin/sh", "sh", "-p", NULL);
}
这个的解法有点儿意思,完全没有想到,以为通过有效位去实验能完全匹配上answer。

后来发现这个题目的解法非常简单,传入NAN即可。NAN这个特殊的数字,会导致参与计算的表达式的值都为NAN。


<think>我们正在解决一个由 `java.lang.NoClassDefFoundError: io.grpc.InternalGlobalInterceptors` 引起的错误。根据引用[1],`NoClassDefFoundError` 表示在编译时类路径中存在,但在运行时找不到类定义。引用[2]提到,这可能是由于jar包版本冲突,特别是当项目中有多个依赖使用不同版本的grpc时。 根据错误信息,缺少的类是 `io.grpc.InternalGlobalInterceptors`,这个类属于gRPC库。因此,问题很可能与gRPC库的版本或依赖冲突有关。 解决思路: 1. 确认项目中是否存在多个gRPC版本。 2. 统一gRPC版本,排除冲突。 具体步骤: ### 步骤1:检查依赖树 使用Maven或Gradle查看依赖树,找出所有引入gRPC的依赖,并检查它们的版本。 **Maven命令:** ```bash mvn dependency:tree ``` **Gradle命令:** ```bash gradle dependencies ``` 在输出中搜索`io.grpc`相关的依赖,注意是否有多个版本。 ### 步骤2:统一gRPC版本 如果发现多个版本,可以在项目的构建文件中(如pom.xml或build.gradle)显式指定一个版本,并排除其他依赖中的gRPC传递依赖。 例如,在Maven中,可以这样指定: ```xml <properties> <grpc.version>1.70.0</grpc.version> <!-- 选择一个合适的版本 --> </properties> <dependencies> <!-- 其他依赖 --> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-all</artifactId> <version>${grpc.version}</version> </dependency> <!-- 对于其他依赖,如果它们引入了不同版本的gRPC,需要排除 --> <dependency> <groupId>com.example</groupId> <artifactId>some-artifact</artifactId> <version>1.0.0</version> <exclusions> <exclusion> <groupId>io.grpc</groupId> <artifactId>*</artifactId> </exclusion> </exclusions> </dependency> </dependencies> ``` 在Gradle中: ```gradle configurations.all { resolutionStrategy { force 'io.grpc:grpc-core:1.70.0', 'io.grpc:grpc-netty:1.70.0', 'io.grpc:grpc-protobuf:1.70.0', 'io.grpc:grpc-stub:1.70.0' // 根据实际情况添加其他grpc模块 } } dependencies { implementation('com.example:some-artifact:1.0.0') { exclude group: 'io.grpc', module: '*' } } ``` ### 步骤3:检查类是否存在 确保你选择的gRPC版本中包含`io.grpc.InternalGlobalInterceptors`类。这个类在较新的gRPC版本中可能已经被移除或改名。根据错误,这个类在gRPC的早期版本中存在(例如1.12.0版本中有),但在较新的版本中可能已被标记为内部类或移除。 建议: - 如果使用的是较新的gRPC版本(>=1.13.0),注意这个类可能已经被移除或重构。你可能需要检查你的代码或依赖中是否有使用到这个类的地方,并考虑更新相关代码。 - 如果使用的是旧版本,确保版本一致。 ### 步骤4:清理和重新构建 在修改依赖后,执行清理并重新构建项目: - Maven: `mvn clean install` - Gradle: `gradle clean build` ### 可能的原因 根据引用[2],这个错误可能是由于同时使用了milvus和qdrant,它们依赖了不同版本的gRPC。因此,需要统一版本。 如果你没有直接使用这两个库,那么可能是其他库引入了冲突的gRPC版本。同样需要统一。 ### 示例:排除冲突 假设你的项目同时依赖了A和B,而A依赖gRPC 1.40.0,B依赖gRPC 1.50.0,那么你需要选择一个兼容的版本(比如1.50.0)并排除A中的旧版本。 在Maven中: ```xml <dependency> <groupId>com.example</groupId> <artifactId>A</artifactId> <version>1.0</version> <exclusions> <exclusion> <groupId>io.grpc</groupId> <artifactId>*</artifactId> </exclusion> </exclusions> </dependency> ``` 然后显式引入gRPC 1.50.0。 ### 注意事项 - 确保所有依赖的库都与你选择的gRPC版本兼容。 - 如果问题仍然存在,考虑升级或降级gRPC版本,直到找到一个所有依赖都兼容的版本。 如果以上步骤无法解决问题,请检查运行时类路径是否包含gRPC的jar包,以及是否有多个版本的jar包被同时加载[^1][^2][^3]。 §§相关问题§§ 1. 如何查看Maven项目的依赖树? 2. 在Gradle中如何强制使用特定版本的依赖? 3. gRPC版本升级后常见的不兼容问题有哪些? 4. 如何解决Spring Boot应用中的jar包冲突?</think>### 解决 `java.lang.NoClassDefFoundError: io.grpc.InternalGlobalInterceptors` 的方法 #### 📌 问题原因分析 1. **类缺失** `InternalGlobalInterceptors` 是 gRPC 的内部工具类,通常在 `grpc-core` 包中提供。该错误表明: - 运行时环境找不到这个类 - 常见于 gRPC 版本冲突或依赖缺失 2. **典型触发场景** - 项目中多个库依赖不同版本的 gRPC(如 Milvus 和 Qdrant 同时使用)[^2] - 依赖传递导致 gRPC 核心包被错误排除 - 构建时未正确包含 gRPC 依赖 --- #### 🔧 解决方案(逐步操作) ##### 步骤1:统一 gRPC 版本(解决冲突) 在 Maven 的 `pom.xml` 中强制指定 gRPC 版本: ```xml <properties> <!-- 选择兼容版本(推荐1.50.0+) --> <grpc.version>1.70.0</grpc.version> </properties> <dependencies> <!-- 显式引入核心包 --> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-core</artifactId> <version>${grpc.version}</version> </dependency> <!-- 其他依赖 --> <dependency> <groupId>com.example</groupId> <artifactId>milvus-client</artifactId> <version>1.0.0</version> <!-- 排除冲突版本 --> <exclusions> <exclusion> <groupId>io.grpc</groupId> <artifactId>*</artifactId> </exclusion> </exclusions> </dependency> </dependencies> ``` > **关键点**:通过 `<exclusions>` 移除冲突的子依赖 ##### 步骤2:验证依赖树 执行命令检查依赖关系: ```bash mvn dependency:tree | grep grpc ``` 输出应显示**统一版本**,如: ``` [INFO] | +- io.grpc:grpc-core:jar:1.70.0:compile [INFO] | +- io.grpc:grpc-netty:jar:1.70.0:compile ``` ##### 步骤3:清理并重新构建 ```bash mvn clean install -U # -U 强制更新快照依赖 ``` ##### 步骤4:检查运行时类路径 确认打包文件(如 JAR/WAR)中包含: - `grpc-core-{version}.jar` - `grpc-api-{version}.jar` 使用命令检查: ```bash jar tf target/your-app.jar | grep InternalGlobalInterceptors ``` 应输出类似: ``` io/grpc/InternalGlobalInterceptors.class ``` --- #### ⚠️ 特殊情况处理 若使用 **Spring Boot**,添加依赖管理: ```xml <dependencyManagement> <dependencies> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-bom</artifactId> <version>${grpc.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> ``` --- #### 💡 预防措施 1. 定期运行 `mvn dependency:analyze` 检查缺失依赖 2. 使用 IDE 的依赖分析工具(如 IntelliJ 的 Maven Helper) 3. 在 Docker 构建阶段验证依赖: ```dockerfile FROM maven:3.8-openjdk-11 AS build RUN mvn dependency:copy-dependencies RUN ls -l target/dependency/*grpc*.jar # 确认存在 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值