2025冬季挑战:构建对称自打印ELF二进制文件

本文详细介绍了Synacktiv冬季挑战赛的技术内容,要求参赛者构建一个同时满足字节级对称和自打印的ELF二进制文件,涉及ELF头操作、x86指令布局优化和代码高尔夫技巧。

2025冬季挑战:Quinindrome

距离Synacktiv夏季挑战赛结束已经过去几个月,第一片雪花也已落下。该赛事广受欢迎,甚至有一位参与者在研究其解决方案时发现了一个0day漏洞!该漏洞尚未公开,但将成为Synacktiv网站后续文章的主题。随着冬季的到来,现在是时候向您介绍Synacktiv冬季挑战赛了!请尝试在这个代码高尔夫挑战中与其他参与者一较高下,并在1月1日之前向我们发送您的解决方案 🏌️。

🎁 奖品

以下是前三名参与者的奖品:

  • 第一名:这套优秀的IFixIt工具包以及一个用于修理所有电子产品的烙铁。
  • 第二名:这款非常适合家庭网络的Netgear 8端口PoE+可管理交换机。
  • 第三名:一个Yubikey 5C NFC密钥,确保您无风险的认证!

🏆 挑战

目标是设计一个"quinindrome",即一个满足以下两个属性的ELF二进制文件:

  1. 是一个回文,即完全对称。
  2. 是一个字节级自复制程序:执行时在标准输出上打印其自身的文件。

当然,进程必须在不出现段错误的情况下结束,并且返回码必须定义为0。

之前挑战的参与者会认出这个主题,但请不要误解:您需要构思截然不同的技术来最大限度地优化您的解决方案。这次,您将需要操作ELF文件的头部,并找到组成您程序的x86指令的最佳布局!

以下是测试脚本:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#!/bin/bash

##### Argument checks #####
# Check if binary path is provided
if [ $# -ne 1 ]; then
    echo "[+] Usage: $0 <binary_path>"
    exit 1
fi

binary=$1

# Check if file exists and is readable
if [ ! -f "$binary" ] || [ ! -r "$binary" ]; then
    echo "[!] Error: File '$binary' does not exist or is not readable."
    exit 1
fi


##### First check: byte-wise palindrome #####
reversed_file=$(mktemp)
size=$(wc -c < "$binary")

# Read the file byte by byte in reverse order (in a very efficient way)
for ((i = size - 1; i >= 0; i--)); do
    dd if="$binary" bs=1 skip=$i count=1 2>/dev/null
done > "$reversed_file"

if cmp -s "$binary" "$reversed_file"; then
    echo "[+] First check passed: binary is a byte-wise palindrome."
    rm "$reversed_file"
else
    echo "[!] First check failed: binary is not a byte-wise palindrome."
    rm "$reversed_file"
    exit 1
fi


##### Build a scratch Podman image with the binary to test #####
# Create the containerfile
image_name="quinindrome_test"
containerfile=$(mktemp)

cat > "$containerfile" <<EOF
FROM scratch
COPY $binary /binary
CMD ["/binary"]
EOF

# Build the image
if ! podman build . -t "$image_name" -f "$containerfile" >/dev/null; then
    echo "[!] Failed to build Podman test image."
    rm "$containerfile"
    exit 1
fi
rm "$containerfile"


##### Second check: quine property #####
output_file=$(mktemp)
max_run_time=120

# Run the binary in the scratch container and capture output & return code
timeout "$max_run_time" podman run --rm "$image_name" > "$output_file"
return_code=$?

if [ $return_code -ne 0 ]; then
    echo "[!] Second check failed: binary execution returned non-zero status: $return_code."
    rm "$output_file"
    exit 1
fi

if cmp -s "$binary" "$output_file"; then
    echo "[+] Second check passed: binary is a true quine, its output matches itself."
    rm "$output_file"
else
    echo "[!] Second check failed: Is that a quine? Binary output does not match itself."
    rm "$output_file"
    exit 1
fi

echo "[+] Both checks passed: your binary is a very nice quinindrome!"
echo "[+] Your score: $size"

📩 参与方式

解决方案接收截止日期为12月31日23:59 UTC+1。 要提交您的解决方案,请发送至邮箱 winter-challenge@synacktiv.com

您应该已经明白,获胜者将是能通过上述测试脚本获得最小分数的人。 挑战将在12月进行,技术分析文章将于2026年初发布。 您可以在取得进展时随时提交您的解决方案。 只要每天不超过一次,您可以向我们发送任意数量的解决方案。这意味着如果您在1月4日上午发送了一个二进制文件,您将不再有额外的提交机会。 一旦收到并验证您的提交,总排名将会更新。但是,为了保持悬念,分数将不会公开。 如果您对规则有任何疑问,请随时通过邮件联系我们。

🖥️ 测试虚拟机

以下是用于验证您解决方案的测试脚本将运行的虚拟机描述:

  • 操作系统:Debian 13,Linux内核版本为 6.12.57+deb13-amd64。
  • 架构:x86_64 - 因此您的二进制文件必须使用32位或64位的x86头部和指令集
  • 已安装 podman 版本 5.4.2。
  • 虚拟机无法访问互联网
  • 虚拟机配置为4个vCPU和8GB RAM

🥷🏼 额外提示

在我们这边,我们已经开发了一个相当有效的解决方案。您能击败Synacktiv吗? 为了避免直接透露我们解决方案的结果,这里是一个揭示我们分数的文本文件的哈希值:c4f704d883bdfdd3d4963bb74054af9abd3d78c35b85812dc8a5d2e9cc2df060。 该文件将在此挑战的技术分析文章中公布。

祝您好运,并祝您新年假期愉快!

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计