Lord of BOF_5_Wolfman


핵심 알고리즘은 다음과 같다.
- main함수 인자를 받는다.
- environ 전역변수가 가리키는 주소에 저장된 주소가 가리키는 곳의 데이터를 0으로 바꾼다.
argv[1]의 48번째 글자가\xbf가 아니면 종료한다.argv[1]의 길이가 49보다 길 시 종료한다.- strcpy로 스택에
argv[1]를 복사한다. - memset으로 main 함수의 스택 프레임 내의 내용을 0으로 바꾼다.
바로 전 문제에 조건이 하나 추가되었다. 이제 argv[1]로 셸 코드를 넣을 수 없다.
(사실 argv[1]에 셸코드를 넣고, argv[1]주소를 넣어도 된다. memset하는 위치는 스택의 buffer이기 때문.)
현재 조건으로 인해 사용할 수 없는 자리는 다음과 같다.
- 환경변수
- main 함수 스택프레임 내 buffer
- main 함수 return address 뒤쪽 자리
지켜야 하는 조건은 다음과 같다.
- return address 위치에 넣는 값은 스택의 주소여야 함
남는 자리가 무엇일까 생각해 보았다. 꼭 argv[1]로 모든 것을 처리할 필요가 있을까?
main 함수의 두, 세번째 인자로 셸 코드를 넣으면 될 것 같다. 이 역시 스택에 저장된다.

셸 코드를 argv[2]에 넣을 것이므로, 시뮬레이션을 하기 위해 먼저 셸코드의 길이를 조사해 보았다. 그 길이는 31이다.

조건에 맞추어 익스플로잇을 만들고, 일부러 예외를 일으켜 core 파일을 만들었다.
C가 들어가는 자리는 셸 코드가 들어갈 자리이다.

core 파일에서 esp가 가리키는 스택을 덤프해 보았다.
C의 아스키코드인 43이 시작하는 주소를 찾아본다.
찾은 주소는 0xbffffc4e이다.

위에서 찾은 주소를 return address로 하여 다시 exploit 코드를 짠다.

darkelf의 비밀번호는 kernel crashed 이다.
tags: writeup, pwnable, buffer overflow, stack overflow, memory corruption, elf file, linux, c lang, x86asm