목록Information security/System security (34)
nemo의 이야기
코드를 확인해 보면 1. popen("/usr/bin/ldd /home/giant/assassin | /bin/grep libc | /bin/awk '{print $4}'", "r"); fgets(buffer, 255, fp); ->assasin에 들어있는 주소를 볼 수 있다. libc ldd는 프로그램이 사용하는 라이브러리를 보여준다. awk는 화면에 출력된 내용을 분할이나 파싱할때 쓰인다 (공백으로 분할된다) 각각에 변수를 붙인다. 2. popen("/usr/bin/nm /lib/libc.so.6 | /bin/grep __execve | /bin/awk '{print $1}'", "r"); fgets(buffer, 255, fp); -> execve에 함수 위치를 가져온다 nm을 이용하면 라이브러리에..
코드를 확인하면 1. RET를 스택 영역으로 둘 수 없다. 이를 해결하기 위해 RTL(Return to library)를 이용해서 공격 하면 된다. RTL이란 리턴 값을 라이브러리가 있는 위치로 바꿔서 공격하는 방식이다. 우선 system 라이브러리가 위치하는 주소를 확인을 해보자 주소는 40058ae0이다 그리고 공유라이브러리에 /bin/sh에 주소를 찾아보자 그럴려면 c파일로 찾아보자 #include int main() { char *sh = 0x40058ae0; while( memcmp(sh, "/bin/sh", 7)) { sh++; } printf("find shell : 0x%08x \n",sh); return 0; } 실행 시켜보면 /bin/sh에 주소는 400fbff9 라는 것을 확인할 수 ..
코드를 확인하면 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파일을 만들어 컴파일 해보..