-
-
[原创]第九题 命悬一线 by k1ee
-
发表于: 2020-12-7 21:16 6836
-
一道pwn题,考察栈溢出以及ROP,保护情况,当作场间休息
首先看init_array,发现一个反调试函数
手动dlopen了libc,然后取TracerPid,如果没有调试则Patch一个函数为syscall
随后分析main函数
首先检查是否处于docker环境
推测docker里没法syscall 101(ptrace),通过抛出异常跳过后续代码执行,如果不在docker则输出错误并退出。
随后传入栈上分配的一个12字节结构体,记录一个函数指针列表以及读取的大小,读取512字节
然后把结构体传入下一个函数,复制到函数上的一个96字节大小缓冲区内,此处可以造成栈溢出
由于开了canary,因此需要覆盖上一个栈帧里的结构体,使得函数指针列表覆盖成我们自己的,然后程序通过指针列表+3取得一个地址,并调用,从而实现任意地址执行(开了NX)。
这里就可以开始ROP了,首先去40185F弹出刚才call写入的栈顶以及两个局部变量
随后弹出rdi为我们在payload中构造的一个/bin/sh
然后就崩溃了,发现好像没法操作rax以及rdx,不过rdx可以有mov rdx, rcx
,但好像也没法操作rcx,搜索一番ROPgadget发现如下两个
好家伙,那么就先修改rax,然后把ecx减为0即可,题目中这里特地设置了rcx值为读取的长度
那么就在payload里找个地方写0xA8,然后减掉就行了,因此pop rbp,先设置rax
这里很巧妙,可以同时弹出下一个设置rax为59的rbp,节省空间。然后设置ecx
再设置rax为59,调用execve
然后pop esi为0,这里同时要pop r15,刚好被用来写0xA8了,不过无所谓
最后到题目留给我们的syscall
移动寄存器,完成题目
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!