Wargame/LOB

LOB gremlin Write-Up

0xe82de_ 2019. 7. 30. 19:46
728x90
728x90
728x90

LOB gremlin 풀어보자.

 

[사진 1]

이전 문제와 달리 buffer 변수의 크기가 작기 때문에 shellcode를 buffer 변수에 입력할 수 없다. 환경변수 또는 두 번째 인자(argv[2])에 shellcode를 입력하고 ret를 변조하면 될 것 같다. 여기선 두 번째 인자를 이용해보자.

 

 

[사진 2]

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

 

 

[사진 3]

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

 

 

[사진 4]

두 번째 인자의 주소를 알기 위해 디버깅해야 하는데, 권한문제로 cobolt 파일을 디버깅할 수 없으므로 다른 이름(kobolt)으로 복사해주자.

 

 

[사진 5]

첫 번째 인자로 24bytes를 입력하여 ret까지 변조하고, 두 번째 인자로 shellcode를 입력해줘야 하기 때문에 50bytes 정도 입력하였다. 그리고 함수 프롤로그를 끝낸 main+3 지점에 브레이크 포인트를 설정하고 실행하면 위와 같이 0xbffffc3b 주소부터 두 번째 인자가 저장되는 것을 확인할 수 있다.

 

 

[사진 6]

따라서 페이로드는 위와 같이 임의의 값 "\x90" 20bytes를 입력하여 ebp까지 변조해주고 ret는 [사진 5]에서 확인한 두 번째 인자의 주소로 변조한다. 그리고 두 번째 인자로 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

shellcode 앞에 nop(\x90)를 4bytes 입력해주었는데, 이는 명령어를 구분해주기 위함이다.

이대로 실행하면 cobolt 계정의 password를 확인할 수 있다.

728x90
728x90