[C++/PE32] - Bad TLS Tester

Category: Reversing - Written on August 3, 2018
$ ./BadTLS.exe
Usage:
        BadTLS [filename] [eip]
	
$ ./BadTLS.exe ./test.exe 12345678
[*] EIP: 0x12345678
[*] TLS Directory: none
[+] Creating...
[*] Complete
[*] save file: ./test.exe_badtls.exe
	
$ ./BadTLS.exe ./test2.exe ABCDEF
[*] EIP: 0x00abcdef
[*] TLS Directory: 0x000c83c0 (rva)
[+] Overwriting...
[*] Complete
[*] save file: ./test2.exe_badtls.exe

Bad TLS를 실험할 수 있게 해주는 Tester를 간단하게 만들었다.

참고로 Bad TLS는 필자가 2017년 9월 10일에 발견한 Anti-Debugging 방법이다. (기존 TLS Anti-Debugging과 다르게 PE Header의 TLS Directory를 공략한다.)
원리를 간단하게 설명하면, TLS Directory의 AddressOfCallBacks 테이블을 조작하여 EIP를 바꾼다.

일반적으로 실행했을 경우 PE Loader에서 비정상적인 주소로 EIP가 이동해도 그에 대한 Handling을 하는 건지 에러 없이 잘 실행된다. 하지만 Debugger에서 실행했을 경우 EIP가 설정한 주소로 이동되어 Debugging을 진행할 수 없는 상태가 된다.

test1test2

BadTLS.exe
위 바이너리는 PE32 파일만 인식한다.

조금 활용하면 PE Trick으로 사용하거나 PE Protector, Crypter에서 사용할 수 있을 것 같다.


Comments