LOB bugbear Write-Up
LOB bugbear 풀어보자.

코드가 길어졌지만 정리하면 다음과 같다.
1. libc 주소를 lib_addr 변수에 저장
2. execve 주소를 execve_offset 변수에 저장
3. execve_addr 변수에 lib_addr 변수의 값과 execve_offset 변수의 값을 더해서 저장
4. ret 변수에 첫 번째 인자의 44~47번째 값을 저장
5. ret 변수의 값과 execve_addr 변수의 값이 일치하지 않으면 프로그램 종료
요약하자면 execve 함수의 주소를 읽어와서 ret 변수의 값과 비교한다.
공유 라이브러리 내의 함수 주소를 알아내는 법은 다음 링크를 참고하면 된다.
참고 링크: https://jade9reen.tistory.com/72?category=802267
리눅스 환경에서 공유 라이브러리 내의 함수 주소와 필요한 인자 주소 알아내기
bof 문제를 풀다보면 RTL을 사용하기 위해 공유 라이브러리 내의 함수를 이용할 때가 있다. 여기선 system 함수와 필요한 인자인 "/bin/sh" 문자열을 예로 든다. 먼저 system 함수의 주소를 알아내는 방법은 두..
jade9reen.tistory.com

위와 같이 giant 파일을 다른 이름(kiant)으로 복사해주고 gdb로 실행하면 된다. main에 브레이크 포인트를 설정하고 p 명령어로 execve 함수와 system 함수, exit 함수의 주소를 확인할 수 있다.


main 함수의 어셈블리어 코드를 보면 strcpy 함수를 호출하기 전에 ebp-0x28 주소를 eax 레지스터에 저장한다. 즉, 이 곳이 buffer 변수의 시작점이다.

따라서 스택은 위와 같이 형성될 것이고, buffer 변수부터 44bytes를 입력하면 ebp까지 변조할 수 있다.

위와 같이 첫 번째 인자의 44~47번째 값을 execve 함수의 주소를 입력하여 ret를 변조할 수 있다. 이 때 python 앞뒤를 "로 묶어줘야 한다. 이유는 execve 함수의 주소 중 "\x0a" 값이 있는데 \n 개행으로 인식한다. "로 묶어주면 개행으로 인식하지 않고 정상적으로 값이 저장된다.
execve 함수의 인자는 총 세개이고 각 인자는 다음과 같다.
int execve(const char *path, char *const argv[], char *const envp[]);
const char *path : 실행할 파일의 경로
char *const argv[] : 실행되는 파일에 전달하는 인자의 배열
char *const envp[] : 환경 변수 / 없으면 NULL
정리하자면 execve("/bin/sh", {"/bin/sh", 0}, 0); 형식으로 실행되게끔 하면 된다.
execve 함수에서 두 번째 인자는 char 포인터 배열이기 때문에 argv[0]의 '/bin/sh" 문자열은 심볼릭 링크로 만들어야 한다. 파일명이 "/bin/sh" 주소인 파일을 복사하고 파일명의 주소를 찾으면 된다.

위와 같이 스택이 형성되도록 하면 된다.
먼저 실행할 파일인 "/bin/sh" 문자열의 주소를 찾는 방법은 다음 링크를 참고하면 된다.
참고 링크: https://jade9reen.tistory.com/72
리눅스 환경에서 공유 라이브러리 내의 함수 주소와 필요한 인자 주소 알아내기
bof 문제를 풀다보면 RTL을 사용하기 위해 공유 라이브러리 내의 함수를 이용할 때가 있다. 여기선 system 함수와 필요한 인자인 "/bin/sh" 문자열을 예로 든다. 먼저 system 함수의 주소를 알아내는 방법은 두..
jade9reen.tistory.com

위 링크를 참고하여 찾은 "/bin/sh" 문자열의 주소로 giant 파일을 복사한다. 그리고 gdb로 함수 프롤로그가 끝난 지점에 브레이크 포인트를 설정하고 실행한다. 파일명은 메모리 끝에 있으므로 "x/100s 0xbfffffff-1000" 정도 출력하면 된다.

위와 같이 "/bin/sh" 문자열이 파일명인 절대경로 파일의 주소 0xbfffffe7을 찾을 수 있다. 그리고 NULL 값의 주소 0xbffffffc도 찾을 수 있다.

현재 찾은 파일의 주소는 절대경로이므로 "/home/bugbear/./" 문자열의 길이만큼 더하여 "/bin/sh" 파일명의 주소만 구하면 된다.

다음으로 giant 파일로 "/bin/sh" 문자열의 주소를 파일명으로 하는 심볼릭 링크 파일을 만들어준다. 임의의 값 "\x90" 44bytes로 ebp까지 변조시키고 execve 함수의 주소로 ret를 변조한다. 그리고 execve 함수의 ret가 될 ebp+8 지점을 exit() 함수의 주소로 변조하고 execve 함수의 인자들을 입력한다. 그러면 위와 같이 giant 계정의 password를 확인할 수 있다.
'Wargame > LOB' 카테고리의 다른 글
| LOB assassin Write-Up (0) | 2019.08.01 |
|---|---|
| LOB giant Write-Up (0) | 2019.08.01 |
| LOB darkknight Write-Up (0) | 2019.08.01 |
| LOB golem Write-Up (0) | 2019.08.01 |
| LOB skeleton Write-Up (0) | 2019.08.01 |