argv[1][47]==bf이어야 한다.
stack destroyer이 부분에서
buffer부터 0xbfffffff까지 RET부분을 제외한 나머지 부분은 모두 초기화 된다.
buf보다 주소가 낮은 곳을 공격해야 된다.
그곳이 바로! 공유라이브러리 이다.
우리는 LD_PRELOAD라는 환경변수를 이용할 것인데,
LD_PRELOAD는 특별한 환경변수이다.
일반적으로 프로그램을 실행시키면 일반적인 공유 라이브러리를 로드한다.
하지만 LD_PRELOAD를 정의해주면 프로그램 실행시 LD_PRELOAD에서 정의해준 라이브러리를 로드하게 된다.
저 공유 라이브러리 영역에 우리의 데이터를 올릴 수 있게 된다.
프로르램이 동작할 때 메모리에 실행한 프로그램만 로드하는게 아니라 프로그램 내부 사용하는 함수들도 실행을 해야되서 전부 메모리에 로드한다.
내부 함수들은 외부라이브러리에 존재한다.
스택영역에도 라이브러리가 하나 있다.
바로 환경변수 LD_PRELOAD이다.
LD_PRELOAD를 통해 라이브러리를 공유 라이브러리 영역에 올리는게 가능하다.
사용자가 원하는 공유라이브러리를 먼저 등록시켜주는 환경변수이다.
프로그램은 자동적으로 LD_PRELOAD에 등록된 공유라이브러리를 먼저 프로그램에 링크시키게 된다.
결론적으로, 라이브러리 명을 올릴 수 있는 것이다.
이 부분에 입력해주면 이 부분을 먼저 보고, 이 부분에 없다면 PATH환경변수를 참조해라~ 이런 역할을 한다.
LD_PRELOAD는 스택에 찌꺼기를 남겨 사용할 수 있고, 그 부분을 이용해 공격을 해준다.
프로그램 실행->일반 공유라이브러리 로드
LD_PRELOAD 정의시: 프로그램 실행->LD_PRELOAD 공유 라이브러리 로드
일단, 공유라이브러리로 컴파일을 해준다.
LD_PRELOAD를 환경변수로 (절대경로 포함)