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
바이트입니다.
하지만
입력이 (널 바이트?) 프로그램 (라인 (241)에 전달되는 주요 지점에서 기사) 그것은 단지 "희생자에게 먹이를 준다"고 말한다. 내가 아는 한 취약한 함수 (gets
, strcpy
)를 사용하는 문자열에 하나 이상의 null 바이트가있는 입력을 삽입 할 수있는 방법이 없습니다.
누군가가 나를 이해하거나 x86_64 시스템에서 ret2libc 공격에 대한 조언을 제공 할 수 있다면 감사하게 생각합니다.
줄 바꿈에서'gets'가 멈추므로 입력에'null' 바이트가 포함되어야합니다. –
공격 문자열을 프로그램 인수 (gets 나 strcpy를 사용하는 대신)로 주입하고 프로그램이 가변 개수의 인수를 취하는 경우 빈 문자열을 인수로 전달하여 더 많은 null을 주입 할 수 있습니다. – user3155701
"쉘에 printf"blablabla \ 0 \ 0 \ 0 \ 0 ... \ 0hellowworld \ n "|"문자열을 하나 이상의 null 바이트로 입력을 삽입합니다./a.out' –