首页
社区
课程
招聘
[原创]【2019看雪CTF】Q1赛季 第八题 挖宝 WP
发表于: 2019-3-23 21:00 5914

[原创]【2019看雪CTF】Q1赛季 第八题 挖宝 WP

2019-3-23 21:00
5914

这是一题golang编写的pwn题。题目意思是在6*6的空间内挖宝。有三个固定点的宝藏和一个仅凭手速永远也找不到的动态点宝藏。
此题关键在于输入长度没有限制,导出溢出,可修改free span list。可通过改写free span list,将下次分配给输入message的地址控制在当前函数栈的底部附近(栈地址不变,这个是怎么实现的。。。。),以实现rop。其它的就是简单的rop了,程序自带有sys_call调用。(不是太懂tcmalloc)
完整exp如下:


[峰会]看雪.第八届安全开发者峰会10月23日上海龙之梦大酒店举办!

收藏
免费 1
支持
分享
最新回复 (4)
雪    币: 3502
活跃值: (1493)
能力值: ( LV15,RANK:1057 )
在线值:
发帖
回帖
粉丝
2
求详细
2019-3-25 11:32
0
雪    币: 16486
活跃值: (6297)
能力值: ( LV13,RANK:923 )
在线值:
发帖
回帖
粉丝
3
po叔还是po叔啊!跪求详解。
2019-3-25 12:07
0
雪    币: 29126
活跃值: (7604)
能力值: ( LV15,RANK:3306 )
在线值:
发帖
回帖
粉丝
4
mark
// runtime/malloc.go    
func mallocinit() {
	// ...
	limit = 0
	if sys.PtrSize == 8 && (limit == 0 || limit > 1<<30) {
		// ...
		arenaSize := round(_MaxMem, _PageSize)
		bitmapSize = arenaSize / (sys.PtrSize * 8 / 4)
		spansSize = arenaSize / _PageSize * sys.PtrSize
		spansSize = round(spansSize, _PageSize)
		for i := 0; i <= 0x7f; i++ {
			switch {
			case GOARCH == "arm64" && GOOS == "darwin":
				p = uintptr(i)<<40 | uintptrMask&(0x0013<<28)
			case GOARCH == "arm64":
				p = uintptr(i)<<40 | uintptrMask&(0x0040<<32)
			default:
				p = uintptr(i)<<40 | uintptrMask&(0x00c0<<32)
			}
			pSize = bitmapSize + spansSize + arenaSize + _PageSize
			p = uintptr(sysReserve(unsafe.Pointer(p), pSize, &reserved))
			if p != 0 {
				break
			}
		}
	}
	
	// ...
	
	p1 := round(p, _PageSize)
	mheap_.spans = (**mspan)(unsafe.Pointer(p1))
	mheap_.bitmap = p1 + spansSize
	mheap_.arena_start = p1 + (spansSize + bitmapSize) // 0xC820000000
	mheap_.arena_used = mheap_.arena_start
	mheap_.arena_end = p + pSize
	mheap_.arena_reserved = reserved
	
	//...
}

2019-3-25 14:44
1
雪    币: 13713
活跃值: (2851)
能力值: ( LV15,RANK:2663 )
在线值:
发帖
回帖
粉丝
5
我也不太了解。惊现风神,感谢。
2019-3-25 23:52
0
游客
登录 | 注册 方可回帖
返回
//