pwnable-kr6-random

知识点

rand()函数,

本题的关键!!!这个函数本身就是一个伪随机函数,每次运行这个程序,初始化后这个值都相同。
使用gdb调试
看下菜鸟教程中对rand()的解释

rand() 的内部实现是用线性同余法做的,它不是真的随机数,因其周期特别长,故在一定的范围里可看成是随机的。
rand()返回一随机数值的范围在 0 至 RAND_MAX间。RAND_MAX的范围最少是在 32767 之间(int)。用unsigned int 双字节是 65535,四字节是 4294967295的整数范围。0~RAND_MAX 每个数字被选中的机率是相同的。
用户未设定随机数种子时,系统默认的随机数种子为1。
rand()产生的是伪随机数字,每次执行时是相同的; 若要不同, 用函数srand()初始化它。

异或

异或函数也是可逆的,a^b = c ,a = c^b.
因此,需要输入的key就是0x6b8b4567^0xdeadbeef=0xb526fb88

题外

安装了ssh服务器
安装ssh-client命令:

sudo apt-get install openssh-client

安装ssh-server命令:

sudo apt-get install openssh-server

安装完成以后,先启动服务:

sudo /etc/init.d/ssh start

启动后,可以通过“ps -e|grep ssh”查看是否正确启动。

解题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>

int main(){
unsigned int random;
random = rand(); // random value!

unsigned int key=0;
scanf("%d", &key);

if( (key ^ random) == 0xdeadbeef ){
printf("Good!\n");
system("/bin/cat flag");
return 0;
}

printf("Wrong, maybe you should try 2^32 cases.\n");
return 0;
}

观察逻辑,发现需要用户输入一个key,这个key异或random要等于0xdeadbeef,而这个random的值来源于rand()函数,这就牵扯到rand()的知识了。(见上述知识点)
用gdb调试,看下random的值(大佬的截图)


得到flag
flag

https://www.jianshu.com/p/68118fb11ec5
https://www.cnblogs.com/p4nda/p/7122275.html