참고 : dreamhack.io |
jiravvit.tistory.com/entry/Buffer-Overflow-Return-Address-Overwrite-%EC%8B%A4%EC%8A%B5-1
저번 시간에 이어서 실습을 해보도록 하겠당
저번 시간에 SFP랑 RET의 위치를 찾았다. 하지만 버퍼 오버플로우가 발생하는 지는 확인을 해보지 못했다.
버퍼 오버플로우 공격이 가능한지 간단히 확인을 해보자.
(1)에서와 동일한 코드이다.
버퍼 오버플로우를 실습할 example.1c이다.
"aaaabbbbccccddddeeeeffffgggghhhhiiiijjjj"를 입력값으로 주도록 하겠다.
해당 문자열은 40바이트로, 32바이트를 저장할 수 있는 buf에서 8바이트나 오버난다.
vuln 함수의 주소에 break point를 설정하였다.
인자를 넣어 실행시킨 후 esp 레지스터를 살펴보았다.
흐름은 (1)에서와 똑같다. (자세한 설명은 생략한다)
브레이크 포인트 에서의 스택 메모리를 보면, 첫 4바이트는 vuln 함수의 리턴 주소이고 다음 4바이트는 vuln 함수의 인자인 argv[1]의 주소임을 알 수 있다.
버퍼오버플로우 취약점이 발생하는 strcpy함수로 가보자.
브레이크 포인트를 걸고 c 명령을 해보자.
스택을 확인해보니 입력값이 strcpy(dst, src)의 src 인자로 잘 들어간 것을 확인할 수 있다.
그리고 첫번째 인자인 dst 메모리 주소(0xffffd00c)에 가보면 빈공간인 것을 확인할 수 있다.
ni 명령을 입력해 명령을 한 줄 실행시켜보겠다.
strcpy 함수를 실행시킨다는 의미이다.
오호랏.. 복사가 잘 된 것을 확인할 수 있다.
역시나.. 아까 그 빈공간이던 0xffffd00c에 복사가 잘 되었다!!!!!
빨간색이 buf의 크기 32바이트고 노란색이 SFP, 파란색이 RET부분이다.
버퍼 오버플로우 취약점을 발견한 것이 눈에 보이는가?
파란색 부분인 RET에 내가 입력한 0x6a6a6a6a 즉, "jjjj"가 들어갔다.
vuln 함수가 리턴할 때의 esp 레지스터가 가리키고 있는 주소에는 0x6a6a6a6a가 저장되어 있다. 이후 ret 명령어가 실행되면 eip는 0x6a6a6a6a가 된다.
다음시간에 진ㅉㅏ!!!!!!!!!!!!!!!!!!!!!!
buf에 내가 원하는 행동(쉘 획득)을 실행시키는 쉘 코드를 넣고 RET에 buf가 시작되는 주소로 설정해 공격이 되는지 실습을 진행하도록 하자.
'System Hacking > Buffer Overflow' 카테고리의 다른 글
[Buffer Overflow] Return Address Overwrite 실습 - (2) (0) | 2020.09.08 |
---|---|
[Buffer Overflow] Return Address Overwrite 실습 - (1) (1) | 2020.08.31 |
[Buffer Overflow] 8086 CPU 레지스터 구조 (0) | 2020.03.18 |
[Buffer Overflow] 8086 Memory Architecture (0) | 2020.03.17 |
[Buffer Overflow] 달고나님의 버퍼오버플로우 기초문서 (0) | 2020.03.17 |