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

이전 문제와 달리 argv 인자를 사용하지 않는다. 그리고 buffer 변수의 크기가 작으므로 환경변수에 shellcode를 등록하고 ret를 환경변수의 주소로 변조하면 될 것 같다.

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

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

먼저 환경변수로 setreuid 함수가 포함된 shellcode를 입력하자. 사용한 shellcode는 다음과 같다.
\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80\x31\xc0\xb0\x01\xcd\x80
shellcode 앞에 "\x90" nop 6bytes를 입력하였는데, 이 것은 shellcode가 다른 opcode와 섞이지 않도록 분리하기 위함이다. 환경변수로 입력된 shellcode의 주소를 알아내는 방법은 다음 링크를 참고하면 된다.
참고 링크: https://jade9reen.tistory.com/48
리눅스 환경에서 환경변수로 저장한 shellcode의 주소 알아내기
bof 문제를 풀다보면 스택에 ASLR이 걸려있어 스택에 shellcode를 입력할 경우 shellcode의 주소를 정확히 알아내기 매우 어렵다. 이럴 때 환경변수에 shellcode를 저장해두고 getenv 함수로 shellcode의 주소를..
jade9reen.tistory.com

[사진 4]에서 확인한 환경변수의 주소로 ret를 변조하고 실행하면 다음 단계의 shell이 떨어지지 않는다. 그래서 환경변수로 등록된 shellcode의 주소를 직접 확인해보자.

권한문제로 goblin 파일을 디버깅할 수 없으므로, 다른 이름(koblin)으로 복사해주자.
그리고 gdb를 사용하여 환경변수의 주소를 확인해보면 0xbfffff51부터 내가 입력한 shellcode가 저장된 것을 확인할 수 있다.

따라서 위와 같이 주소를 변겨앻주면 goblin 계정의 password를 확인할 수 있다.
'Wargame > LOB' 카테고리의 다른 글
| LOB wolfman Write-Up (0) | 2019.07.30 |
|---|---|
| LOB orc Write-Up (0) | 2019.07.30 |
| LOB goblin Write-Up (0) | 2019.07.30 |
| LOB gremlin Write-Up (0) | 2019.07.30 |
| LOB gate Write-Up (0) | 2019.07.29 |