CTF/Dreamhack.io

[Pwnable] off_by_one_000

현생준비중 2022. 1. 26. 15:20

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <string.h>

char cp_name[256];

void get_shell()
{
    system("/bin/sh");
}

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

int cpy()
{
    char real_name[256];
    strcpy(real_name, cp_name);
    return 0;
}

int main()
{
    initialize();
    printf("Name: ");
    read(0, cp_name, sizeof(cp_name));

    cpy();

    printf("Name: %s", cp_name);

    return 0;
}

뭔가 많다. read()로 전역변수 char cp_name[256] 만큼 읽어들이고, cpy()에서

다시 strcpy()cp_name의 내용을 real_name에다가 집어넣는다.

마무리로 cp_name을 출력.

 

일단, RET 주소를 수정해서 get_shell()이 실행되도록 해야한다는 건 알겠는데..

감이 안온다면, 무작정 아무거나 넣어보자. 어떻게든 되겠지

 

"aaaa"를 256개를 넣으니 0x41414141로 되었다. 뭐지?

그래서 노가다를 했다. 진짜 왜 되는거지?

system() 함수 내부에서 /bin/sh 를 불러와서 /bin/sh를 실행시켜야 하는데 그걸 덮어썼나보다.

진짜 뭐지? 적당히 수정하니까 잘 된다. 왜 되는거지?

좀.. 공부를 하고 할 걸 그랬나..?

 

다시 해보자!

'CTF > Dreamhack.io' 카테고리의 다른 글

[Reversing] rev-basic-7  (0) 2022.01.26
[Reversing] rev-basic-6  (0) 2022.01.24
[Reversing] rev-basic-5  (0) 2022.01.23
[Reversing] rev-basic-4  (0) 2022.01.21
[Web] csrf-1  (0) 2022.01.21