Wargame/LOB

LOB gate Write-Up

0xe82de_ 2019. 7. 29. 11:10
728x90
728x90
728x90

LOB gate 풀어보자.

 

[사진 1]

코드를 보면 buffer 변수를 256바이트만큼 선언하고 strcpy 함수로 입력받은 매개변수를 buffer 변수에 복사하고 있다.

 

 

[사진 2]

main 함수의 어셈블리어 코드를 보면 strcpy 함수를 호출하기 전에 ebp-0x100 주소를 eax 레지스터에 저장하고 있다.

즉, 이 곳이 buffer 변수의 시작점이다.

 

 

[사진 3]

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

 

 

[사진 4]

먼저 권한문제로 gremlin 파일을 디버깅할 수 없으므로 다른 이름(kremlin)으로 복사해주자.

 

 

[사진 5]

그 다음 gdb로 복사된 파일을 실행시켜서 ebp를 확인하면 고정적인 것을 알 수 있다. 따라서 shellcode를 buffer 변수에 입력하고 리턴 주소를 buffer 변수 주소로 변조시키면 shellcode가 실행될 것이다.

 

 

[사진 6]

정확한 buffer 변수의 주소를 알기 위해 위와 같이 임의의 값 "\x90" 260개를 입력하고 [사진 2]에서 확인했던 strcpy함수 실행 직후에 브레이크 포인트를 설정하였다. 그러면 ebp까지 변조된 것을 확인할 수 있다. 현재 esp부터 스택을 확인하면 주소 0xbffff928부터 임의의 값이 들어가 있는 것을 확인할 수 있는데, 이 지점이 buffer 변수의 주소이다.

 

 

[사진 7]

정확한 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를 확인할 수 있다.

728x90
728x90