← Back to Writeups
CUSTOMMediumReversing

Call my name softly

XESXOR9/10/20263 min read
#reversing#custom#medium#function_chain_analysis#hex_to_ascii#static_analysis#linux

Call my name softly

Platform: TaipanByte CTF | Category: Reversing | Type: Challenge | Difficulty: Medium | OS: Linux | Author: XESXOR | Date: 2026-01-15 | Status: Solved Techniques: function_chain_analysis, hex_to_ascii, static_analysis

Summary

The challenge provided a ZIP file containing 15.15, an ELF 64-bit LSB PIE executable written in C++, not stripped, with debug info.

Call my name softly - TaipanByte CTF

Description

The challenge provided a ZIP file containing 15.15, an ELF 64-bit LSB PIE executable written in C++, not stripped, with debug info.

The challenge name "Call my name softly" is a hint about the recursive function calls that "softly call" each other in a chain.

Analysis

Binary Identification

bash
$ file 15.15
15.15: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, 
interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=..., for GNU/Linux 3.2.0, 
with debug_info, not stripped

‍​‌‌​​‌​​​‌‌​​‌​​​​‌‌​‌​​​​‌‌‌​​‌​​‌‌​​​‌​​‌‌‌​​​​​‌‌​‌‌​​​‌‌​​​​‍

Function Chain Discovery

Using radare2, discovered two chains of functions:

First Chain:

firstFirst() -> firstSecond() -> firstThird() -> ... -> firstFifteenth()

Second Chain:

secondFirst() -> secondSecond() -> secondThird() -> ... -> secondFifteenth()

Each function in the chain calls the next one, creating a "soft calling" pattern - hence the challenge name.

Hex Strings in Terminal Functions

The terminal functions (firstFifteenth and secondFifteenth) return hex-encoded strings: ‍​‌‌​​‌​​​‌‌​​‌​​​​‌‌​‌​​​​‌‌‌​​‌​​‌‌​​​‌​​‌‌‌​​​​​‌‌​‌‌​​​‌‌​​​​‍

FunctionHex String
firstFifteenth()315f35306c7633645f3768335f3
secondFifteenth()16e66316e3137795f3531366e

Main Function Logic

The main() function performs the following operations:

  1. Calls firstFirst() which traverses the first chain and returns the first hex string
  2. Calls secondFirst() which traverses the second chain and returns the second hex string
  3. Concatenates both hex strings
  4. Passes the combined string to hexToText() function to decode
  5. Wraps the result with CTF{ and } ‍​‌‌​​‌​​​‌‌​​‌​​​​‌‌​‌​​​​‌‌‌​​‌​​‌‌​​​‌​​‌‌‌​​​​​‌‌​‌‌​​​‌‌​​​​‍

Solution

Decoding Process

bash
# Combined hex string from both chains
combined="315f35306c7633645f3768335f316e66316e3137795f3531366e"

# Decode hex to ASCII
echo "$combined" | xxd -r -p
# Output: REDACTED

Alternative Python Solution

python
#!/usr/bin/env python3

# Hex strings from the two function chains
first_hex = "315f35306c7633645f3768335f3"
second_hex = "16e66316e3137795f3531366e"

# Combine and decode
combined = first_hex + second_hex
decoded = bytes.fromhex(combined).decode('ascii')
‍​‌‌​​‌​​​‌‌​​‌​​​​‌‌​‌​​​​‌‌‌​​‌​​‌‌​​​‌​​‌‌‌​​​​​‌‌​‌‌​​​‌‌​​​​‍

# Construct flag
flag = f"CTF{{{decoded}}}"
print(flag)
# Output: CTF{REDACTED}

Flag Meaning

The decoded text REDACTED is leetspeak for:

"I solved the infinity sign"

The "infinity sign" (∞) relates to the number 15 in the binary name (15.15) and the 15 functions in each chain - the infinity symbol resembles two connected loops, just like the two function chains.

Tools Used

ToolPurpose
fileIdentify binary type (ELF 64-bit, C++, debug info)
stringsFind embedded strings and function names
radare2Disassembly and function chain analysis
xxdHex to ASCII decoding
‍​‌‌​​‌​​​‌‌​​‌​​​​‌‌​‌​​​​‌‌‌​​‌​​‌‌​​​‌​​‌‌‌​​​​​‌‌​‌‌​​​‌‌​​​​‍

Lessons Learned

  1. Challenge name hints: "Call my name softly" directly hints at the function calling pattern
  2. Debug symbols help: The binary being "not stripped" with debug info made function names visible
  3. Pattern recognition: Sequential function naming (first, second, ..., fifteenth) reveals the chain structure
  4. Two-part secrets: Data split across multiple function chains is a common obfuscation technique ‍​‌‌​​‌​​​‌‌​​‌​​​​‌‌​‌​​​​‌‌‌​​‌​​‌‌​​​‌​​‌‌‌​​​​​‌‌​‌‌​​​‌‌​​​​‍