LEVEL 11
[level11] passcode : what!@#$?
(NO DRAG, NO PASSCODE)
attackme 라는 실행파일이 존재하나 level11의 권한에서는 실행과 읽기권한만 존재한다.
이제 hint를 살펴보자.
아마도 level11의 소스코드인 것 같다. 코드를 한번 분석해 보자.
#include <stdio.h>
#include <stdlib.h>
int main( int argc, char *argv[] )
{
char str[256]; //256바이트의 배열 선언
setreuid( 3092, 3092 ); //level12 권한 부여
strcpy( str, argv[1] ); //str에 argv[1]를 복사
printf( str ); //문자열 str을 출력
}
여기서 str의 길이를 검사하는 코드가 존재하지 않기 때문에 버퍼 오버플로우의 취약점이 존재한다.
우선 gdb로 프로그램을 뜯어보자.
main 함수에서 먼저 esp를 (0x108 + 0x8) = 272 만큼 빼 공간을 할당한다.
예상되는 메모리 구조 → str(256) + dummy(8) + SFP(4) + RET(4) = 272
따라서 str를 다 채우고 dummy, SFP 주소까지 다 덮고 그 뒤에 쉘코드를 추가해주면 된다. 그리고 RET을 다시 str의 시작 주소로 바꾸면 프로그램이 한 번 진행된 후 다시 NOP라는 썰매를 타고(NOP Sled) 쉘코드가 실행될 것이다.
- 쉘코드(shellcode) : 시스템의 특정 명령을 실행하는 작은 크기의 프로그램, Machine Code로 작성
- 25byte shellcode\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80
- NOP : No-Operation, 아무 행동도 하지 않는 명령어
- NOP Sled : NOP를 연속적으로 이용하여 아무 일도 일어나지 않고 썰매처럼 원하는 부분으로 미끄러져 간다는 기법이다.
우선 strcpy 함수가 호출된 이후 str에 argv[1] 값이 복사되서 저장되기 전인 main + 53 부분에 bp를 걸어주자. (bp를 걸어주게 되면 해당 부분 바로 전까지만 프로그램이 실행됨)
bp를 걸어주었으면 str의 주소를 확인하기 위하여 버퍼와 sfp까지만 값을 채워주자.
그러나 level12의 SetUID가 걸린 프로그램이다보니 권한이 거부되었다.
따라서 프로그램을 복제해서 tmp 디렉토리에 넣어주자.
이제 다시 gdb를 이용하여 attackme를 뜯어보자. 또한 main + 53에 bp를 걸어주고 아까처럼 값을 넣어주자.
이제 스텍을 확인해보자.
0xbfffeac0 부터 0x90이 채워진걸 볼 수 있다. 따라서 str의 시작주소는 0xbfffeac0 인걸 알 수 있다. 이제 다시 original attackme로 가서 실행해보자.
실행시켜 줄 때 NOP(No Operation, 243bytes) + shellcode(25bytes) + str 주소(ret 주소)를 인자로 넣어준다.
그러나 segmentation fault가 떴다. ftz에는 ASLR 보호 기법이 적용되어 있기 때문에 계속해서 버퍼의 주소가 변경된다. 따라서 마지막 ret 주소, 즉 변화하는 str 주소를 값을 계속 변경해주어 실행한다.
결국에는 쉘을 땄다.
my-pass로 비밀번호를 얻자.
그러나 이 방법은 매우 비효율적이기 때문에 추후에 RTL기법으로 ASLR을 우회하여 해결해 보겠다.
[level12] : it is like this
'Pwnable > FTZ' 카테고리의 다른 글
FTZ - level13 [Buffer Overflow 𝜸] (0) | 2020.08.28 |
---|---|
FTZ - level12 [Buffer Overflow 𝜷] (0) | 2020.08.28 |
FTZ - level10 [Wiretapping] (0) | 2020.08.28 |
FTZ - level9 [Buffer Overflow] (0) | 2020.08.28 |
FTZ - level8 [John The Ripper] (0) | 2020.01.01 |