首页 > 其他分享 >竞争条件入门

竞争条件入门

时间:2024-08-18 09:38:01浏览次数:5  
标签:do 入门 int 条件 程序 filename 竞争 flag printf

早些时间了解了竞争条件这个有趣的现象,底层原理不细讲,可以看看网上pwn college的搬运 这里还是简单描述下
众所周知,CPU从逻辑上是逐条指令执行的,但是当多个进程运行的时候,就会让他们的指令交叉进行操作,如果两个进程对同一文件进行操作时,就有可能导致两个程序对其读取时的环境与对其操作时的环境不同,这里举一个漏洞程序作为示范,大家可以自己去编译一下:

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

void intro(void)
{
    printf("HaHa there's no input!\n");
    printf("But i'll print Flag when num is 2!\n");
}

void check_input(char *filename)
{
    int i;
    FILE *f = fopen(filename, "r");
    assert(f != NULL);
    fscanf(f, "%d", &i);
    fclose(f);
    if(i != 0)
    {
    	printf("Nah the file changed.I wont run anymore\n");
    	exit(0);
    }
   	printf("check done!\n");
    return;
}

int do_action(char *filename)
{
    int i;
    FILE *f = fopen(filename, "r");
    assert(f != NULL);
    fscanf(f, "%d", &i);
    fclose(f);

    printf("I wrote a %d to file just now!\n", i);
    printf("Try 2 let me do it again(and again)!\n");
    return i;
}

int main(void)
{
    int i;
    char *filename = "num";

    intro();
    check_input(filename);
    do
    {
    	sleep(1);
    	i = do_action(filename);
   	}while(i != 2);
   	printf("flag{FuLaGe}");
    return 0;
}

(这里为了简单起见用了循环和sleep,其实正常示例程序应该去掉的,程序的逻辑也做了简化,遇到错误居然不退出而是爆出flag吗这种时候就需要去写一个过滤输出,忽略标准错误输出等处理,而且可能很久不出结果,所以这里就简化了一下逻辑.另外这题其实会跟自己竞争的,单纯两个执行这个程序的死循环应该也会爆flag)

程序很正常的打开了一个文件并检查里面的内容,再写入一个0,并且在非预期的时候退出,然而它忘了刚才写了什么再次打开并告诉你刚才写了什么,并且在奇怪的时候输出flag诶刚才明明不是这样的啊.程序没有输入点,但是与文件有交互(有点像之前做过的一道license,那道题利用文件的内容进行溢出)但是这里看得出来程序似乎没有溢出点.诶!我有一计
while :; do echo "1" > num; done
很轻易的就爆出flag啦

标签:do,入门,int,条件,程序,filename,竞争,flag,printf
From: https://www.cnblogs.com/mcrock/p/18365305

相关文章

  • “Datawhale x魔搭 AI夏令营”-AIGC方向-Day3从零入门AI生图原理&实践
    学习内容提要从通过代码实现AI文生图逐渐进阶,教程偏重图像工作流、微调、图像优化等思路,最后会简单介绍AIGC应用方向、数字人技术(选学)Task03:进阶上分-实战优化具体Datawhale教程学习内容见链接:https://linklearner.com/activity/14/10/37框架资源网站名称链接地......
  • 条件概率和黎曼和
    设共有\(n\)个人,放弃前\(k\)个人,若按此策略最终选到最优的人的概率为\(P(k)\),则\[\begin{aligned}P(k)&=P(\text{第}(k+1)\text{个人是最优的})+P(\text{第}(k+2)\text{个人是最优的}+\cdots+P(\text{第}n\text{个人是最优的})\\&=\frac1n+\frac1n\cdot\frack{k+1......
  • 科研绘图 | 如何画饼?Matlab绘图整理之饼状图 (入门小白版)
    "Nobodytripsovermountains. It is the smallpebble(鹅卵石)that causesyoutostumble(蹒跚).Passallthepebblesinyourpathandyouwillfindyouhavecrossedthemountain."1.二维简单饼状图x=[20,40,40];labels={'部分1','部分2',&......
  • Python入门之Lesson1:出发!
    目录前言一、Python简介二、环境搭建1.Python安装2.Pycharm安装三.运行总结前言本章会带领同学们了解和入门python。一、Python简介Python是一种高级编程语言,具有简洁明了的语法和丰富的库,非常适合初学者学习。Python的设计注重代码的可读性和简洁性,其语法类似......
  • AI时代的程序员:如何在变革中保持竞争力
            随着AIGC(如ChatGPT、MidJourney、Claude等)大语言模型的接连涌现,AI辅助编程工具正以惊人的速度改变着程序员的工作方式。这些工具不仅可以加速代码编写和调试,还能帮助开发者解决复杂问题。AI的崛起引发了广泛的讨论:程序员是否会被AI取代?还是说,AI将成为程序员工......
  • yolo入门 yolov8下载安装--2024.8
    默认已安装Anaconda(一个类似于环境管理器的软件,前面出过anaconda安装教程)1.创建激活环境打开AnacondaPrompt,创建yolov8环境condacreate-nyolov8python=3.8激活环境activateyolov82.下载yolov8安装包 下载链接:https://github.com/ultralytics/ultralytics同时可......
  • Vue入门需要了解的知识一(总结)
    Vue是用与2构建用户界面的渐进式框架;思维导图层层递进Vuejs核心包(声明式渐染、组件系统)、客户端路由(vueRouter)、大规模状态管理(Vuex)、构建工具(webpack;/vite)Vue的两种使用方式:1、vue核心包开发场景:局部模块改造2、VUE核心包&vue插件工程化开发场景:整站开发;VUE......
  • C++多线程详解 | 线程创建 | 互斥锁 | 条件变量 | 线程池
    目录前言1.线程创建2.互斥锁3.lock_guard与std::unique_lock4.condition_variable 5.线程池前言在说线程之前,先说说进程和线程的关系,以及什么是多线程(为了方便理解就用大白话来说)进程:进程就是运行中的程序,比如说一个微信的程序,你双击它,它运行起来了就是一个进程,在还......
  • 练习:python条件语句、循环语句和函数的综合运用
    需求描述:期望输出效果:练习成果:#简单的银行业务流程many=50000defmain_menu():print("----------主菜单----------"f"\n{name}您好,欢迎来到ATM,请选择操作:""\n查询余额\t[输入1]""\n存款\t\t[输入2]""\n取款\t\t[输入3]&qu......
  • 【Python】入门到放弃之第八章《元组》
    上一篇:【Python】入门到放弃之第七章《列表》下一篇:【Python】入门到放弃之第九章《字典》文章目录前言一、定义二、创建1.基本创建2.转换创建三、访问元素四、不可变性五、应用场景总结前言这是本系列的第八章节内容,《元组》。一、定义元组(Tuple)是Python中的......