LOB skeleton Write-Up

2019. 8. 1. 00:20
728x90
728x90
728x90

LOB skeleton 풀어보자.

 

[사진 1]

주어진 코드를 보면 환경변수를 초기화하는 코드는 사라졌다. 하지만 프로그램 종료 직전에 ret를 제외하고 buffer 변수부터 메모리 끝(높은 주소)까지 0x0으로 초기화한다. 따라서 argv, 환경변수, buffer 변수 모두 사용할 수 없다.

즉, 스택에서 buffer 변수보다 낮은 주소에 shellcode를 저장해야 한다는 뜻이다. 이럴 때 사용할 수 있는 방법은 공유 라이브러리가 있다.

 

공유 라이브러리는 코드의 재사용을 줄이기 위한 것이다. 예를 들어 printf 함수나 strcpy 함수 등 자주 사용되는 함수들의 코드가 개인이 만든 프로그램마다 포함된다면 용량은 늘어나고 비효율적일 것이다. 따라서 자주 사용되는 함수들을 별도의 파일로 만들어두고 필요할 때 해당 파일을 참조하여 사용하는 것이다.

 

리눅스에서는 "LD_PRELOAD"라는 환경변수를 사용하는데, 이 환경변수를 지정해 놓으면 프로그램이 각종 라이브러리를 로딩할 때 "LD_PRELOAD"에 선언된 라이브러리를 가장 먼저 로딩하게 된다. 즉, 이미 존재하는 라이브러리와 이름을 같게 하면 정상적인 라이브러리가 로딩되지 않고 다른 기능을 하는 라이브러리를 로딩할 수 있다. "LD_PRELOAD" 환경변수에 쉘을 실행시키는 shellcode를 등록하여 다음 계쩡의 쉘을 따보자.

 

 

[사진 2]
[사진 3]

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

 

 

[사진 4]

따라서 스택은 위와 같이 형성될 것이고, strcpy 함수로 argv[1] 값을 buffer 변수로 복사하므로 44bytes를 입력하면 ebp까지 변조할 수 있다.

 

 

[사진 5]

gcc로 컴파일하면 되는데, 사용한 옵션의 기능은 다음과 같다.

-fPIC : 다른 파일과 동적 링크가 가능하도록 함

-shared : 공유 라이브러리 생성

컴파일할 때 파일명에 shellcode를 입력하기 때문에 디렉터리를 의미하는 "\x2f" 값이 들어간 shellcode는 사용할 수 없다. 사용한 shellcode는 다음과 같다.

\xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x32\xc1\x51\x69\x30\x30\x74\x69\x69\x30\x63\x6a\x6f\x8a\xe4\x51\x54\x8a\xe2\x9a\xb1\x0c\xce\x81

컴파일 후 file 명령어로 파일을 보면 공유 파일임을 확인할 수 있다.

 

 

[사진 6]

그 다음 "LD_PRELOAD" 환경변수에 shellcode를 파일명으로 가지는 파일의 절대경로를 등록한다. 위와 같이 환경변수에 등록된 것을 확인할 수 있다.

 

 

[사진 7]

그 다음 메모리에 로딩된 "LD_PRELOAD" 환경변수의 주소를 알기 위해 golem 파일을 다른 이름(kolem)으로 복사하고 gdb로 실행하였다. 프로그램이 종료되기 직전에 브레이크 포인트를 설정하고 입력 값으로 위와 같이 프로그램이 종료되지 않도록 첫 번째 인자 argv[1][47] 값이 "\xbf"이 되도록 하면 된다. 그리고 당연히 "LD_PRELOAD" 환경변수는 kolem 파일보다 낮은 주소의 메모리에 적재되기 때문에 "x/1000x $esp-3000" 옵션으로 환경변수를 찾으면 된다.

 

 

[사진 8]

그러면 위와 같이 컴파일할 때 입력했던 nop "\x90" 값으로 시작하고 shellcode로 이어지는 부분을 확인할 수 있다.

nop가 시작되는 주소는 0xbffff5a7이다.

 

 

[사진 9]

따라서 위와 같이 임의의 값 44bytes를 입력하여 ebp까지 변조하고 ret를 "LD_PRELOAD" 환경변수의 주소로 변조하면 다음 계정인 golem의 password를 확인할 수 있다.

728x90
728x90

'Wargame > LOB' 카테고리의 다른 글

LOB darkknight Write-Up  (0) 2019.08.01
LOB golem Write-Up  (0) 2019.08.01
LOB vampire Write-Up  (0) 2019.07.31
LOB troll Write-Up  (0) 2019.07.31
LOB orge Write-Up  (0) 2019.07.31

+ Recent posts