参加xman夏令营,大佬给我们带来了密码学课程。其中随机数部分感受颇深,记录下几个脚本。

1. 以时间作为种子的随机数

https://www.jarvisoj.com/ 的[xman2019]babyrpd

服务端代码

 class Unbuffered(object):
def __init__(self, stream):
self.stream = stream
def write(self, data):
self.stream.write(data)
self.stream.flush()
def __getattr__(self, attr):
return getattr(self.stream, attr)
import sys
sys.stdout = Unbuffered(sys.stdout)
import signal
signal.alarm(600) import random
import time
flag=open("/root/level0/flag","r").read() random.seed(int(time.time()))
def check():
recv=int(raw_input())
if recv==random.randint(0,2**64):
print flag
return True
else:
print "atum tql"
return False while 1:
if check():
break

解决方法:

预测时间种子,进行攻击

 #coding=utf-8
import socket
import random
import time while True:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = '47.97.215.88'
port = 20000
random.seed(int(time.time()+2)) #加上延迟所以+2秒
s.connect((host, port))
s.send(str(random.randint(0,2**64))+'\n')
print s.recv(1024)

2. java的Random随机数

https://www.jarvisoj.com/ 的[xman2019]mediumrpd

服务端代码:

 class Unbuffered(object):
def __init__(self, stream):
self.stream = stream
def write(self, data):
self.stream.write(data)
self.stream.flush()
def __getattr__(self, attr):
return getattr(self.stream, attr)
import sys
sys.stdout = Unbuffered(sys.stdout)
import signal
signal.alarm(600)
import os
os.chdir("/root/level1") flag=open("flag","r").read() import subprocess
o = subprocess.check_output(["java", "Main"])
tmp=[]
for i in o.split("\n")[0:3]:
tmp.append(int(i.strip())) v1=tmp[0] % 0xffffffff
v2=tmp[1] % 0xffffffff
v3=tmp[2] % 0xffffffff
print v1
print v2
v3_get=int(raw_input())
if v3_get==v3:
print flag
 import java.util.Random;
public class Main {
public static void main(String[] args) {
Random random = new Random();
System.out.println(random.nextInt());
System.out.println(random.nextInt());
System.out.println(random.nextInt());
}
}

攻击方法

从题目获取到两个随机数v1,v2,通过已知公式,可以计算出v3

 import socket
import random
import time
def liner (seed):
return ((seed*25214903917+11)&0xffffffffffff) while True:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = '47.97.215.88'
port = 20001
s.connect((host, port))
v1=int(s.recv(1024))
v2=int(s.recv(1024))
for i in range(65536):
seed=v1*65536+i
if liner(seed)>>16==v2:
print seed
v3=liner(liner(seed))>>16
s.send(str(v3)+'\n')
print s.recv(1024)

3. python的random

来源是:Mersenne Twister

大佬说php的mt_rand(可以用php_mt_seed攻击),ruby的rand(),python的random都可以攻击,但我只弄出python的版本

题目为https://www.jarvisoj.com/ 的[xman2019]hardrpd

参考文章:https://ddaa.tw/30c3ctf_2013_number_100_guess.html

服务端代码:

 class Unbuffered(object):
def __init__(self, stream):
self.stream = stream
def write(self, data):
self.stream.write(data)
self.stream.flush()
def __getattr__(self, attr):
return getattr(self.stream, attr)
import sys
sys.stdout = Unbuffered(sys.stdout)
import os
os.chdir("/root/level2") from random import * while 1:
a=raw_input("#")
target=getrandbits(32)
if a!=str(target):
print target
else:
print open("flag","rb").read()

