首页
社区
课程
招聘
[原创]第九题 命悬一线 by k1ee
发表于: 2020-12-7 21:16 6836

[原创]第九题 命悬一线 by k1ee

2020-12-7 21:16
6836

一道pwn题,考察栈溢出以及ROP,保护情况,当作场间休息

image-20201207205905187

首先看init_array,发现一个反调试函数

image-20201207204908918

image-20201207204917009

手动dlopen了libc,然后取TracerPid,如果没有调试则Patch一个函数为syscall

image-20201207205006444

image-20201207205015358

随后分析main函数

image-20201207205036321

首先检查是否处于docker环境

image-20201207205054394

推测docker里没法syscall 101(ptrace),通过抛出异常跳过后续代码执行,如果不在docker则输出错误并退出。

image-20201207205145854

随后传入栈上分配的一个12字节结构体,记录一个函数指针列表以及读取的大小,读取512字节

image-20201207205235924

然后把结构体传入下一个函数,复制到函数上的一个96字节大小缓冲区内,此处可以造成栈溢出

image-20201207205323687

由于开了canary,因此需要覆盖上一个栈帧里的结构体,使得函数指针列表覆盖成我们自己的,然后程序通过指针列表+3取得一个地址,并调用,从而实现任意地址执行(开了NX)。

image-20201207210229082

image-20201207210243516

这里就可以开始ROP了,首先去40185F弹出刚才call写入的栈顶以及两个局部变量

image-20201207210609084

image-20201207210618097

随后弹出rdi为我们在payload中构造的一个/bin/sh

image-20201207210650966

然后就崩溃了,发现好像没法操作rax以及rdx,不过rdx可以有mov rdx, rcx,但好像也没法操作rcx,搜索一番ROPgadget发现如下两个

好家伙,那么就先修改rax,然后把ecx减为0即可,题目中这里特地设置了rcx值为读取的长度

image-20201207210914830

image-20201207210931255

那么就在payload里找个地方写0xA8,然后减掉就行了,因此pop rbp,先设置rax

image-20201207211103735

image-20201207211144909

这里很巧妙,可以同时弹出下一个设置rax为59的rbp,节省空间。然后设置ecx

image-20201207211244570

image-20201207211249749

再设置rax为59,调用execve

image-20201207211315274

image-20201207211327273

然后pop esi为0,这里同时要pop r15,刚好被用来写0xA8了,不过无所谓

image-20201207211414319

最后到题目留给我们的syscall

image-20201207211500704

移动寄存器,完成题目

image-20201207211516438

image-20201207211541855

 
 
 
 

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2020-12-8 11:13 被k1ee编辑 ,原因: 修改
收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//