0x000打开环境
查看源码
#include 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; }
从源码中可以看出,没有加随机种子,那么rand产生的就是伪随机数,每次运行出来的随机数都是一样的,随机种子初始化诸如“srand( (unsigned)time( NULL ) )”,则每次产生的随机数都是不同的。
0x001 漏洞利用
我们就可以找出该随机数的值,再和0xdeadbeef异或,就可以得到我们该输入的值,因为异或是可逆的,知道任意两个值都可以异或出第三个值。
用gdb调试下,先打印出main函数
不难看出,rbp-8是我们输入的值,rbp-4是random产生的值,则在*0x40062f设置断点。
查看rbp-4地址的值即为random数据。
再将该值和0xdeadbeef相与,结果即为我们要输入的数据。
原文地址:https://www.cnblogs.com/DennyT/p/11622768.html
时间: 2024-11-10 15:13:19