这几天比赛太多了,欠了很多题都还没来得及做,后面慢慢一个一个做吧。还有就是很多题平时做得太慢了,导致比赛的时候很多题被队里的大佬很快就做了,我无题可做了。说明基础还是不够牢,需要更深入的理解原理。
Siri
很典型的格式化字符串题目。基本上各种保护都开启了。所以这里采用将 ret地址修改为 one_gadget地址来getshell。
所以需要先泄露 Libc地址和栈地址,来得到 one_gadget地址和 ret 地址。
泄露地址,libc地址选择泄露 __libc_main_start。栈地址这里选取 格式化输出第七个参数,因为他的值与ret地址仅相差 0x8。
EXP
1 | from pwn import * |
baby_note
程序分析
在 register 函数里,由于使用了strcpy 函数,存在一个 off-by-one 漏洞,因为 v2即age 和 name 是连着的,可以使用 age 覆盖后一个堆块的 size 位。
可以利用 chunk overlap 实现getshell。
利用分析
- 首先需要泄露 Libc 地址
这里,可以使用unsortedbin 来泄露 main_arena+88 的地址,然后得到 malloc_hook 地址 和 gadget 地址。
- 覆盖prev_inuse 位,构造chunk overlap
我们可以构造 chunk1, chunk2,chunk3,其中chunk1大小为0x20且为 freed,当执行 register 再次申请 name 时可以修改chunk2 的 size位为 chunk2+chunk3。再释放 chunk2时,就会合并整个chunk2 和 chunk3。再次 申请 大小为 chunk2 和 chunk3 大小的 chunk 就可以实现 堆覆盖 chunk3。
- 覆盖malloc_hook,getshell
实现 堆覆盖后,就可以通过fastbin attack来伪造堆块到 malloc_hook,实现 getshell。
EXP
1 | from pwn import * |
easy_pwn
程序分析
可以看到在读取用户输入时,存在一个 off-by-null 漏洞,可以 利用 chunk_overlap 来造成堆重复利用,可以伪造 UAF 漏洞。
调用了 mallopt 函数,导致 Max_fast 设置为了 0x10,也就是没有fastbin了,所以需要先去修改 global_max_fast 大小。
利用分析
- 构造 chunk overlap
先申请4个块 大小都为0x68,在申请第5 个块大小为 0xf8,最后通过 off-by-null 修改 第五个块的 pre_inuse 位。最后释放第1 个块和 第5 个块。那么系统将会把 5个块全部合并到一个 unsortedbin 内,那么我们就相当于可以实现 第2 、3、4 块的 UAF。重新申请3个块,那么3个块的 fd 和 bk 指针都含有 main_arena+88 的地址。
- 修改 global_max_fast
使用之前构造的 UAF 即可修改 unsrotedbin 的 bk 指针的 后两位为 global_max_fast 的偏移-0x10,再分配 整个unsortedbin ,那么 系统会 修改 global_max_fast 的值为 main_arena+88 的值。
- 泄露 libc 地址
由于修改了 global_max_fast 的值,那么以后释放的所有块都会进入 fastbin 中。那么可以执行 fastbin attack,先 释放两个块 2、1,随后使用 UAF 漏洞修改 块1 的 fd 指针指向 块0,修改 块0 的 fd 指针的后两位为 IO_2_1_stdout 的值。那么即可成功将堆块伪造到 IO_2_1_stdout 结构内,修改该结构,即可泄露 libc 地址。
- 最后再通过 fastbin attack,修改 malloc_hook 为 gadget 地址,即可 getshell.
注意: 修改 IO_2_1_stdout 结构体后,程序输出 时 没有 ‘\n’ 了,原因我还不太清除,希望有师傅能告诉我。
EXP
1 | from pwn import * |
Just_a_Galgame
程序分析
在case 2中,read函数可以溢出 0x8字节,同时如果输入的 idx 过大,也会溢出整个数组。
所以,可以利用该溢出,使用 House of orange 修改 top chunk 的size,然后利用 unsortedbin 泄露Libc 地址。
然后 可以利用case 5 ,写入 malloc_hook 的地址,然后再利用case 2的 数组溢出 修改 malloc_hook 为 one_gadget 地址。
利用分析
- 泄露libc 地址
泄露 Libc 地址,使用 house of orange 中 unsortedbin攻击。先 申请一个 0x68堆块,在使用 溢出修改 top chunk 的 size,再 申请一个 0x68 堆块,此时该堆块就有 main_arena 数组中的地址,然后再 打印该堆块,泄露地址。
- 数组溢出修改 malloc_hook
先向 bss 中 写入 malloc_hook 的地址,然后再 利用数组溢出,去修改 malloc_hook 的值 为 gadget地址,即可 getshell。
EXP
1 | from pwn import * |
Direct
程序分析
程序在 edit 函数中,如果 输入的 offset 为负数,那么则可以实现 前向写 任意地址。
此外,在 output_dir 函数中,会输出 dirp 堆块中的 数据,如下图所示,可以看到 v1+0x13 的地址是在 dirp 结构体中的数据,如果我们能够修改该处 的数据为 main_arena+88 的地址,那么即可泄露 Libc 地址。
利用分析
- 伪造 chunk overlap
由于存在一个前向写,可以申请 2个 chunk 和一个 dir 结构体,随后修改第一块的堆头,使他 size 包含 2个chunk 和 dir 结构体的大小。随后释放 第一个 chunk ,即可合并 2 个 chunk 和 一个 dir 结构体。
- 使用堆重复修改 dir 结构体
经过上面分析,知道可以输出 dir 结构体中的内容,所以可以 分配堆块到 dir 结构体中,修改dir结构体中的数据,随后利用输出 泄露 Libc 地址。
- 使用 fastbin attack getshell
最后,使用 fastbin attack 在 malloc_hook 处伪造堆块分配,随后修改 malloc_hook 的值 为 one_gadget地址,即可 getshell。
EXP
1 | from pwn import * |
OldSchool
程序分析
利用分析
EXP
bank
密码学,初看有点像智能合约。但是其实也是一个 密码学攻击。题目只要给一个合法的交易密文值,就能实现转账。所以,为了给自己账户转账,我们需要伪造一个交易hash。这个hash值是通过 AES ECB算法实现。所以ECB攻击。可以直接将分块的密文组合得到全新的密文。
首先从 已存在的交易密文中,截取 sender 和 amount两个量的密文值,再与我们自己的账户 的 receiver 密文值组合就行。
EXP
1 | from pwn import * |
baby_crt
从题目中的给的算法可以看到是 RSA-CRT签名算法,然后了解了一下针对这种算法的攻击。有一种签名故障攻击,可以通过计算
gcd(pow(m,f(c1)) - pow(f(sig),e,n)n)
,来计算出 n 的一个因子。然后解到 n 的两个素因子p和q。
这个签名算法的错误点如下:
1 | def sign(m, params): |
我们需要爆破的值为就是 t1,其由 getprime(16) 生成,范围为(1,65535)。最终的攻击EXP如下:
1 | def cal(): |
最终,能够得到n 的两个素因数。
- 本文作者: A1ex
- 本文链接: http://yoursite.com/2020/08/23/2020-QWB/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!