填坑

给我前面0CTF总结的博文填坑

附前文链接: http://0x48.pw/2016/03/14/0x12/

去年在这篇文章中留了一个坑,rand_2这随机数预测的题无法复现

最近遇到两次mt_rand算种子的题,一次是NJCTF,一次是ichunqiu的题

NJCTF那题并不会遇到这个坑,但是ichunqiu那题复现发生了同样的问题,无法复现.

最后发现,是apache prefork模式的问题,该模式是单线程的模式

而我日常开发使用的都是nginx,却是多线程模式

简单来说,apache prefork模式中,我同一个TCP连接中的多个请求都是同个单个线程来处理

而我使用nginx,即使是同一个TCP连接的多个请求,也是被分配到多个线程进行处理,这就导致了随机数的种子不同,复现失败.

附一个别人复现的docker: https://github.com/hxer/ctf-docker

另外,我当时写的payload也有问题,改了下,运行正常:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#!/usr/bin/env python
#-*- coding:utf-8 -*-

import requests
import re
import hashlib

class POC:
def __init__(self):
self.url = "http://127.0.0.1:8888/"
self.url2 = "http://127.0.0.1:8888/?go="
self.url3 = "http://127.0.0.1:8888/a.php?"
self.s = requests.session()

def test(self):
ran_num = []
for i in range(49):
req = self.s.get(self.url)
cont = req.content
try:
num = re.findall(r'(.+)<code>',cont)[0]
except:
print i
exit(-1)
ran_num.append(int(num))

req = self.s.get(self.url2)
cont = req.content
ran_num.append(int(cont[:-36]))
md5_num = cont[-32:]

go_num = []
for x in range(5):
y = 50 + x
tem_num1 = (ran_num[y-3] + ran_num[y-31]) % 2147483648
ran_num.append(tem_num1)
go_num.append(str(tem_num1))

now_num = "".join(go_num)
now_md5 = hashlib.md5(now_num).hexdigest()
if md5_num == now_md5:
print "yes"
self.num5 = go_num
self.suc()
# break
def suc(self):
for x in self.num5:
self.url3 += "check[]="+str(x) + "&"
req = self.s.get(self.url3)
print req.content

if __name__ == '__main__':
t = POC()
t.test()

不过又要留一个坑了,做ichunqiu那题的时候我简写了一个复现的demo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# test.php
<?php
require_once('tttt.php');
echo mt_rand();

echo "\n";
?>


# tttt.php
<?php
if ($_GET['test']) {
echo mt_rand();
echo "\n";
die();
}
?>

即使是使用apache prefork模式,也复现失败

但是我改了下tttt.php文件,

1
2
3
4
5
6
7
8
9
# tttt.php
<?php
if ($_GET['test']) {
mt_srand(123123123);
echo mt_rand();
echo "\n";
die();
}
?>

却复现成功,成功算出了种子:123123123

迷。。。。

附一个算mt_rand种子的链接:http://www.openwall.com/php_mt_seed/README

文章目录