LOB succubus Write-Up
LOB succubus 풀어보자.
주어진 코드를 보면 첫 번째 인자 argv[1] 44~47번째 값과 strcpy 함수 주소를 비교하고 다르면 프로그램을 종료시킨다. 아래에서 확인하겠지만 첫 번째 인자 argv[1] 44~47번째 값은 ret 지점을 변조시킨다. 즉 main 함수가 종료되면 strcpy 함수가 실행된다.
strcpy 함수의 인자는 총 두개이고 각 인자는 다음과 같다.
char *strcpy(char *dest, const char *src);
char *dest : 복사될 공간
const char *src : 복사할 값의 주소
먼저 main 함수의 어셈블리어 코드를 보면 strcpy 함수를 호출하기 전에 ebp-0x28 주소를 eax 레지스터에 저장한다. 즉, 이 곳이 buffer 변수의 시작점이다.
따라서 스택은 위와 같이 형성될 것이고, buffer 변수부터 44bytes를 입력하면 ebp까지 변조할 수 있다.
strcpy 함수 주소는 gdb로 쉽게 구할 수 있다.
위와 같이 첫 번째 인자 argv[1] 44~47번째 값을 strcpy 함수 주소로 입력하면 바로 종료되지는 않는다. 위에서 설명했듯이 strcpy 함수 주소가 ret를 변조하기 때문에 main 함수가 종료되면 strcpy 함수가 호출된다.
strcpy 형식에 따라 위와 같이 스택을 조작하면 된다. ebp+c dest 값은 ebp+8 strcpy_ret의 주소로 저장하고, ebp+10 src 값은 shellcode의 주소를 가리키는 주소를 저장하면 된다.
따라서 페이로드는 다음과 같다.
| 임의의 값 "\x90" 44bytes | &strcpy() 4bytes | "AAAA" dummy 4bytes | &strcpy_ret 4bytes | &(&shellcode) 4bytes |
위의 페이로드를 수행하려면 argv 인자 세개를 이용해야 한다. 첫 번째 인자 argv[1]에 위 페이로드를 입력하고, 두 번째 인자 argv[2]에 shellcode의 주소를 입력한다. 그리고 마지막 인자 argv[3]에 shellcode를 입력한다.
세그멘테이션 오류가 발생하므로 다른 이름(kightmare)으로 복사하고 생성된 core 파일을 확인해보면 필요한 인자들의 정확한 주소를 위와 같이 볼 수 있다.
1. strcpy_ret : 0xbffffab0
2. &(&shellcode) : 0xbffffc45
3. &shellcode : 0xbffffc4a
사용한 shellcode는 다음과 같다.
\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
위와 같이 임의의 값 "\x90" 44bytes를 입력하여 ebp까지 변조하고 dummy 4bytes, "\xb0\xfa\xff\xbf" 4bytes를 입력하여 strcpy 함수의 dest 변수를 변조한다. 그리고 "\x45\xfc\xff\xbf" 4bytes를 입력하여 src 변수를 변조하고 0xbffffc45 주소는 두 번째 인자 argv[2]의 주소이다. 두 번째 인자 argv[2]에는 shellcode의 주소를 입력하고 세 번째 인자 argv[3]에는 shellcode를 입력한다.
'Wargame > LOB' 카테고리의 다른 글
LOB xavius Write-Up (0) | 2019.08.01 |
---|---|
LOB nightmare Write-Up (0) | 2019.08.01 |
LOB zombie_assassin Write-Up (0) | 2019.08.01 |
LOB assassin Write-Up (0) | 2019.08.01 |
LOB giant Write-Up (0) | 2019.08.01 |