티스토리 뷰

 11탄은 golem이다. 코드를 살펴보자.


golem 프로그램의 특징은 다음과 같다.


1. 인자값이 2개 이상일 것

2. 2번째 인자값은 48번째 값이 \xbf이어야 함

3. 2번째 인자값을 buffer 변수로 strcpy로 복사

4. buffer 변수에 저장된 값들을 전부 0으로 초기화.

5. buffer+48부터 0xbfffffff 까지 0으로 초기화.


즉 RET 값을 제외한 buffer 이후의 값들은 전부 0으로 초기화 하는 것이다.


여기서 LD_PRELOAD 를 사용하라는 조언을 받아 해당 용어를 찾아보았다.


LD_PRELOAD는 공유 라이브러리의 위치를 저장하는 환경변수 이름이다. 그렇다면 공유 라이브러리를 활용해서 이 문제를 공격해야 한다는 것을 알 수 있다.


공유 라이브러리는 스택 영역이 아닌 공유라이브러리 영역에 정보를 저장한다. 스택을 0으로 초기화 하더라도 공유라이브러리에 대한 정보는 공유라이브러리 영역에 별도로 저장되므로 라이브러리의 이름을 쉘코드로 지정한다면 RET 주소를 공유라이브러리의 정보다 담긴 곳으로 지정하여 쉘코드를 동작시킬 수 있게 된다.


우선 라이브러리 파일을 만들어야 한다. 라이브러리의 내용은 상관 없으므로 C파일의 양식에 맞도록 만들어준다.


# echo "void attack(){}" > cat attack.c


그 다음 라이브러리 파일로 컴파일을 해줘야 한다. 이 때 라이브러리의 이름은 nop*120 + shellcode로 진행한다.


정상적으로 라이브러리 파일이 만들어졌다. 이제 이 라이브러리 파일을 공유 라이브러리로 인식하기 위해 LD_PRELOAD 환경변수에 해당 파일 경로를 지정한다.




대략적인 쉘코드의 위치 주소를 알기 위해서 golem 프로그램을 복사하여 수행시켜 보았다.


다음과 같이 \xbf 48개를 입력하여 우선 동작하도록 했다.


main+166은 맨 마지막 leave 명령어로 프로그램이 끝나기 직전에 멈추도록 하였다.


공유라이브러리 영역은 스택영역보다 아래에 있으므로 해당 사항을 고려하여 찾아보았다.



nop 코드가 연속되는 곳이 바로 공유라이브러리가 저장된 정보를 가지고 있는 곳이다.


여기서 nop 슬라이드 기법을 이용하기 위해 적절한 중간값인 0xbfff5ec 를 지정하여 golem 프로그램에 공격을 시도해 보았다.



쉘을 취득하여 다음레벨의 비밀번호를 얻었다.


라이브러리의 중요함을 깨닫게 해주는 문제였다.


추가적으로 조사하면서 알게된 사실로는 단순히 파일명을 쉘코드로 해서 리턴값을 조절해 쉘을 취득하는 것만이 아닌, 공격하고자 하는 타겟 프로그램을 고려하여 원하는 값을 출력하는 파일을 만들어 공유 라이브러리로 등록하면 타겟 프로그램은 그 공유라이브러리 파일을 받아들이게 된다는 점이다.


LD_PRELOAD를 이용한 Hooking에 대해 좀 더 알아볼 필요가 있다고 생각한다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함