randomlock

main函数:

randomlock.png

initseed函数:

randomlock (3).png

change函数:

randomlock (2).png

这题检查随机数通过就给我flag,我们看到initseed函数刚开头是一个真随机的过程,但是我们可以看到,对真随机出的seed进行了seed = seed % 0x64 + 1;模运算并+1,那seed其实就被限制在了[1,100],那我们可以直接设定这个取出来的seed就是1,后面就是照着脚本的操作对seed进行操作,然后循环连接,当有一次随机出的种子是1时就能getflag,这里后面的操作其实是考拉兹猜想,无论是[1,100]中的哪个数最后都会变成1,但是我们没看出来也可以不用管,因为[1,100]范围太小了,就尝试循环爆破也行

模拟的c脚本:

#include <stdio.h>
#include <stdlib.h>
unsigned seed = 2;
void change()
{
    if ((seed & 1) != 0)
    {
        seed = 3 * seed + 1;
    }
    else
    {
        seed >>= 1;
    }
}
void get_seed()
{
    int result;
    for (int n120 = 1; n120 <= 120; ++n120)
        change();
    while (1)
    {
        result = seed & 1;
        if ((seed & 1) != 0)
            break;
        change();
    }
    srand(seed);
}
int get_v6()
{
    return rand() % 10000;
}

EXP:

from pwn import *
import sys
context(arch='amd64', os='linux')

file_name = './pwn'

elf = ELF(file_name)

gdb_   = 1 if ('gdb' in sys.argv)        else 0
switch = 1 if ('remote' in sys.argv)     else 0
debug  = 0 if ('deoff'  in sys.argv)     else 1

if switch:
    target = '127.0.0.1'
    port   = 41631
    p = remote(target, port)
else:
    p = process(file_name)

if debug:
    context(log_level='debug')

if gdb_ and switch == 0:
    gdb.attach(p)
    pause()

s    = lambda data                : p.send(data)
sa   = lambda delim, data         : p.sendafter(delim, data)
sl   = lambda data                : p.sendline(data)
sla  = lambda delim, data         : p.sendlineafter(delim, data)
r    = lambda numb=4096           : p.recv(numb)
ru   = lambda delim, drop=True    : p.recvuntil(delim, drop)
rl   = lambda                     : p.recvline()
lg   = lambda name, data          : log.success(name + ': ' + (hex(data) if isinstance(data, int) else data.decode(errors='ignore') if isinstance(data, bytes) else str(data)))
ra   = lambda t=None              : p.recvall(timeout=t)
cl   = lambda                     : p.close()
it   = lambda                     : p.interactive()
uu64 = lambda data                : u64(data.ljust(8, b'\x00'))

#################################################################################
from ctypes import *
while True:
    try:
        if switch:
            target = '127.0.0.1'
            port   = 41631
            p = remote(target, port)
        else:
            p = process(file_name)
        lib = cdll.LoadLibrary('./tes3.so')
        lib.get_seed()
        for i in range(10):
            v6 = lib.get_v6()
            sla(b'>',str(v6).encode())   
        result = ra(1)
        if b'{' in result or b'flag' in result or b'win' in result:
            lg("flag",result)
            it()
            break
        else:
            cl()
    except EOFError:
        cl()
        continue  
    except Exception as e:
        cl()
        continue 

题目链接:

CTF-Writeups/MoeCTF2025/ randomlock at main · Zenquiem/CTF-Writeups


randomlock
https://zenquietus.top/archives/wei-ming-ming-wen-zhang-YcpaDHHw
作者
ZenDuk
发布于
2025年12月27日
许可协议