Linux

84次阅读
没有评论

Linux

三剑客

telnet 101.37.152.107 31650

连接到靶机

Linux

Windows下出现编码问题 切换到wsl

ctf@pod-7f8879e314c6e7ba8055:~$ checkme
TASK 1 请输入一条命令,将标准输入中的所有x字符删除,并在第10行后插入一行checkme
输入命令:tr -d 'x' | sed '10a\checkme'
[+] 检测通过!
TASK 2 请输入一条命令,给标准输入中的每一行加一个行号,类似1 ...
输入命令:nl -ba -w1 -s' '
[+] 检测通过!
TASK 3 请输入一条命令,从标准输入中取出所有形如13190011239这样的电话号码
输入命令:grep -oE '1[0-9]{10}'
[+] 检测通过!
[^] 恭喜通过所有测试!flag是:CBCTF{b961b562-2f04-46db-9099-657dfc2d1fd8}

GuessWhat

只需要一个二分查找

from pwn import *
import re

# 开启调试模式,可以看到发送和接收的具体数据
context.log_level = 'debug'

# 靶机信息
ip = '101.37.152.107'
port = 48217

# 建立连接
io = remote(ip, port)

# 题目给出的最大值(可以直接复制题目中的数字)
MAX_NUM = 179769313486231590772930519078902473361797697894230657273430081157732675805500963132708477322407536021120113879871393357658789768814416622492847430639474124377767893424865485276302219601246094119453082952085005768838150682342462881473913110540827237163350510684586298239947245938479716304835356329624224137215

# 初始化二分查找的边界
low = 0
high = MAX_NUM

# 处理初始的 Banner 信息
# 接收直到出现 "输入一个数字:"
io.recvuntil(b': ')

while low <= high:
    # 计算中间值
    mid = (low + high) // 2
    
    # 发送猜测的数字,注意要加换行符
    io.sendline(str(mid).encode())
    
    # 接收服务器的反馈
    # 假设服务器会回显 "猜得太小了" 或 "猜得太大了" 并且紧接着再次提示 "输入一个数字:"
    # 如果网速慢,建议分步 recv,这里使用 recvlines 或 recvuntil 比较稳妥
    try:
        # 尝试读取反馈行
        response = io.recvline() 
        
        # 打印当前的进度,方便观察
        print(f"Guess: {mid}, Response: {response.decode(errors='ignore').strip()}")
        
        # 判断逻辑 (UTF-8编码下:'小'=\xe5\xb0\x8f, '大'=\xe5\xa4\xa7)
        if b'\xe5\xb0\x8f' in response or b'small' in response.lower():
            # 猜小了,说明目标在右边,提升下界
            low = mid + 1
        elif b'\xe5\xa4\xa7' in response or b'big' in response.lower():
            # 猜大了,说明目标在左边,降低上界
            high = mid - 1
        elif b'flag' in response.lower() or b'ctf' in response.lower() or b'{' in response:
            # 出现 Flag 标志,直接打印并跳出
            print("\n[+] Found Flag!")
            print(response.decode())
            # 如果 flag 在下一行,再读一下
            print(io.recvall(timeout=2).decode()) 
            break
        else:
            # 有时候 feedback 和 prompt 会粘在一起,或者格式不对,这里做个兜底
            # 如果反馈不是大小,可能是猜对了但没有明显的 flag 关键字
            pass
            
        # 清理掉下一次输入的提示符 "输入一个数字:",以便下一次循环干净地 sendline
        # 使用 timeout 防止脚本卡死
        io.recvuntil(b': ', timeout=0.5)

    except EOFError:
        print("[-] Connection closed unexpectedly.")
        break
    except KeyboardInterrupt:
        print("[-] User interrupted.")
        break

# 保持交互(如果拿到shell的话),对于猜数字通常不需要
io.close()

Linux

I use Debian btw

ctf@pod-099b81c039da23b5572c:~$ cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 13 (trixie)"
NAME="Debian GNU/Linux"
VERSION_ID="13"
VERSION="13 (trixie)"
VERSION_CODENAME=trixie
DEBIAN_VERSION_FULL=13.0
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

ctf@pod-099b81c039da23b5572c:~$ id
uid=1000(ctf) gid=1000(ctf) groups=1000(ctf)

ctf@pod-099b81c039da23b5572c:~$ sudo apt install procps file libelf-dev -y
sudo: CLOSING STDIN BEFORE INVOKING APT...
Installing:
  file  libelf-dev  procps

Installing dependencies:
  libc-dev-bin  libcrypt-dev  libmagic-mgc  libncursesw6  libzstd-dev     manpages      psmisc        zlib1g-dev
  libc6-dev     libelf1t64    libmagic1t64  libproc2-0    linux-libc-dev  manpages-dev  rpcsvc-proto

Suggested packages:
  libc-devtools  glibc-doc  man-browser

Summary:
  Upgrading: 0, Installing: 18, Removing: 0, Not Upgrading: 0
  Download size: 11.8 MB
  Space needed: 49.5 MB / 420 GB available
。。。。省略结果



lazygit_0.54.2_linux_x86_64.tar.gz   100%[======================================================================>]   7.54M  14.1MB/s    in 0.5s

2025-12-15 13:59:52 (14.1 MB/s) - 'lazygit_0.54.2_linux_x86_64.tar.gz' saved [7906869/7906869]

