LOB gate Write-Up
LOB gate 풀어보자.
코드를 보면 buffer 변수를 256바이트만큼 선언하고 strcpy 함수로 입력받은 매개변수를 buffer 변수에 복사하고 있다.
main 함수의 어셈블리어 코드를 보면 strcpy 함수를 호출하기 전에 ebp-0x100 주소를 eax 레지스터에 저장하고 있다.
즉, 이 곳이 buffer 변수의 시작점이다.
따라서 스택은 위와 같이 형성될 것이고, 260bytes를 입력하면 ebp까지 변조가 가능하다.
먼저 권한문제로 gremlin 파일을 디버깅할 수 없으므로 다른 이름(kremlin)으로 복사해주자.
그 다음 gdb로 복사된 파일을 실행시켜서 ebp를 확인하면 고정적인 것을 알 수 있다. 따라서 shellcode를 buffer 변수에 입력하고 리턴 주소를 buffer 변수 주소로 변조시키면 shellcode가 실행될 것이다.
정확한 buffer 변수의 주소를 알기 위해 위와 같이 임의의 값 "\x90" 260개를 입력하고 [사진 2]에서 확인했던 strcpy함수 실행 직후에 브레이크 포인트를 설정하였다. 그러면 ebp까지 변조된 것을 확인할 수 있다. 현재 esp부터 스택을 확인하면 주소 0xbffff928부터 임의의 값이 들어가 있는 것을 확인할 수 있는데, 이 지점이 buffer 변수의 주소이다.
정확한 buffer 변수의 주소를 알아냈으니 페이로드는 위와 같다. 원본 소스에서 권한 상승이 일어나지 않기 때문에 setreuid 함수가 포함된 shellcode를 사용하였다. 사용한 shellcode는 다음과 같고 47bytes이다.
\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
그리고 260bytes를 입력해야 ebp까지 변조되므로 213bytes를 임의의 값으로 채워준다. 그리고 buffer 변수의 주소를 입력하면 ret까지 변조될 것이다.
그러면 위와 같이 gremlin 계정의 password를 확인할 수 있다.