카테고리 없음

스윙 30기 포너블 스터디 문제풀이 (3주차 수업용)

토끼곰 2023. 10. 5. 12:15

1. return to shellcode

 

checksec 으로 확인-> 카나리 걸려있음 

 

 

코드 분석 

--> 두번 입력받음. 위에서 카나리 알아내고 아래에서 우회 

(두 입력 모두 오버플로우 가능, 위는 버퍼 크기(50) 초과 입력범위, 아래는 제한x)

 

실행 시 버퍼 주소(매번 바뀜), 버퍼와 rbp 사이의 거리 출력 

 

버퍼- rbp 사이의 거리(96)&디버거 활용해서 메모리 구조 구상 

-> 버퍼- 카나리 사이의 거리= 88 임을 알 수 있음 

 

여기에 +1 해서 89 (카나리 앞 null 제거) 바이트 입력 시 카나리값 얻기 가능 

 

 

페이로드 작성

익스플로잇 

 

 

 

 

2. ssp001

 

카나리 걸려있음 확인

 

 

코드 분석

 

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
void alarm_handler() {
    puts("TIME OUT");
    exit(-1);
}
void initialize() {
    setvbuf(stdin, NULL, _IONBF, 0);
    setvbuf(stdout, NULL, _IONBF, 0);
    signal(SIGALRM, alarm_handler);
    alarm(30);
}
void get_shell() {
    system("/bin/sh");
}
void print_box(unsigned char *box, int idx) {
    printf("Element of index %d is : %02x\n", idx, box[idx]);
}
void menu() {
    puts("[F]ill the box");
    puts("[P]rint the box");
    puts("[E]xit");
    printf("> ");
}
int main(int argc, char *argv[]) {
    unsigned char box[0x40] = {};
    char name[0x40] = {};
    char select[2] = {};
    int idx = 0, name_len = 0;
    initialize();
    while(1) {
        menu();
        read(0, select, 2);
        switch( select[0] ) {
            case 'F':
                printf("box input : ");
                read(0, box, sizeof(box));
                break;
            case 'P': //취약점!- idx 범위가 정해지지X-> box 외의 값 읽기 가능 
                printf("Element index : ");
                scanf("%d", &idx);
                print_box(box, idx); 
                break;
            case 'E': //취약점!- name의 크기 설정가능-> bof 가능
                printf("Name Size : ");
                scanf("%d", &name_len);
                printf("Name : ");
                read(0, name, name_len);
                return 0;
            default:
                break;
        }
    }
}

 

while 문 돌면서 아래 내용 수행

- case F - box에 내용 입력, P는 박스의 값을 한글자 볼 수 있고 E는 이름 크기(정수값)와 이름 길이(len, 제한x)를 입력하고 종료

 

 

 

 

메모리 구조 파악 

디버거로 disass main -> 각 실행위치 파악 (비교구문 3연속!)

0x46 = F,  0x50= P,  0x45= E (16진수->아스키) / 각 case 비교 구문임 (main에서의 해당 실행 위치 확인가능)

 

case F 내용 확인- box의 주소가 ebp-0x88 이라는 걸 알 수 있음. 

 

case P 내용 확인- idx 가 ebp-0x94

 

case E 내용 확인- name이 ebp-0x90 

 

 

메모리 구조 파악 

 

위의 내용들로 끼워맞춰가다 보면 아래와 같은 구조라는 걸 알 수 있다. 

(중간에 dummy 는 gdb에서) 

 

 

payload 작성

익스플로잇