ctf@pod-05817a644baffedc60db:~$ ls
hint  lazygit_0.54.2_linux_x86_64.tar.gz
ctf@pod-05817a644baffedc60db:~$ cat hint
What will you do when you get a shell?
Run checkme to get flag!
ctf@pod-05817a644baffedc60db:~$ lazygit_0.54.2_linux_x86_64.tar.gz
bash: lazygit_0.54.2_linux_x86_64.tar.gz: command not found
ctf@pod-05817a644baffedc60db:~$ tar xf lazygit_0.54.2_Linux_x86_64.tar.gz
tar: lazygit_0.54.2_Linux_x86_64.tar.gz: Cannot open: No such file or directory
tar: Error is not recoverable: exiting now
ctf@pod-05817a644baffedc60db:~$ tar xf lazygit_0.54.2_linux_x86_64.tar.gz
ctf@pod-05817a644baffedc60db:~$ ls
LICENSE  README.md  hint  lazygit  lazygit_0.54.2_linux_x86_64.tar.gz
ctf@pod-05817a644baffedc60db:~$ cd lazygit
bash: cd: lazygit: Not a directory
ctf@pod-05817a644baffedc60db:~$ ls
LICENSE  README.md  hint  lazygit  lazygit_0.54.2_linux_x86_64.tar.gz
ctf@pod-05817a644baffedc60db:~$ ./lazygit
2025/12/15 14:00:41 Git version must be at least 2.32.0. Please upgrade your git version.

ctf@pod-05817a644baffedc60db:~$ file lazygit
lazygit: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, BuildID[sha1]=c2d913ebc9b342bfa601bb4296492a46706d0769, stripped


拿到一台机器,首先要检查一下系统信息,这台机器的发行版完整名字是(PRETTY_NAME)?
Debian GNU/Linux 13 (trixie)
[-] 通过
ctf用户的权限是多少(UID)?
1000
[-] 通过
接下来我来看看有没有下列工具
[+] 已找到 ps
[+] 已找到 file
[+] 已找到 libelf
[-] 已找到所有文件
用户Jackson的家目录下有一个signature文件,请你读取其中的内容告诉我
6802d535-a3f1-409e-99cf-d98e7b94c6e8
[-] 通过
你知道git吗?lazygit是一个TUI前端,可以方便git操作,请你帮我取来0.54.2版本,并告诉我文件的路径
6802d535-a3f1-409e-99cf-d98e7b94c6e8
[x] 文件路径有误
ctf@pod-05817a644baffedc60db:~$ checkme
对于以下多个问题,你可以先写好答案,然后直接管道给checkme哦
拿到一台机器,首先要检查一下系统信息,这台机器的发行版完整名字是(PRETTY_NAME)?
Debian GNU/Linux 13 (trixie)
[-] 通过
ctf用户的权限是多少(UID)?
1000
[-] 通过
接下来我来看看有没有下列工具
[+] 已找到 ps
[+] 已找到 file
[+] 已找到 libelf
[-] 已找到所有文件
用户Jackson的家目录下有一个signature文件,请你读取其中的内容告诉我
6802d535-a3f1-409e-99cf-d98e7b94c6e8
[-] 通过
你知道git吗?lazygit是一个TUI前端,可以方便git操作,请你帮我取来0.54.2版本,并告诉我文件的路径
/home/ctf/lazygit
[-] 通过
最后从lazygit中提取出编译的build id信息吧(GNU的)
c2d913ebc9b342bfa601bb4296492a46706d0769
[-] 通过
恭喜你成功通过了所有测试!flag是:CBCTF{Wow-u-R-LLNUX-MAst3R}

Linux

Coreflag

本题的核心逻辑:用 gdb 打开 core 文件,然后借助已经存在在系统里的 debuginfod(调试信息服务器)来自动拉取源码/符号,还原程序逻辑。

文件操作:不要在Windows下对压缩包文件进行解压,需要使用Linux:
因为拿到的 core.tar.zst 就是一个 tar 包(存储了 core dump、对应 ELF、可能还有符号信息),并且为了压缩体积,用了 zstd 算法 (.zst) 压缩。而 core dump 本身是 稀疏文件 (sparse file),所以 tar 在打包的时候会生成辅助文件夹 GNUSparseFile.0/ 来存储稀疏区段的偏移和数据。这就是为什么如果在Windows环境解压出来之后:
有一个 cook(这是 ELF 执行文件)
有一个 GNUSparseFile.0/core.cook.3821(这是 tar 存稀疏文件的数据片段,不是完整 core dump)

所以,应该在 Linux 上应该这样操作:

#先解压 .zst
unzstd core.tar.zst

#得到 core.tar 再解
tar --sparse -xvf core.tar

关键是 –sparse,它会把 core dump 从稀疏块信息重建成一个 真正的 ELF core 文件。
否则只会得到一个不可识别的 "GNUSparseFile.0" 文件夹。(如果你在Windows环境下使用winrar等软件直接操作就是这个结果)

Linux

随后执行:

export DEBUGINFOD_URLS="http://101.37.152.107:57628" #设置环境变量 把DEBUGINFOD_URLS设置成debuginfod服务器地址
#进入dgb
gdb ./cook core.cook.3821

set debuginfod enabled on
bt                   # 查看调用栈
frame 0
list                 # 自动下载源码并显示

#以上步骤就能得到flag

Linux

正文完
 0
评论(没有评论)