OJ_空闲块

题干

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

C++实现

/**
输入样例:
12
1024 2048
8192 512
16384 1024
32768 8192
65536 8192
77824 1024
80896 3072
86016 1024
91136 5120
99328 512
104448 1024
112640 3072
1024 2560 10240 512 1024 6400 512 -1
输出样例:
104448 1024
112640 3072
1024 2048
8192 512
32768 1792
65536 8192
77824 1024
91136 5120
 */
#include <stdio.h>
#include <list>
using namespace std;
struct Block {
    int startPos;
    int blockSize;
};
int main() {

    list<Block> freeList;
    int n;
    scanf("%d", &n);
    //输入
    for (int i = 0; i < n; ++i) {
        Block block;
        scanf("%d%d", &block.startPos, &block.blockSize);
        freeList.push_back(block);
    }

    int request;
    list<Block>::iterator it;

    while (1) {
        scanf("%d", &request);
        if (request == -1) {
            break;
        }

        list<Block>::iterator toAlloc = freeList.end();//表示要分配出去的盘块,开始初始化为无意义的freeList.end()
        int curLeast = 1e9+1;//记录最小的符合空闲块申请的大小
        for (it = freeList.begin(); it != freeList.end(); ++it) {
            if (it->blockSize == request) {
                toAlloc = it;
                break;
            }
            else if (it->blockSize > request && it->blockSize < curLeast) {
                toAlloc = it;
                curLeast = it->blockSize;
            }
        }

        if (toAlloc != freeList.end()) {//如果找到了可以分配的盘块

            while (toAlloc != freeList.begin()) {//要分配的盘块不是第一块
                Block front = freeList.front();
                freeList.pop_front();
                freeList.push_back(front);//把头块挂成尾块,方便出队
            }

            if (toAlloc->blockSize == request) {
                freeList.pop_front();
            }

            else {
                toAlloc->blockSize -= request;
            }
        }
    }

    //打印
    for (it = freeList.begin(); it != freeList.end(); ++it) {
        printf("%d %d\n", it->startPos, it->blockSize);
    }
    return 0;
}
引用是一段关于利用pwntools库对jarvisoj_level0进行攻击的代码。代码中使用了remote()方法建立了远程连接,并构造了一个payload来利用栈溢出漏洞,最终执行callsystem()函数来获取shell权限。引用也是类似的代码,只是连接的地址不同。引用是一篇关于pwntools基本用法的文章,并提供了一些常用的函数和方法。根据这些引用内容,可以得出结论,jarvisoj_level0是一个存在栈溢出漏洞的程序,可以通过构造特定的payload来执行系统调用函数,从而获取shell权限。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [jarvisoj_level0](https://blog.csdn.net/weixin_56301399/article/details/125919313)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [jarvisOJ-level0](https://blog.csdn.net/qq_35661990/article/details/82889103)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [jarvis oj---level0解题方法](https://blog.csdn.net/weixin_45427676/article/details/97272924)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值