-
-
[原创]第九题 命悬一线 by k1ee
-
发表于:
2020-12-7 21:16
7074
-
一道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

移动寄存器,完成题目


[注意]看雪招聘,专注安全领域的专业人才平台!
最后于 2020-12-8 11:13
被k1ee编辑
,原因: 修改