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

주어진 코드를 보면 환경변수를 모두 0으로 초기화한다. 따라서 환경변수에 shellcode를 입력하여 ret를 변조하는 것은 불가능하므로, argv 인자에 shellcode를 입력해야 한다. 그런데 argv[1][47] != "\xbf" 이면 프로그램을 종료하고 있다.

위와 같이 첫 번째 인자의 48번 째 값이 "\xbf"이면 프로그램이 바로 종료되지는 않는다.


main 함수의 어셈블리어 코드를 보면 main+135 ~ main+146 구간이 argv[1][47]이 "\xbf"인지를 확인하는 곳이다. 그리고 main+189의 strcpy 함수를 호출하기 전에 ebp-0x28 주소를 eax 레지스터에 저장하고 있다. 즉, 이 곳이 buffer 변수의 시작점이다.

따라서 스택은 위와 같이 형성될 것이고 argv 인자를 통해 44bytes를 입력하면 ebp까지 변조할 수 있다.

먼저 디버깅하기 위해 orc 파일을 다른 이름(ork)으로 복사해주었다. gdb를 통해 [사진 3]에서 확인했던 main+146에 브레이크 포인트를 설정하고 인자로 임의의 값 "\x90" 47bytes와 "\xbf", shellcode 용도의 50bytes를 입력하였다. 그리고 edx 레지스터를 확인하면 0xbffffc45에 "\xbf" 값이 들어가고 이후엔 shellcode 용도로 입력한 "\x90" 값이 들어가 있다.
그리고 그 주소는 0xbffffc46이다.

따라서 위와 같이 임의의 값 "\x90" 44bytes로 ebp까지 변조하고 ret는 [사진 6]에서 확인한 shellcode 주소인 0xbffffc46 + @로 변조하자. 그리고 shellcode를 추가로 입력해주면 변조된 ret는 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
그러면 orc 계정의 password를 확인할 수 있다.
'Wargame > LOB' 카테고리의 다른 글
| LOB wolfman Write-Up (0) | 2019.07.30 |
|---|---|
| LOB orc Write-Up (0) | 2019.07.30 |
| LOB cobolt Write-Up (0) | 2019.07.30 |
| LOB gremlin Write-Up (0) | 2019.07.30 |
| LOB gate Write-Up (0) | 2019.07.29 |