2014-12-08 2 views
0

나는 bufferoverflow에 대해 숙제가있다.exploit bufferoverflow shellcode

int func1(char *str) { 
    char buffer[400]; 
    strcpy(buffer,str); 
    printf("%s\n", buffer); 
} 

int main(int argc, char *argv[]) { 
    func1(argv[1]); 
} 

이 내 bufferoverflow.c이며, 또한 목표는 루트 권한을 얻을 버퍼 오버플로를 사용

\xeb\x16\x5e\x31\xd2\x52\x56\x89\xe1\x89\xf3\x31\xc0\xb0\x0b\xcd\x80\x31\xdb\x31\xc0\x40\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68 

shellcode.txt있다. 하지만 정확히 어떻게해야할지 모르겠습니다.
main과 func1 함수에 대해 'gdb'와 disas를 사용합니다.
그러나 어셈블리 코드는 많은 정보를주지 못했습니다. 주요 기능에 대한 어셈블러 코드의

덤프 : 함수 func1에 대한 어셈블러 코드의

0x08048422 <+0>: push %ebp 
0x08048423 <+1>: mov %esp,%ebp 
0x08048425 <+3>: and $0xfffffff0,%esp 
0x08048428 <+6>: sub $0x10,%esp 
0x0804842b <+9>: mov 0xc(%ebp),%eax 
0x0804842e <+12>: add $0x4,%eax 
0x08048431 <+15>: mov (%eax),%eax 
0x08048433 <+17>: mov %eax,(%esp) 
0x08048436 <+20>: call 0x80483f4 <func1> 
0x0804843b <+25>: leave 
0x0804843c <+26>: ret 

덤프 : 당신은 버퍼 오버플로 공격을 탑재 할 경우

0x080483f4 <+0>: push %ebp 
0x080483f5 <+1>: mov %esp,%ebp 
0x080483f7 <+3>: sub $0x1a8,%esp 
0x080483fd <+9>: mov 0x8(%ebp),%eax 
0x08048400 <+12>: mov %eax,0x4(%esp) 
0x08048404 <+16>: lea -0x198(%ebp),%eax 
0x0804840a <+22>: mov %eax,(%esp) 
0x0804840d <+25>: call 0x8048314 <[email protected]> 
0x08048412 <+30>: lea -0x198(%ebp),%eax 
0x08048418 <+36>: mov %eax,(%esp) 
0x0804841b <+39>: call 0x8048324 <[email protected]> 
0x08048420 <+44>: leave 
0x08048421 <+45>: ret  

답변

0

. 먼저, 취약한 프로그램의 제어 흐름을 정상적인 과정에서 벗어나는 방법을 찾아야합니다. 두 번째로, 프로그램이 원하는 방식으로 작동하도록해야합니다.

func1의 버퍼 용량은 400 자이며 입력 경계를 확인할 수 없습니다. 따라서 400 자 이상의 문자를 보내고 func1의 반환 주소를 스택에 덮어 쓸 수 있습니다.

전통적인 스택 스매싱 공격을 사용하여 두 번째 목적을 달성 할 수 있습니다. 그것은 func1에 코드를 주입하는 것이며 스택의 수정 된 리턴 주소는이 코드를 가리 킵니다. 그러나 스택 스매싱 공격은 대부분의 현대 아키텍처 및 운영 체제에서 제공하는 DEP로 인해 종종 방어됩니다.

가장 효과적인 방법은 ROP 공격을 사용하는 것입니다. ROP 공격은 대상 프로그램에 코드를 삽입하지 않습니다. 시스템 (예 : libc)에 이미 존재하는 일부 가젯을 찾은 다음 해당 가젯을 연결하여 공격을 완료합니다 (귀하의 경우 루트 권한을 얻음). ROP 쉘 코드는 가젯의 이러한 주소와 일부 데이터로 구성됩니다. 쉘 코드가 ROP 쉘 코드인지 여부는 확인하지 않습니다.

ROP에 대한 자세한 내용 : [1] 귀환 프로그래밍 : 시스템, 언어 및 응용 프로그램 [2] 반환 지향 프로그래밍. http://en.wikipedia.org/wiki/Return-oriented_programming

0
  1. ASLR, 스택 쿠키 또는 실행 스택이 활성화되어 있는지 확인하십시오.

ASLR이 꺼져있는 경우, 쿠키가 꺼져 있고 NX는 에 당신은 어떤 주소가 시스템 호출을 가리키는 EIP를 대체하기 위해 시도 할 수있다 스택

ASLR이 켜져 있고 NX 당신은있을 수 있습니다 에있는 경우 주소를 유출하거나 ROP를 사용하여 루트 셸을 가져옵니다.

0

버퍼 및 SFP를 채우셨습니까?

BOF (버퍼 오버 플로우) 공격이 과부하 버피, SFP 및 그 후에 입력 한

가 스택 프레임을 BUF보기 쉘 코드 주소 여야합니다 | SFP | RET (새 주소)

BOF 목적은 제어 RET

은 그래서 당신은 나머지 버피 버피에 많은 방법을

첫째, 입력 쉘 코드를 공격하고 GDB를 사용하여 버피 주소를 찾은 다음 채울 수, SFP 마침내 입력 RET에 버피 주소 (쉘 코드)

초, 환경 변수 (쉘 코드)를 사용하고 주소 스크립트를 가져온 다음

가 먼저 아타하려는 RET에 버피, SFP 마침내 입력 환경 변수 주소를 입력 CK는

와 두 번째 공격은 ASLR 떨어져 너무

터미널

echo 0 > /proc/sys/kernel/randomize_va_space : ASLR OFF 
-fno-stack-protector -z execstack -mpreferred-stack-boundary=2 -m32 : gcc compile option no dummy buf and no DEP protect and compile to 32bit binary 
를 입력해야합니다, 당신은 ASLR 해제해야 성공적으로 DEP 될 수 있습니다