攻击脚本:(改写至TokyoWestern CTF WriteUp by r3kapig

 #coding=utf-8
import socket
import random
import time def unBitshiftRightXor (value,shift):
i = 0
result = 0
while i * shift < 32:
partMask = right((-1 << (32 - shift)) , (shift * i))
part = value & partMask
value ^= right(part , shift)
result |= part
i+=1
return result
def unBitshiftLeftXor(value, shift, mask):
i = 0;
result = 0;
while i * shift < 32:
partMask = right(-1 , (32 - shift)) << (shift * i)
part = value & partMask
value ^= (part << shift) & mask
result |= part
i += 1
return result def rev(nums):
state=[]
for i in nums:
value = i;
value = unBitshiftRightXor(value, 18)
value = unBitshiftLeftXor(value, 15, 0xefc60000)
value = unBitshiftLeftXor(value, 7, 0x9d2c5680)
state.append(unBitshiftRightXor(value, 11))
return state def sign(iv):
if(iv&0x80000000):
iv = -0x100000000 + iv
return iv def nextState(state):
for i in range(624):
y = (state[i] & 0x80000000) + (state[(i + 1) % 624] & 0x7fffffff)
next = right(y,1);
next ^= state[(i + 397) % 624]
if ((y & 1L) == 1L):
next ^= 0x9908b0df
state[i] = next def nextNumber(state):
currentIndex=0
tmp = state[currentIndex];
tmp ^= right(tmp , 11)
tmp ^= (tmp << 7) & 0x9d2c5680
tmp ^= (tmp << 15) & 0xefc60000
tmp ^= right(tmp , 18)
return tmp def right(n,bit): #python没有>>>运算符,这个函数用作代替
x=n
if n<0 and bit>0:
n=(2147483648*2+n)>>bit
else:
n=n>>bit
return n def crack_prng(outputs_624_list):
state=rev(outputs_624_list)
stateList = state[:]
nextState(state)
r = random.Random()
state = (3, tuple(stateList + [624]), None)
r.setstate(state)
return r
'''
#本地测试代码
n=[random.getrandbits(32) for i in range(625)]
r=crack_prng(n[:-1])
print n[-1],r.getrandbits(32)
'''
n=[]
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = '47.97.215.88'
port = 20002
s.connect((host, port))
for i in range(624):
print s.recv(1024),i,
s.send('\n')
n.append(int(s.recv(1024)))
r=crack_prng(n)
s.send(str(r.getrandbits(32))+'\n')
print s.recv(1024),s.recv(1024)

xman随机数相关题目的更多相关文章

  1. LeetCode: Palindrome 回文相关题目

    LeetCode: Palindrome 回文相关题目汇总 LeetCode: Palindrome Partitioning 解题报告 LeetCode: Palindrome Partitioni ...

  2. leetcode tree相关题目总结

    leetcode tree相关题目小结 所使用的方法不外乎递归,DFS,BFS. 1. 题100 Same Tree Given two binary trees, write a function ...

  3. C语言中随机数相关问题

    用C语言产生随机数重要用到rand函数.srand函数.及宏RAND_MAX(32767),它们均在stdlib.h中进行了声明. int rand(void);//生成一个随机数 voidsrand ...

  4. [LeetCode] 链表反转相关题目

    暂时接触到LeetCode上与链表反转相关的题目一共有3道,在这篇博文里面总结一下.首先要讲一下我一开始思考的误区:链表的反转,不是改变节点的位置,而是改变每一个节点next指针的指向. 下面直接看看 ...

  5. 栈 队列 hash表 堆 算法模板和相关题目

    什么是栈(Stack)? 栈(stack)是一种采用后进先出(LIFO,last in first out)策略的抽象数据结构.比如物流装车,后装的货物先卸,先转的货物后卸.栈在数据结构中的地位很重要 ...

  6. [LeetCode] [链表] 相关题目总结

    刷完了LeetCode链表相关的经典题目,总结一下用到的技巧: 技巧 哑节点--哑节点可以将很多特殊case(比如:NULL或者单节点问题)转化为一般case进行统一处理,这样代码实现更加简洁,优雅 ...

  7. 硬核 - Java 随机数相关 API 的演进与思考(上)

    本系列将 Java 17 之前的随机数 API 以及 Java 17 之后的统一 API 都做了比较详细的说明,并且将随机数的特性以及实现思路也做了一些简单的分析,帮助大家明白为何会有这么多的随机数算 ...

  8. 九度 Online Judge 之《剑指 Offer》一书相关题目解答

    前段时间准备华为机试,正好之前看了一遍<剑指 Offer>,就在九度 Online Judge 上刷了书中的题目,使用的语言为 C++:只有3题没做,其他的都做了. 正如 Linus To ...

  9. 已知前序(后序)遍历序列和中序遍历序列构建二叉树(Leetcode相关题目)

    1.文字描述: 已知一颗二叉树的前序(后序)遍历序列和中序遍历序列,如何构建这棵二叉树? 以前序为例子: 前序遍历序列:ABCDEF 中序遍历序列:CBDAEF 前序遍历先访问根节点,因此前序遍历序列 ...

随机推荐

  1. (详细)JAVA使用JDBC连接MySQL数据库(3)-代码部分

    欢迎任何形式的转载,但请务必注明出处. 本节主要内容 项目建立 数据库连接 数据库操作 主函数 点击进入推荐博客(必看) 一.项目建立 如图所示:新建Java Project.Package.Clas ...

  2. 关于将多个json对象添加到数组中的测试

    如果用数组push添加不到数组中的,这个我也不知道是为什么?然后我选择了另一种发放就是从数组出发,逆向添加 最后的数组是这样的: data1=['公司1','公司2','公司3','公司4']; ar ...

  3. mysql打印用户权限的小技巧

    mysql5.5 5.6 SHOW GRANTS FOR mysql> SELECT DISTINCT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host ...

  4. JAVA面试核心教程|Java面试基础知识点总结

    Java中的原始数据类型都有哪些,它们的大小及对应的封装类是什么? byte——1 byte——Byte short——2 bytes——Short int——4 bytes——Integer lon ...

  5. Flutter中的普通路由与命名路由(Navigator组件)

    Flutter 中的路由通俗的讲就是页面跳转.在 Flutter 中通过 Navigator 组件管理路由导航.并提供了管理堆栈的方法.如:Navigator.push 和 Navigator.pop ...

  6. Scyther攻击输出图的解释(之二)

    下面对 Needham-Schroeder 协议形式化分析 的攻击输出图 做一个解释: Needham-Schroeder使用ns3表示, ns3 协议形式化描述结果如下: /*  * Needham ...

  7. 如何利用while语句根据用户输入要求打印菱形图案

    需求:如何利用while语句根据用户输入要求打印菱形图案 diamond.py代码如下: x=int(input('Please input number: ')) i=1 j=1 while i&l ...

  8. API接口文档中将Swagger文档转Word 文档

    一般的开发工作,尤其是API接口的开发工作,首先要有开发文档,接口说明文档 ok,后来开发完毕了 和页面联调,或者是和第三方联调的时候, 这个时候,SA systeam admin 就会开始直接让开发 ...

  9. pyqt pyside qcombobox disable wheel scrolling

    pyqt pyside qcombobox disable wheel scrolling import sys from PyQt5 import QtCore, QtWidgets import ...

  10. Seafile和Nextcloud相比较哪个好用

    面对大量的照片视频,备份资料成了很多网友的刚需.但现在各大免费网盘,关闭地关闭,收费的收费,自建网盘成了一个不得已的选择.可以自建私有网盘的网盘程序最出名的要数Seafile和Nextcloud,一款 ...