nemo의 이야기
코드를 확인하면 1. argv를 1개 이상을 사용하지 못한다. 이번 문제는 RET가 아닌 SFP의 1byte를 변조하여 프로그램의 실행 히름을 바꾸는 문제이다. 이를 해결하기 위해서는 Fake Ebp를 하여 원하는 위치에 공격 코드를 올려서 공격하면 된다. 우선 problem_child ebp와 esp를 확인해보자 bffffa41 주소에서 41부분에 주소를 바꿔 공격하면 된다. 그러면 leave 명령을 통해 SFP가 있는 곳으로 이동 후 변조된 ebp값을 pop을 함으로써 main 에 ebp값은 변조된 ebp값으로 저장 problem_child 함수의 RET를 통해 다시 main 프레임으로 복귀 main 함수의 leave가 수행된다. 마지막으로 ret 명령으로, eip는 esp를 참조해서 다음 실행할 주..
위 코드를 확인해보면 1. buffer를 초기화하고 RET를 제외하고 그 아래에 있는 모든 스택을 초기화한다. 모든 스택을 초기화하기때문이 입력값에 쉘코드를 넣어서 공격하기는 힘들다. 이를 해결하기 위해서는 환경변수를 이용하여 공격하면 된다. 리눅스에는 LD_PRELOAD라는 환경변수가 존재한다. 이 환경변수를 지정해 놓으면 프로세스가 로딩하고 각종 라이브러리들을 로딩할 때 LD_PRELOAD에 선언된 라이브러리를 가장 먼저 로딩하게 된다. 이를 이용하여 이미 존재하는 라이브러리와 이름을 같게하여 정상의 라이브러리가 로딩되지 않게하고 정상적인 라이브러리 안의 정상적인 함수와 같은 이름의 함수를 작성하여 함수를 후킹 할 수 있다. 그럼 쉘코드를 LD_PRELOAD에 넣고 후킹할 c파일을 만들어 컴파일 해보..
이전 문제와 비슷하지만 한가지가 다르다 1. argv를 모두 초기화 한다. 이를 공격하기 위해서는 파일명이 저장되어 있는 스택 메모리 끝에 있는 주소를 이용하여 공격하면 될 것이다. 그러기 위해서는 argv[0]에 있는 주소를 확인해야 된다. 더미코드로 실행하여 argv[0]에 주소를 확인한 결과 0xbffffc22이다. 이제 bfffc22부터 시작하여 스택메모리 끝부분에 있는 파일명에 위치를 찾아보자 bfffffe3에 있는 것을 확인 할 수 있다. 이제 심볼릭 링크를 이용하여 파일명을 공격코드로 변경하여 공격해보자 ln -s skeleton $(python -c 'print "A" + "\x90" * 100 + "\x68\xf9\xbf\x0f\x40\x68\xe0\x91\x03\x40\xb8\xe0\x..