2021国赛,就做了5道
pwn
,还有一道和红帽杯类似的llvm
,对这个不太熟悉,学习研究了一下
lonelywolf
一个简单的 2.27
的 double-free
的tcache
攻击,但是这个 2.27
是 1.4
版本的,有 double-free
检测。
1 | from pwn import * |
Pwny
一个有趣的题,通过下溢使用 随机数覆盖 fd
,然后 read
函数就会返回 0
。最后 fd
就能被覆盖为 0
,以后就能正常输入了。
1 | from pwn import * |
Channel
一个 aarch64
架构的,一个 2.31
版本的 double-free
的攻击。
1 | from pwn import * |
SilverWolf
就是第一题加了一个沙箱,唯一难受的是 size
太小了,布置 rop
有点难。所以得先执行一次 read
的 rop
,读取orw
到 free_hook
后面。
1 | from pwn import * |
game
和之前虎符线上的 vm
很像,不过这道题更简单,没有边界检查,又是 x86
架构。唯一的是通过修改 size
,实现堆重叠,劫持 free_hook
,最后执行 orw
。
1 | from pwn import * |
SATool
程序分析
按照红帽杯的分析思路,找到 runOnFunction
函数,然后其中有各个函数处理。这里首先需要处理的函数名为 B4ckDo0r
,然后各个函数处理如下(这里部分函数功能是我根据调试猜测的,并不一定准确 : (
1 | if ( !(unsigned int)std::__cxx11::basic_string<char,std::char_traits<char>,std::allocator<char>>::compare( |
save
函数需要两个参数,然后会申请 0x18
的堆块,并且把 chunk
的地址复制给 chunk_pt
变量。然后复制数据。
1 | if ( (unsigned int)std::__cxx11::basic_string<char,std::char_traits<char>,std::allocator<char>>::compare( |
takeaway
需要1个参数,可以将当前 chunk_pt
链表中的第一个 chunk
删掉,并转入下一个 chunk
1 | if ( !(unsigned int)std::__cxx11::basic_string<char,std::char_traits<char>,std::allocator<char>>::compare( |
stealkey
不需要参数,可以将当前 chunk_pt
链表的第一个chunk
的值赋值给 chunk_pt2
变量
1 | if ( !(unsigned int)std::__cxx11::basic_string<char,std::char_traits<char>,std::allocator<char>>::compare( |
fakekey
需要一个参数,会根据输入的参数 value
加上 chunk_pt2
的值,分别赋值给 chunk_pt2
和 chunk_pt
。
1 | if ( !(unsigned int)std::__cxx11::basic_string<char,std::char_traits<char>,std::allocator<char>>::compare( |
run
函数不需要参数,会执行 chunk_pt
指针。
利用分析
这里 run
函数中明显存在一个虚函数指针执行。所以可以考虑将 onegadget
布置到 chunk_pt
指针处,然后去执行 run
即可。
这里肯定需要 利用 fakekey
来实现将 chunk_pt
指针的值修改为 onegagdet
地址,因为这里可以加上 我们自己输入的一个数。
那么,就首先需要考虑在 chunk_pt2
处留下 libc
的地址。
而前面,有一个 save
函数,可以申请堆块。如果能够申请到 unsortedbin
中的堆块,就能在chunk
的前8字节留下 libc
地址。然后再通过 takeaway
函数,将 chunk_pt
的libc
地址赋值给 chunk_pt2
。
最后利用 fakekey
,加上输入的 偏移,使得 chunk_pt
为 onegadget
即可。
EXP
1 | //./clang+llvm-12.0.0-x86_64-linux-gnu-ubuntu-16.04/bin/clang -emit-llvm -c exp.c -o exp.bc |
- 本文作者: A1ex
- 本文链接: http://yoursite.com/2021/05/16/2021-CISCN/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!