这个是同事给的一个题目,据说是铁三的。一开始看了下没啥思路
main函数,其中_bss_start
其实就是stdin,这明显存在缓冲区溢出
1 | int __cdecl main(int argc, const char **argv, const char **envp) |
看下导入表,基本就只有fgets了
我们再来看看保护措施,什么保护都没看,基本就是写shellcode执行了,但这个不太绝对,但是能有99%吧
1 | Arch: amd64-64-little |
搜了下,程序中没有jmp esp,call esp,这个路子断了,我们只能利用fgets,我们可能需要一些gadgets
问题是调用完fgets后,rdx的值变了,我们不能通过csu里面的通用gadget来重新调用fgets,因为我们不能正确地设置rdx的值
最后灵机一动,为何不用main函数原有的呢
1 | .text:00000000004005D5 mov rdx, cs:__bss_start ; stream |
我只要控制rbp的值就能控制写入的地址,那么最终的思路就是将第一次溢出控制rbp的值,跟着将shellcode写到bss段,再将控制权给到bss就可以了
1 | #!/usr/bin/env python |