首页
论坛
课程
招聘
[原创]第九题 命悬一线 by k1ee
2020-12-7 21:16 2519

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

2020-12-7 21:16
2519

命悬一线

一道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写入的栈顶以及两个局部变量

1
0x000000000040185f : pop rbp ; pop r14 ; pop r15 ; ret

image-20201207210609084

 

image-20201207210618097

 

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

 

image-20201207210650966

 

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

1
2
mov eax, dword ptr [rbp - 0x14] ; pop rbp ; ret
sub ecx, dword ptr [rax - 0x77] ; ret

好家伙,那么就先修改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

1
flag{b5f4e9d4325d16d55783f7ea1b1ed956}

安卓应用层抓包通杀脚本发布!《高研班》2021年3月班开始招生!

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