LOB wolfman Write-Up
LOB wolfman 풀어보자.
이전 문제와 다른 점은 첫 번째 인자의 길이가 48bytes를 초과하면 프로그램을 종료한다. 따라서 첫 번재 인자에 shellcode를 입력하고 ret를 shellcode의 주소로 변조하는 것은 불가능하다. 하지만 argv 인자 갯수를 제한하지 않으므로 로 두 번째 인자인 argv[2]에 shellcode를 입력하고 ret를 argv[2] 주소로 변조하면 될 것 같다.
위와 같이 첫 번째 전달 인자의 48번째 값을 "\xbf"로 주면 바로 죵료되지는 않지만 추가로 입력하면 프로그램이 종료된다.
main 함수의 어셈블리어 코드를 보면 strcpy 함수를 호출하기 전에 ebp-0x28 주소를 eax 레지스터에 저장한다. 즉, 이 곳이 buffer 변수의 시작점이다.
따라서 스택은 위와 같이 형성될 것이고, strcpy 함수로 argv[1] 값을 buffer 변수로 복사하므로 44bytes를 입력하면 ebp까지 변조할 수 있다.
디버깅하기 위해 darkelf 파일을 다른 이름(karkelf)으로 복사하였다. 그리고 함수 프롤로그를 마치는 main+3에 브레이크 포인트를 설정하고 첫 번째 인자로 임의의 값 "\x90" 44bytes와 ret를 변조할 값 "ABCD"을 입력하고 두 번째 인자로 shellcode 용도의 50bytes를 입력하였다. 그러면 위와 같이 0xbffffc3a 주소부터 두 번째 인자가 저장되는 것을 확인할 수 있다.
따라서 페이로드는 위와 같이 임의의 값 "\x90" 44bytes를 입력하여 ebp까지 변조해주고 ret는 [사진 6]에서 확인한 두 번째 인자의 주소로 변조한다. 그리고 두 번째 인자로 shellcode를 입력해주는데 사용한 shellcode는 다음과 같고 setreuid 함수가 포함되었다.
\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)를 6bytes 입력해주었는데, 이는 명령어를 구분해주기 위함이다.
이대로 실행하면 darkelf 계정의 password를 확인할 수 있다.
'Wargame > LOB' 카테고리의 다른 글
LOB orge Write-Up (0) | 2019.07.31 |
---|---|
LOB darkelf Write-UP (0) | 2019.07.30 |
LOB orc Write-Up (0) | 2019.07.30 |
LOB goblin Write-Up (0) | 2019.07.30 |
LOB cobolt Write-Up (0) | 2019.07.30 |