BJDCTF_r2t3

考点:考点:短整型溢出

1.首先检查程序的基础信息

BJDCTF_r2t3_第1张图片

32位程序,可以看到这开启了NX保护,说明无法在栈上执行shellcode

2.运行程序,对程序功能有基本了解

BJDCTF_r2t3_第2张图片

程序基本功能:输入name,对name长度进行判断

3.用ida打开进行分析

这里截取了关键部分对代码

BJDCTF_r2t3_第3张图片

首先在main函数中,没有任何可疑的

进入name_check函数:接受了一个最大长度为0x400的buf

BJDCTF_r2t3_第4张图片

用一个一字节(8bit)的变量V3存储buf的长度,之后存在一个字符串拷贝,拷贝目的地在栈中,长度为8h,即十进制8

V3的定义为Unsigned int型,并且根据占用一个字节计算可以得到V3的取值范围:0~255 (1111 1111)B=(255)D;对于一个1字节的Unsigned int型变量,它的有效数据长度为一个字节,当它的数据长度超过一个字节时,就会溢出,溢出的部分则直接忽略,使用相关变量时,使用的数据仅为最后一个字节,因此就会出现257等于1的情况,其他类型变量和数值与之类似

BJDCTF_r2t3_第5张图片

结合前面溢出原理分析,0x400(十进制1024)的长度远大于1字节,所以这里可以利用整型溢出漏洞,password字符串的长度可以是3~8个字符,也可以是259-264个字符,接下来查看如何利用此漏洞

查看内置函数发现dl_registery()后门函数

BJDCTF_r2t3_第6张图片

再根据下面的截图,在字符串拷贝过程中,输入21个字符之后,就可以覆盖函数返回地址了

BJDCTF_r2t3_第7张图片

为了绕过name_check函数对字符长度的限制,我们可以利用整型溢出

在259-264之间,可以随机选择一个数。这里我们选择262,这样我们就可以根据综合分析得到的数据构造payload了

具体exp如下⬇️

from pwn import *
#context.log_level='debug'

p=process('./r2t3')
elf=ELF('./r2t3')

backdoor=p32(0x804858b) #后门函数地址
payload='a'*21+backdoor #覆盖返回地址为后门函数
payload+='b'*(262-len(payload))  #填充payload使之长度达到262以绕过name_check函数
p.sendline(payload)
p.interactive()

参考链接:

https://adworld.xctf.org.cn/task/writeup?type=pwn&id=5058&number=2&grade=0&page=1

https://github.com/BjdsecCA/BJDCTF2020_March

你可能感兴趣的:(pwn)