1 Windows 환경
스택, 힙,로드 모듈 (DLL을) 및 실행 파일 자체를 포함 wmplayer.exe 메모리 레이아웃 개략적 인 프로그램이 실행을 선택합니다.
Win32 프로세스 공간 레이아웃 손.
1.2 엔트리 포인트 (진입 점)
EXE를 실행할 때 DLL은 첫번째 IAT에 따라 적절한 테이블을로드하고 API의 실제 주소를 얻기 위해 GetProcAddress를 사용합니다. 즉, EXE를 실행 한 후, DLL의 EP는 첫 번째 장소가 호출, 그리고 EP를 호출 할 수있는 마지막 있어야합니다 자체를 EXE하지만, 자신의 코드를 EXE 할 수있는 입구됩니다.
다른 시스템 플랫폼은 결과를 분해. 이 절에서는 "리버스 엔지니어링의 핵심 원칙"되는 Helloworld.exe 디버깅 손의 책을 선택하는 절차를 제공합니다.
분해 결과에서 윈도우 서버 2008 (다른 아래 디버거 엔트리 주소 및 XP를로드 한 후 주소 무작위 배정, 같은 EXE 프로그램이있다).
윈도우 XP에서의 결과를 분해.
에 F7 단계.
호출자가 다음 명령을 작동 반환 할 004027A1 주소가 RETN 명령, 마지막 문장은 일반적으로 함수 호출 (EIP에 ESP의 컨텐츠를 팝업, 값 0012FFC0에서 점프는 004011A5, 리틀 엔디안입니다) 즉, 반환 004011A5 (JMP 0040104F)
EIP는 ESP 포인터 0012FFC0 점 0012FFC4 (ESP + 4)에서 ESP, 아래로 계속 이동, 004011A5이다.
다른 개발 툴에 의해 생성 된 다른 시작 기능을 제공합니다. 개발 툴 동종, 스타트 기능은 또한 다른 버전과 함께 생성된다.
00402524 전화
1.3 기능은 개략적 단계로 호출
프로세스 설명 | 어셈블러 코드 |
---|---|
스택에 파라미터 스택상의 리턴 어드레스 코드 영역 점프 스택 프레임 조절 | 푸시 매개 변수 3 PUSH 매개 변수이 PUSH 매개 변수 1 호 (상응 + JMP 밀어) PUSH EBP MOV EBP ESP , XXX ESP 서브를 |
1.4 함수 개략적 단계를 반환
프로세스 설명 | 어셈블러 코드 |
---|---|
복구 스택 EBP (EBP 팝의 스택에 저장된 상당)에 팝 ESP 포인트의 내용을 EIP 및 이동에 반환 주소 포탄 | ESP, XXX ADD POP의 EBP의 (POP의 + 점프에 상대적으로) RETN을 |
함수 스택 프레임 손.
1.5 스택 오버 플로우의 기본 사항
1.5.1 원리 회로도
스택 오버플로는 버퍼 오버 플로우입니다. 때문에 버퍼 오버 플로우 및 재기록 유용한 저장 부하게, 종종 예측할 수없는 결과를 초래할. 프로그램 데이터는 일반적으로 일부 메모리 공간을 할당하는 데 필요한 요구를 일시적으로 액세스하기 위해, 실행되고, 일반적으로 버퍼 공간이라고. 사용자가 수용 할 수있는 버퍼를 일으키는, 버퍼 자체 길이 데이터 이상을 기록하는 경우, 덮어 쓰기 버퍼 외부 기억 부 초래할 것이며, 이러한 현상은 버퍼 오버 플로우라고 부른다. 다음 원리 개략도로 오버 플로우 스택.
1.5.2 디버깅
문자열의 사본을 간단한 프로그램을 디버깅 나타냅니다. 이 프로그램은 간단하고 작은 데브-C + + 4.9.9.2 컴파일러를 사용할 수 있습니다. 다음과 같이 프로그램 코드입니다.
1 이 3 4 5 6 7 8 9 10 | # 포함 <string.h> 무효 do_something ( 숯불 * 버퍼) { 숯불 이 MyVar [128] strcpy와 (이 MyVar, 버퍼); } INT 주 ( INT의 는 argc, 문자 ** argv에) { do_something (변수는 argv [1]); } |
기능, CALL의 function.00401290를 호출합니다.
스택의 실행 주소 푸시 후 함수가 리턴 004012EA를 볼 수 있습니다에서, 함수는 00401290로 이동합니다.
기능, 푸시 EBP, EBP 스택을 입력합니다.
MOV EBP ESP는 스택의 하단에 그 변경 ESP EBP 점 때문에, EBP (0x0022FF78) 이전 스택 프레임에 점의 내용이므로 [EBP + 4] = 004012EA.
오픈 스택 저장 공간 : SUB ESP, 0x98
디버그 스크린 샷에 따르면 버퍼] 0x98 바이트보다 큰 경우는 strcpy () 함수는 저장된 EBP (저장된 EBP)를 덮어하고 개략적으로 아래의 과정을 포함, EIP를 (EIP를 저장) 저장된 것을 보여줍니다.
0x01로 취약점 디버깅
2.1 취약성 테스트 환경
프로그램 설명 | 비고 |
---|---|
MP3 변환기 2.7.3.700에 쉽게 RM | 소프트웨어 스택 오버 플로우 취약점이 존재 |
윈도우 XP 프로 SP3 욕실 MSDN VL (DEP 해제, 패치를 때리지 마세요) | 아날로그 피해자 끝 |
칼리 - 리눅스 1.0.9-I386 | 모의 공격 끝 |
Windbg에 6.12.0002.633 X86 | |
파이썬 2.7.7 | |
내성 디버거 1.85 |
MP3 변환기 스택 오버플로 디버깅 프로세스에 2.2 쉬운 RM
다른 M3U 파일, POC 테스트를 생성 할 수 있습니다 펄과 파이썬을 사용.
MP3 변환기 쉬운 RM을 열고 부하가 10,000 문자 유효한 문서를 crash.m3u있다, 우리는 친절한 조언에서 오류를 캡처 할 대상 소프트웨어를 찾을 수 있습니다.
프로그램에서 오류가 발생하지만,이 프로그램은 밖으로 붕괴하지 않았다 캡처하는 프로그램 오류 예외 처리 루틴 인 것 같습니다.
밖으로 충돌 할 수 있습니다 20000과 30000 사이에 대상 소프트웨어를 실행하는 데 계속 문자의 수를 조정합니다. 분명히, 프로그램 복귀 어드레스가 0x41414141에로, EIP 점프를 덮어되지만 실행 가능 명령들을 찾을 수 없으므로, 에러 것을 나타내는 데이터 EIP 0x41414141에 crash.m3u. 동시에, 우리가 악성 코드를 다루기도 포인트로 채워질 수도 EIP 프로그램에서 볼 수있다.
당신은 이분법을 사용하는 경우. 25 000 5000 B 가득 M3U 파일로, EIP는 41,414,141 (AAAA)를하게되면. 그런 다음 반환 주소는 20000-25000 사이에 위치하고 있습니다.
EIP가 될 경우 42,424,242 (BBBB) 반환 주소는 25000-30000 사이에 위치하고 있습니다.
사용 25000A + 5000B, 당신은 EIP는 42,424,242 (BBBB)입니다 볼 수 있습니다, 그래서 반환 주소는 30,000에 25,000 사이입니다.
디버깅 정보에 따르면, 반환 주소에 ESP 포인트, EIP로 튀어 메모리에있는 것을 나타내는, 반환 주소 42,424,242을 반환, 위 그림과 같이 ESP EIP는 다음 위치를 가리 킵니다 스택 포인터.
ESP D에 ESP 봅니다.
쉘 코드 주소 공간의 작품을 저장하기 위해 찾고있다.
여기서 위치를 호출하기 전에 : 함수 호출 스택 균형의 원리에 따르면, 버퍼 오버 플로우 후, ESP는 (XXCopy 여기로 가정) 기능을 유지해야한다. 즉, 상기 커버는 EIP 데이터 ESP 참조 주소에 저장된다 후 기입을 계속한다.
우리는 EIP BBBB 버퍼를 재 작성 및 ESP의 의미 내에서 볼 수 있습니다. 우리는 스크립트를 조정하기 전에 충전제 등을 AAAABBBB 경우, 케이스가 충분히 높지 않기 때문에, 그것은, 버퍼 내의 리턴 어드레스의 위치의 정확한 위치 결정을 필요로한다. 도구와 함께 제공 메타 스플로 잇 호출합니다.
@ 루트 칼리 : / 옵션 / 메타 스플로 잇 / 응용 프로그램 / 프로 / msf3 / 도구 # 1 ./pattern_create.rb 5000
EIP는 버퍼 길이 앞면 덮개를 다시 작성해야합니다. , 파일을 작성 25,000 + 1,069 채우기 플러스 사 B는 EIP는 42,424,242 다시 작성 될 것이다 될 것이다.
D ESP
26,061 + 4 + 4 = 26,069
버퍼 | EBP | EIP | ESP는 위치를 가리키는 |
---|---|---|---|
A (X 26061) | AAAA | BBBB | CCCCCCCCCCCCCCCCCCCCC |
414,141,414,141,414,141,414,141 ... 41 | 41414141 | 4242424242 | |
26,061 바이트 | 4 바이트 | 4 바이트 |
함수가 반환이 BBBB EIP는 (팝 EBP, RETN)에 배치되는 경우, 프로세스는 0x42424242 (BBBB) 실행을 해결하기 위해 시도 할 수 있도록. 우리의 쉘 코드를 저장하는 메모리 공간을 찾을 수 있습니다.
응용 프로그램이 충돌하기 위해서는, 우리는 26069의 메모리에 기록, 우리는 (함수가 리턴, RET 팝업이 값으로 이동합니다 때 실행) 저장 공간 EIP가 새 값을 쓰기 저장해야합니다, 우리는 문자의 무리 C.를 작성했습니다 응용 프로그램이 충돌, 당신은이 레지스터 (D ESP, D EAX, EBX D, D EBP, ...)을 모두 볼 수 있습니다 때. 이러한 레지스터 중 하나 (하나 또는 C)를 버퍼 값을 볼 수있는 경우에, 당신은 쉘 코드와 해당 값을 교체하고 해당 위치로 이동 할 수 있습니다. 우리의 예에서 우리가 이상적으로, 우리는 실제 쉘 코드와 C를 대체 할, ESP는 우리의 C를 가리 듯 것을 볼 수 있습니다, ESP 주소로 EIP 점프 말했다.
좋은 방법은 (000ff730 문자열 종결 자 (NULL 포함되지 않는 메모리의 주소로 직접 이동 : 그래서 당신은 문자 버퍼의 첫 번째 부분을 볼 수 있습니다 ... 00) ... 우리는 우리가 다시 EIP에서 도달 할 수없는 메모리 어드레스 때문에 다른 시스템 버전, 언어 등과 다른)이 될 것이기 때문에의 데이터 .... 한편, 메모리 주소의 사용은 ... 점프가 매우 신뢰할 공격
를 입력 WINDBG, 다음 JMP ESP, 오류 입력, 입력 한 명령 입력 인터페이스로 돌아가 기록했다. 다음 U는 주소 전에 ESP JMP.
주소 7c90120e에서는 ffe4 볼 수 있습니다. 이것은 오피 JMP ESP이다
이제, 우리는, DLL을로드 작업 코드 (op 코드)를 찾는 이들 중 하나가 필요합니다.
WinDbg의 창을보기 쉽게 MP3 응용 프로그램의 DLL에 자신의 쉬운 RM을 찾을 수 있습니다.
우리는 이러한 DLL의 연산 코드를 찾을 수 있다면, 우리는 Windows 플랫폼에서 안정적인 공격을 할 수 있습니다.
우리는 운영체제 DLL의 일부를 사용하는 경우, 우리는 익스플로잇 운영체제의 다른 버전에서 작동하지 찾을 수있다.
따라서, 우리의 C : MP3 변환기 \ MSRMCcodec02.dll의에 \ 프로그램 파일 \ 쉬운 RM
검색 연산 코드.
주소 01c20000 및 020ed000 사이의 이러한 DLL이로드. 검색 연산 코드 FF E4.
의 01c20000 020ed000 FF E4
어드레스를 선택했을 때, 그것은 널 바이트를 찾는 것이 중요하다.
당신은 null 바이트를 포함하는 주소를 사용하지 않도록 노력해야한다. 널 바이트는 버퍼 데이터의 나머지 부분은 사용할 수 없게됩니다 문자열 종결 될 것입니다.
의 7천만리터 fffffff FF E4
우리는 (부하 페이로드를 취재 한 후 EIP 장소) ESP에 우리의 쉘 코드를 넣고 싶기 때문에, 목록 JMP ESP 주소 공간에서 선택 NULL 바이트를 가질 수 없습니다.
문자열 끝으로 널 바이트, 그래서 그 뒤에 모든 콘텐츠는 무시됩니다.
우리는 우리의 쉘 코드는 EIP를 커버 한 후,이 주소가 null 바이트를 포함 할 수 없습니다 놓습니다.
주소의 첫 번째 행위는 주소 0x01ddf23a이다.
(주소 01ccf23a 해체의 지시에) 주소가 ESP JMP가 포함되어 있는지 여부를 확인하는 명령을 입력
U의 01ddf23a
0x02로 악용
3.1 폭탄 계산기
우리가 0x01ccf23a 커버 EIP를 사용하는 경우, ESP 실행됩니다 JMP. ESP는 쉘 코드를 포함, 그래서 우리는 가능한 악용있다. 첫째, 우리는 "NOP 및 휴식"를 사용하여 다음 쉘 코드의 테스트를 사용할 수 있습니다. Windbg에서 디버깅 소프트웨어를 M3U 파일을 엽니 다.
실행, 첨부 windbg를 함께 프로그램을 다시 실행하여 새 M3U 파일을 엽니 다. 프로그램은 주소 000ff745에 일시 중지됩니다. 그 JMP는 ESP했다. ESP 000ff730 년에 시작, 그것은 000ff744까지 NOP를 지침이 포함되어 있습니다.
이제 실제 쉘 코드를 추가하고 악용 개발한다. 다시 팝업 계산기를 엽니 다.
3.2 바인딩 포트
8888과 같은 쉘 코드, 포트에 바인드를 생성 msfpaload 사용합니다.
쉘 코드는 성공적으로도 방화벽이 설정되어 있지 않은 경우, 창 팝업 방화벽 팁을 차단, 허용 차단 해제 후.
NETSTAT -ano보기 네트워크 연결, 당신은 볼 수 있습니다, 8888 포트를 오픈 한 프로세스 ID PID 388을 보려면,이 프로그램은 EasyRMtoMP3Converter.exe입니다.
방화벽이 포트 8888 트래픽, 텔넷 연결을 허용 할 경우 Windows 방화벽의 경우, 아무데도 핑, 열 없습니다.
윈도우 머신 디스플레이와 일치하는 네트워크 상태보기.
0x03으로 문제 설명
설명 | 비고 |
---|---|
메타 스플로 잇 각각은 서로 다른 출력 쉘 코드가 다른 생성합니다. 당신이 당신의 컴퓨터에 내가 다른 쉘 코드를 볼 때마다 본다면, 다음 당황하지 마십시오. | 나쁜 문자 \ X00 \ X0A \ X0D \ X1A 제거해야 |
같은 명령을 사용하여 다른 시스템은 다른 기본 인코더 될 수있다 | msfpayload 창 / shell_bind_tcp LPORT = 8888 R | msfencode -b '\ X00 \ X0A \ X0D \ X1A'-t 펄 |
칼리 시스템은 메타 스플로 잇 기본 인코더를 사용하고 일관성 뒤로. | 참조가 역 추적 시스템에 사용되는 기본 인코더 칼리 cmd를 사용하면서, 인코더가 기본 파라미터를 지정하지 않고 86 / shikata_ga_nai를 사용하여 메타 스플 / powershell_base64 |
역 추적 기본 인코더 86 / shikata_ga_nai 역 추적 시스템 메타 스플로 잇은 쉘 코드의 생성 크기 368 | |
칼리 기본 인코더 cmd를 / powershell_base64 칼리 시스템 메타 스플로 잇은 쉘 코드의 생성 크기 985 | |
칼리 기본 인코더를 사용하는 것은 충돌 후 쉘 코드, 프로그램 실행을 생성합니다. | |
쉘 코드의 결합 포트를 생성하기 위해, 시스템은 칼리 인코더에 지정되어야 msfencode -e 86 / shikata_ga_nai |
참고 문헌
1) https://www.google.com
2) https://www.corelan.be/index.php/2009/07/19/exploit - 쓰기 - 튜토리얼 파트 1 - 스택 기반 오버 플로우 - /
3) https://www.corelan.be/index.php/forum/exploit - 쓰기 - debuggers/error - 때 - 실행 된-U-unassemble - 이어 -로 - 주소 - 즉--나타났다 - 전 -entering-JMP-ESP /
4) http://blog.csdn.net/yuzl32/article/details/6126592
5) http://extreme-security.blogspot.com/2013/02/stack - 오버 플로우 - 부품 - 2 executing.html
6) http://cstriker1407.info/blog/a 독서 노트 - 중 - 악마 - 교육 - 캠프 msfpayload - 더 - 도구 - 사용 - 및 - 자유로 - kill/
7 ) http://www.securitysift.com/windows - 이용 - 개발 - 파트 1 - basics/
8) "리버스 엔지니어링의 핵심 원칙."
'malware ' 카테고리의 다른 글
FinFisher Malware Analysis - Part 2 (0) | 2014.10.14 |
---|---|
FinFisher Malware Analysis - Part 3 (Last) (0) | 2014.10.14 |
안드로이드 UXSS 요약 및 자동화 된 테스트 단계 (0) | 2014.10.14 |
CVE2014-6287 분석 보고서 (0) | 2014.10.14 |
Introducing FlowBAT, the Flow Analysis GUI (0) | 2014.10.14 |