2014-04-07 7 views
3

32 비트 Linux 머신 (쉘 코드 삽입, libc로 돌아 가기, GOT 덮어 쓰기)에서 다양한 유형의 공격을 연구하고 테스트 한 후 필자는 64 비트 환경에 중점을 두었습니다. 나는 기본적인 쉘 코드 주입 공격을 구현하는데 아무런 문제가 없었다.x86_64에서 버퍼 오버플로 - libc 공격으로 돌아 가기

하지만 이제는 NX 스택 보호를 우회하기 위해 x86_64에서 libc 공격으로 복귀하려고합니다. 이제 64 세계에서 취약한 프로그램의 텍스트 세그먼트는 null 바이트로 보호되므로 실행을 피해자 내부의 명령으로 리디렉션 할 수 없습니다. 어드레스의 8 바이트

(gdb) disas main 
Dump of assembler code for function main: 
    0x00000000004005bc <+0>: push %rbp 
    0x00000000004005bd <+1>: mov %rsp,%rbp 
    ......................................................... 
    0x0000000000400600 <+68>: callq 0x400480 <[email protected]> 
    0x0000000000400605 <+73>: lea -0x40(%rbp),%rax 
    ......................................................... 
End of assembler dump. 

5 널 바이트 (-> 32 비트 팝업 RET 가제트를 찾는 것은 아니다 용액 (4)의 1은 널 바이트)이다. 32 아키텍처

으로는 libc의 지침은 NULL 바이트로 보호됩니다

(gdb) p execve<br/> 
$ 1 = { <text variable, no debug info> } 0x7ffff7ad2cc0 <execve> 

이 8 바이트 null 바이트입니다.

은 내가 실현하기 위해 노력하고있어 기술에 대한 기사를 발견 : http://pastebin.com/RA4qVWgX

하지만

입력이 (널 바이트?) 프로그램 (라인 (241)에 전달되는 주요 지점에서 기사) 그것은 단지 "희생자에게 먹이를 준다"고 말한다. 내가 아는 한 취약한 함수 (gets, strcpy)를 사용하는 문자열에 하나 이상의 null 바이트가있는 입력을 삽입 할 수있는 방법이 없습니다.

누군가가 나를 이해하거나 x86_64 시스템에서 ret2libc 공격에 대한 조언을 제공 할 수 있다면 감사하게 생각합니다.

+1

줄 바꿈에서'gets'가 멈추므로 입력에'null' 바이트가 포함되어야합니다. –

+0

공격 문자열을 프로그램 인수 (gets 나 strcpy를 사용하는 대신)로 주입하고 프로그램이 가변 개수의 인수를 취하는 경우 빈 문자열을 인수로 전달하여 더 많은 null을 주입 할 수 있습니다. – user3155701

+1

"쉘에 printf"blablabla \ 0 \ 0 \ 0 \ 0 ... \ 0hellowworld \ n "|"문자열을 하나 이상의 null 바이트로 입력을 삽입합니다./a.out' –

답변

1

그래서 나는 당신이 말할 수 같아요 취약점이 존재 그것을 실현하는 것이 가능 얻는다의 로 인한 경우 libc의 대가 - 투 - ( 많은 널 바이트를 포함) 이용하지만,이 취약점에 의한 경우 strcpy의 존재는 strcpy가 첫 번째 널 바이트에서 을 멈출 것이기 때문에 실현할 수 없습니다.

우리가 말을 할 수 있겠지만, gets가 널 바이트에서 멈추지 않는 코드의 한 예입니다 점에 유의해야하고, strcpy이 수행하는 코드의 한 예이다.