이번에도 힌트는 소스! 딱봐도 strcpy 를 써서 오버플로우 취약점을 이용해서 쉘을 따내는 문제 같다.
한번 ls로 attack 실행파일을 확인하고 실행시켜보자.
세그먼테이션 폴트..
/tmp 로 이동해 힌트의 소스를 긁어 attack.c 를 만들고 컴파일하여 디버깅 해보자.
컴파일까지 해서 gdb 로 확인해보면,
스택의 형태가 아마
0x080483c7 <main+51>: lea eax, [ebp-264] 에서 264 바이트를 할당해주고 있는 것을 볼 수있고,
str 은 256 바이트이기 때문에 둘의 차이인 8바이트가 더미의 크기가 될 것이다.
혹은
0x08048397 <main+3> : sub esp, 0x108 과 (264)
0x080483a7 <main+19>: sub esp, 0x8 을 보고 (8)
즉, 총 272 바이트 만큼 스택을 할당해주었고 str [256] + 더미 [?] + SFP[4] + RET[4] =272 를 가지고 더미가 8바이트라고 알아낼 수도 있다.
low
str [256] |
dummy [8] |
SFP [4] |
RET [4] |
high
스택으로 그려보면 이런 형태가 될 것이다.
암튼 우리는 str에 nop과 쉘코드를 입력해두고, str 의 시작 주소를 알아내어 RET 자리에 str 의 주소가 들어가게하면 쉘을 딸 수 있다.
그러나 str 의 주소는 계속 변경된다.
**Address Space Layout Randomization. (ASLR)
: 메모리상의 공격을 어렵게 하기 위해 스택이나 힙, 라이브러리 등의 주소를 랜덤으로 프로세스 주소 공간에 배치함으로써
실행할 때 마다 데이터의 주소가 바뀌게 하는 기법
따라서 우회를 위해 RTL 사용 할 것이다.
** Return To Library (RTL)
: 스택에 실행 권한을 없애 스택에 쉘 코드를 올리는 것을 막는 오버플로우 대응책을 우회할 수 있는 기법
: 프로세스의 ret 주소를 다른 함수의 주소로 변조시켜 해당 함수로 jmp하여 해당 함수 실행
환경 변수는 고정된 주소 값을 갖게 되기 때문에 가장 먼저해야할 일은 환경 변수에 쉘코드 담기가 될 것이다.
이렇게 환경 변수에 nop 을 넉넉히 넣고 익스 코드를 담아주고, (뒤에 짤림)
환경 변수 주소를 출력해주는 소스도 짜자.
형태는 인자로 환경 변수 명을 입력하면 해당 환경 변수의 주소를 출력해주도록!
이런 식으로 말이다.
컴파일 한 후 실행시켜 보자.
익스 코드 (쉘코드) 가 저장된 환경 변수의 주소를 알아내었으니
이제 attack 을 실행시키는데 인자로 nop*268 을 입력하고 끝에 이 주소를 리틀엔디언 방식으로 입력하자.
level12 password "it is like this" 획득.
'WARGAME > FTZ [system]' 카테고리의 다른 글
ftz level 13 [level13] (0) | 2020.04.30 |
---|---|
ftz level 12 [level12] (0) | 2020.04.30 |
ftz level 10 [level10] (0) | 2020.04.30 |
ftz level 9 [level9] (0) | 2020.04.30 |
ftz level 8 [level8] (0) | 2020.04.30 |