리모트 BOF이고, fgets로 입력받은 값을 temp에 저장하고, 그 값을 buffer에 strcpy하여 복사해준다.
그 후 sfp를 복원시켜줌.


전에 풀었던 문제와 리모트 빼고 다른게 없는 것 같아서 ret sled를 이용하여 공격해보았다.

| buf[264] | sfp[4] | &ret[4] * 3 | &execl | 
(그리고 미리 execl함수에 의해 실행되는 파일을 심볼릭 링크해야함.. 이부분은 생략.)

nc localhost 7777 로 해보았지만 별다른 반응이 없어서 hell_fire로 시도해 보았더니,
쉘은 따졌지만 권한상승은 안됨.. 왜그런지 잘모르겠다..

 

 

다른 방법으로 찾아서 해봐야겠다..

 

system함수 내부를 살펴보면 do_system함수를 호출한다.
또 do_system함수의 내부 코드를 보면 execve("/bin/sh", "sh –c 인자", 환경변수); 이렇게 수행된다.
이처럼 do_system함수도 명령어 실행을 위해 execve 함수를 호출하여 명령을 수행하는 것을 확인할 수 있다.

 

이러한 이유 때문에 system함수를 이용하여 "/bin/sh"의 주소를 찾을 수 있다.
-------------------------------------------------------

#include<stdio.h>
#include<string.h>

int main()
{

long shell=0x4203f2c0; // ex) system()주소

while(memcmp((void*)shell, "/bin/sh", 8)) shell++;

printf("%p \n", shell);

}

-------------------------------------------------------

 

아무튼 ret영역을 &(do_system+1124)로 덮어씌우면 된다.

 

 

 




다른 문제풀이로 풀어보겠습니다.

fgets함수는 임시버퍼를 사용하는 함수로써 그 부분을 이용하여 공격하겠습니다.
우선 자고 내일 쓰겠음..


| buf[264] | sfp | &mprotect | &shellcode | 인자 1 | 인자 2 | 인자 3 | nop + shellcode | 

이런식의 공격이 안되는 이유는 mprotect함수의 주소는 아스키아머로 인해 1바이트가 \x00인 주소를 갖는다.
그래서 strcpy함수의 특성으로 인해 ret영역 이후의 값들이 buffer에 제대로 복사되지 않는다.


 

[strcpy 특성]

strcpy 는 문자열 복사를 위한 함수로서 길이를 지정안하는 대신 source 문자열이 반드시 '\0' 으로 끝나야합니다.
source 에서 '\0'을 만나면 복사를 종료합니다('\0' 까지 복사됩니다)         



그러면 어떻게 해야할까??

fgets함수가 임시버퍼를 사용한다고 했으니까 거기는 mprotect의 주소에 \x00이 있건 말건 입력해준 모든 값들이 고스란히 있을 것이다.
buffer를 이용한 공격은 strcpy함수의 특성상 buffer에 제대로 복사가 되지 않으니까 갖다 버리고, fgets의 임시버퍼영역을 통해 공격해보겠습니다.
fake ebp를 이용하여 그 영역으로 완전 옮겨가버리면 된다.

우선 임시버퍼영역의 주소가 어디인지 확인해보자

보시면 0xf6ffe000 ~ f6fff000 까지 임시버퍼영역의 고정된 주소로 지정되어있다.



*TIP : gdb를 통해 제대로 들어갔는지 확인

(python -c 'print "A"*264+"BBBB"+"\x43\x43\x00\x43"+"CCCC"';cat) | (python -c 'print "r"';cat) | (python -c 'print "b* main+221"';cat) | gdb -q ./hell_fir3

이처럼 임시버퍼영역에서는 주소에 널바이트가 오더라도 입력해준 값 그대로를 고스란히 담고 있기 때문에 이곳으로 ebp,esp를
옮겨버려서 공격하면 된다.(buffer영역에 안되는 이유는 아까도 말했듯이 strcpy를 하게 되면 널바이트까지만 복사가 이뤄짐..)


