pwnable.kr random

题目如下:
在这里插入图片描述
我们照常连接过去看目录下有什么文件
在这里插入图片描述
运行,随便输入一下,错了
在这里插入图片描述
cat看一下源码
在这里插入图片描述
大概逻辑就是输入一个int类型的key然后这个key与rand()函数返回值亦或的值等于0xdeadbeef则获得flag
我们来查看一下rand()函数的作用

在这里插入图片描述
在这里插入图片描述
计算机中的rand()函数是伪随机,在标准的C库中函数rand()可以生成0~RAND_MAX之间的一个随机数,其中RAND_MAX 是stdlib.h 中定义的一个整数,它与系统有关(window下的RAND_MAX为:0x7fff=2^15-1
linxu下的RAND_MAX为:2^31-),然后rand()默认等于rand(1),因为种子相同,所以每次调用它时的第一个值都是相同。

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
	unsigned int random1;
	random1 = rand();
	printf("No srand():\n");
	printf("random1 = %u\n", random1);
	unsigned int random2;
	srand(1);
	random2 = rand();
	printf("srand(1):\n");
	printf("random2 = %u\n", random2);
	unsigned int random3;
	srand(2);
	random3 = rand();
	printf("srand(2):\n");
	printf("random3 = %u\n", random3);
	return 0;
}

我们可以自己写个程序编译一下
或者gdb -q random
查看main汇编
在这里插入图片描述
下断点在cmp处
在这里插入图片描述
$rbp-4就是 rand()返回值
计算就是0x6b8b4567^0xdeadbeef=0x‭B526FB88‬ 转换十进制就是3039230856,因为我们sanf输入的%d
在这里插入图片描述
成功获得flag。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值