陇原战役 PWN
PWN1
保护
1 | Arch: amd64-64-little |
题目IDA打开,就两个主要函数;一个任意地址写函数,一个栈溢出;
思路
我一开始是通过栈溢出覆盖到文件名处,然后退出程序触发stack_chk_fail,但是一直没找到,触发结束后程序会直接crash怎么处理。比赛结束后看了其他师傅的wp;把stack_chk_fail的got表覆盖为ret地址,这样程序在执行了stack_chk_fail了后不会直接crash掉,而是会继续正常执行;所以方法就变为,覆盖栈的返回地址为puts函数的地址和puts的got表,这样程序在经过stack_chk_fail后会执行put将puts的地址打印出来,获取libc后就简简单单了!
exp
1 | from pwn import * |
exp2 改atoi为system
1 | from pwn import* |
Magic
保护如下,这题其实保护没什么用
1 | Arch: amd64-64-little |
打开IDA看见一堆大数字直接懵逼;比赛的时候也没做出来,赛后看了其他出了的师傅们的,发下这种题需要直接上GDB动调去确定程序的流程;所以上GDB走了几次,发现程序其实就是简单的模板菜单题,只是故意做成这样混淆;
后续解题思路
确定程序的流程后
- 输入一会创建堆块,大小指定为0x60,且没用写入数据;且该堆块是从unsorted bin 里面切下来的,里面会保留main_arena地址;
- 选项二是编辑堆块,没用溢出;但是在最后结束返回时会调用printf函数将当前堆块的内容输出;利用申请堆块不会清空内容,直接将libc地址泄露
- 选项三是free操作,存在uaf漏洞
明白流程后,大概就是先申请两个堆块,然后对第一个堆块进行编辑以此来泄露libc;后面就是简单的将malloc链入到fast bin里面去;这里遇到个问题就是,在最后一次申请堆块时,如果使用选项一会报错输入非法;看了师傅的wp,发现可以直接利用double free来申请堆块达到get shell
exp
1 | from pwn import * |
总结
两个小收获
- stack_chk_fail的got表改为ret地址后,可以跳过检测,程序可以继续执行
- 程序流程复制的题目可以先用GDB动调,方便确定程序的主要流程
- 本文标题:陇原战役 PWN
- 本文作者:LOLOLO
- 创建时间:2021-11-07 22:55:29
- 本文链接:https://lololo-pwn.github.io/2021/11/07/陇原战役-pwn1/
- 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
评论