임시버퍼영역으로 ebp,esp를 옮기려면 fake ebp 기법을 이용하여 옮길 수 있다.
랜덤스택이라고 해도 상대적인 ebp의 거리는 항상 같다.
예를 들어 설명하자면 메인함수에서 ebp의 위치와 함수호출로 인해 새로 지정된 ebp의 위치의 거리는 같다는 말이다.

이러한 점을 알기 때문에 main함수에서 leave명령이 수행되고 ebp가 가리키는 곳의 위치를 쉽게 구할 수 있다.
(그 거리는 88bytes만큼 차이남)
그럼 main함수에서 leave명령을 수행한 다음 ebp가 가리키는 곳의 값을 0xf6ffe16c로 바꾸고, main함수의 ret영역에 &leaveret으로
덮어씌워주게 되면 아래와 같이 수행된다.(여기서 0xf6ffe16c의 주소는 임시버퍼영역에 해당하는 주소)

0xf6ffe000(임시버퍼시작주소) + 16c(264 + 4 + 4 + 88 + 4) = 0xf6ffe16c

                  (  buf[264] + SFP[4] + &leaveret[4] + A*88[88] + 0xf6ffe16c[4]  )


| buf[264] | SFP | &leaveret | A*88 | 0xf6ffe16c | &leaveret | &mprotect | &shellcode | parameter1 | parameter2 | parameter3 | nop+shellcode |

           ebp           

<- 낮은 주소                                                                                                                                  높은 주소 ->




| buf[264] | SFP | &leaveret | A*88 | 0xf6ffe16c | &leaveret | &mprotect | &shellcode | parameter1 | parameter2 | parameter3 | nop+shellcode |

                  esp                 ebp

<- 낮은 주소                                                                                                                                  높은 주소 ->

main 함수에서 leave 명령이 수행 된 모습
ret 명령이 수행되면 아래와 같이 된다.



아래는 버퍼영역이다. strcpy함수로 &mprotect함수 주소 이후는 제대로 복사는 안되겠지만...

| buf[264] | SFP | &leaveret | A*88 | 0xf6ffe16c | &leaveret | &mprotect | &shellcode | parameter1 | parameter2 | parameter3 | nop+shellcode |

                                                     esp                  

<- 낮은 주소                                                                                                                                  높은 주소 ->

ret 명령을 수행하면 아래 노랑 네모박스의 모습이 된다.



| buf[264] | SFP | &leaveret | A*88 | 0xf6ffe16c | &leaveret | &mprotect | &shellcode | parameter1 | parameter2 | parameter3 | nop+shellcode |

                                                     ebp(0xf6ffe16c)

<- 낮은 주소                                                                                                                                  높은 주소 ->

위는 임시버퍼영역의 구조이다. ebp가 임시버퍼 영역을 가리킨다.




| buf[264] | SFP | &leaveret | A*88 | 0xf6ffe16c | &leaveret | &mprotect | &shellcode | parameter1 | parameter2 | parameter3 | nop+shellcode |

                                                                   esp

<- 낮은 주소                                                                                                                                  높은 주소 ->

ebp는 어딘가 가리키고 ret명령에 의해 mprotect함수가 수행될 것이다.


payload



아 솔직히 이거 설명하기가 너무힘들다... 차라리 페이로드보고 짜맞추면서 보시면 편하실듯.. 설명포기 ㅠㅠ




'System Hacking > LOB_fedora' 카테고리의 다른 글

[Fedora4] dark_stone -> cruel  (0) 2015.11.28
[Fedora3] evil_wizard -> dark_stone  (0) 2015.11.25
[Fedora3] hell_fire -> evil_wizard  (0) 2015.11.23
[Fedora3] iron_golem -> dark_eyes  (0) 2015.11.20
[Fedora3] gate -> iron_golem  (0) 2015.11.19

+ Recent posts