본문 바로가기

System Hacking

[Dreamhack] basic_exploitation_003 풀이 - 티스토리

 

 

이전 문제와 비슷하다 

 

 

#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[]) {
    char *heap_buf = (char *)malloc(0x80);
    char stack_buf[0x90] = {};
    initialize();
    read(0, heap_buf, 0x80); 
    sprintf(stack_buf, heap_buf);
    printf("ECHO : %s\n", stack_buf);
    return 0;
}

 

코드 분석

 

 

다른 점이 있다면 이번엔 exit함수가 없다

 

 

 

또, sprintf함수를 이용해서 stack_buf에 heap_buf에 입력 받은 값을 덮어 출력 시켜주고 있다

 

 

 

즉, sprintf가 실행되며 fsb가 발생한다

 

 

 

printf의 got값을 덮어서 get_shell을 실행 시킬 수 있다

 

 

 

 

 

처음에 main의 ret값을 덮으려 했는데 이건 안 되는 거 같다

 

 

 

 

정보수집

 

 

get_shell : 0x08048669

 

 

 

 

 

 

printf_got : 0x0804a010

 

 

 

 

 

시나리오

 

 

이전 문제처럼 0x0804a010에 %n을 이용해서 0x08048669를 덮어 씌울라 했으나 세그먼트 폴트로 프로그램이 강제종료 된다

 

 

 

 

별로 고민 안하고 (이러면 안 되는데)

 

 

 

질문창에서 힌트를 얻었다 ㅋ

 

 

 

sprintf에서 stack_buf에 할당된 값이 얼마 안 돼서 그 값을 초과하는 값을 출력 시키기 때문에 세그먼트 폴트가 발생하는 것이었다

 

 

 

따라서 0x80 안으로 출력 시켜줘야 하고 그 안에서 변조가 이루어져야 한다

 

 

 

printf_got : 0x0804a010, get_shell : 0x08048669

 

 

자세히 보면 두 주소는 하위 2바이트값만 다르기때문에  하위 2바이트 값만 바꿔주면 된다

 

 

 

 

최종 페이로드