世界上最大的ZIP炸弹:114885734 Quettabytes,一个普通人无法想象的量级。

图片

1148857344 Quettabytes,这个量级可能很多人没有概念:

1 Quettabytes = 1,000,000,000,000,000,000,000,000,000,000 bytes
不用数了,后面有30个零

目前全球数字存储总量约为ZB(Zettabyte)级,比 1QB(Quettabytes)小得多,目前世界上没有任意方式可以处理如此海量级的数据,需要的技术远远超出我们目前的能力。

1148857344 Quettabytes 转换为 Zettabytes 是 1,175,061,884,160 Zettabytes。

什么是ZIP炸弹?

它实际上很简单,就是一个很小的压缩文件,看似无害。但是当我们去解压这个看起来很小的压缩文件时,会发现它像一个炸弹一样,疯狂的膨胀,消耗大量的系统资源,如CPU、内存和磁盘空间。

比如之前很出名的一个42.zip的文件,初始大小就只有42kb,但是解压之后,达到了4.5PB

图片

这是怎么做到的?

它实际上并不是通过创建一个巨大的文件并将它进行压缩来生成zip文件,而是通过对zip格式的解析,直接通过程序来虚构一个文件。这个文件在使用对应的压缩算法进行解压缩时,会被解压成一个超大的文件

取个例子,假设我们有一个压缩算法,它会将重复的字母进行压缩,通过在对应的字母后面加一个数字来标记它重复了多少次。

比如字符串“aaaaabbbb”,我们通过这个压缩算法,可以压缩为“a5b3”,那如果我们希望生成一个1GB的文件,那我们不需要输入无数个a,让它达到1GB的大小,而是可以直接生成一个压缩文件,它的内容是“a1000000000”,那我们就创建了一个压缩比高达9000多万倍的压缩文件(从1GB压缩到11Byte)。

那假如这种压缩格式还允许嵌套的话,那就更可怕了,每嵌套一次,还要再膨胀一倍,这就会让我们的压缩率变得很夸张。

事实上目前的压缩算法基本上都可以嵌套,比如42.zip它就包含16组的五层嵌套zip文件。

图片

最后

目前市面上所有的杀毒软件基本上都会识别到这种恶意的ZIP包,而且部分操作系统也会限制解压的层级的识别文件大小,所以目前这种攻击危害算是有限。

但是不排除后面有新的绕过手段,所以还是不要在没有做任何防护的情况下,随便乱解压各种未知的压缩文件~


欢迎关注我的公众号“混入安全圈的程序猿”,更多原创文章第一时间推送!

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个使用.NET编写的简单炸弹人小游戏的示例代码: ```csharp using System; namespace BombermanGame { class Program { static int playerX = 0; static int playerY = 0; static bool gameOver = false; static void Main(string[] args) { ConsoleKeyInfo keyInfo; Console.WriteLine("Welcome to Bomberman!"); while (!gameOver) { DrawGame(); keyInfo = Console.ReadKey(true); // 根据玩家输入移动炸弹人 switch (keyInfo.Key) { case ConsoleKey.LeftArrow: MovePlayer(-1, 0); break; case ConsoleKey.RightArrow: MovePlayer(1, 0); break; case ConsoleKey.UpArrow: MovePlayer(0, -1); break; case ConsoleKey.DownArrow: MovePlayer(0, 1); break; case ConsoleKey.Escape: gameOver = true; break; } } Console.WriteLine("Game Over. Press any key to exit..."); Console.ReadKey(); } static void DrawGame() { Console.Clear(); // 绘制游戏地图 string[] map = { "#######", "# #", "# #", "# P #", "# #", "#######" }; for (int y = 0; y < map.Length; y++) { for (int x = 0; x < map[y].Length; x++) { if (x == playerX && y == playerY) { Console.Write("P"); // 绘制炸弹人 } else { Console.Write(map[y][x]); // 绘制地图元素 } } Console.WriteLine(); } } static void MovePlayer(int deltaX, int deltaY) { int newPlayerX = playerX + deltaX; int newPlayerY = playerY + deltaY; // 检查新位置是否在游戏地图内 if (newPlayerX >= 0 && newPlayerX < 7 && newPlayerY >= 0 && newPlayerY < 6) { // 检查新位置是否是空地 if (GetMapElement(newPlayerX, newPlayerY) == ' ') { playerX = newPlayerX; playerY = newPlayerY; } } } static char GetMapElement(int x, int y) { string[] map = { "#######", "# #", "# #", "# P #", "# #", "#######" }; return map[y][x]; } } } ``` 这个示例使用控制台来绘制游戏地图,并通过方向键让玩家移动炸弹人(P)。地图由一个字符串数组表示,每个字符代表一个地图元素。玩家通过移动来躲避障碍物(#)并探索游戏世界。 请注意,这只是一个简单的示例,你可以根据自己的需求和创意来扩展和改进游戏。你可以添加敌人、炸弹、道具等元素,以及更复杂的游戏规则和逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值