( GS + SafeSEH 우회 익스플로잇 : http://5kyc1ad.tistory.com/312 )

SEH Overwrite에 대한 기초적인 내용은 http://5kyc1ad.tistory.com/308 여기와 위 링크를 참고하시기 바랍니다.

 

SEHOP : Linked-List 형태인 SEH 체인을 참조하여 마지막 SEHSEHRecord->pNextSEHRecord에는 0xFFFFFFFF, SEHRecord->pExceptionHandler에는 Ntdll!FinalExceptionHandler 함수 주소가 지정되어 있는지 확인하는 보호 기법.

 

 * 이하에서 익스플로잇에 사용한 프로그램에 스택 기반 BOF SEH Overwrite 취약점이 존재하지만 NULL을 입력할 수 없는 문제가 있어 실습을 위해 메모리에 직접 수정을 가해서 입력되었다는 가정 하에 익스플로잇 실습을 진행했습니다. 해당 프로그램은 위 ‘GS + SafeSEH 우회 익스플로잇에서 사용한 것과 동일합니다.


 

 

[정상적인 SEH 체인]

 

[비정상적인 SEH 체인]

 기존에 SafeSEH를 피해 SEH Overwrite를 했던 기법을 그대로 사용하면 pNextSEHRecordRelative Short JMPOPCode로 변조되어버리기 때문에 SEH 체인이 끊기고 SEHOP에 탐지되어 정상적으로 Exploit이 실행되지 않습니다.

 

GS + DEP + SafeSEH + SEHOP가 적용되어 있고 ASLR이 있다고 가정할 경우 공격 방법은 다음과 같습니다.

 

[덮어쓸 SEHRecord 주소와 값 확인]

 스택에서 덮어쓸 SEHRecord 주소와 pNextSEHRecord 값을 확인합니다. pNextSEHRecord 0x18FA90이며 바로 밑에 다음 SEHRecord가 있는 것을 볼 수 있습니다. SEH 체인을 끝까지 다 따라가면서 덮어씌워주기는 힘드므로 저 두 번째 체인을 0xFFFFFFFF Ntdll!FinalExceptionHandler 함수 주소로 변조하여 정상적으로 보이는 SEH 체인을 만들어야 합니다

 

[마지막 SEHRecord ]

 마지막 SEHRecord까지 계속 참조하여 Ntdll!FinalExceptinHandler 주소값이 0x772E7428인 것을 확인할 수 있습니다.

 여기까지를 페이로드로 작성하면 다음과 같습니다.

Dummy(0x54) + 0x18FA90 + ???? + Dummy(4) + 0xFFFFFFFF + 0x772E7428

 

[익셉션 발생 직후 Handler 함수]

 익셉션 발생으로 SEHRecord->pExceptionHandler가 호출된 직후의 ESP의 위치를 확인하기 위해 Handler 함수에 바로 BP를 걸고 강제로 익셉션을 발생시켜 ESP0x18F448에 위치하게 됨을 확인했습니다. 위에서 인위적으로 만든 종료 체인 이후 스택 주소가 0x18FA98 이므로 0x18FA98 - 0x18F448 = 0x650 이상 ESPPOP 또는 ADD ESP로 옮긴 후 ret을 해야 원하는 대로 ROP 체인 구성이 가능합니다.

 

[Ollydbg Search for All Sequences]

 해당하는 가젯을 찾기 위해 Ollydbg CPU 창에서 우클릭 -> Search for -> All Sequences 창을 열고 위와 같이 와일드카드 문자 CONSTR32를 이용하여 가젯을 검색했습니다. (pop 없이 해봤더니 적당한 가젯이 나오지 않았습니다)

 

[발견한 가젯]

 바이너리 내에서 해당 가젯을 찾아내었습니다. ADD ESP, 0x800 POP 1번 후 ret을 하므로 총 0x804만큼 ESP가 움직이게 됩니다. 0x650 - 0x804 = -0x1b4 이므로 총 0x1b4개만큼 Dummy를 추가로 넣은 후 적당한 함수 주소를 넣어 주면 ROP가 가능할 것으로 보입니다.

 

여기까지 페이로드는 다음과 같습니다.

Dummy(0x54) + 0x18FA90 + 0x452336 + Dummy(4) + 0xFFFFFFFF + 0x772E7428 + Dummy(0x1b4) + ROP Chain

 

[익스플로잇 스택 구조도]

 실제 스택 주소 기반으로 페이로드가 들어가 익스플로잇된 스택 구조를 그려봤습니다. 익셉션이 터지는 순간 익셉션 처리 과정에서 스택이 추가로 늘어나고 0x18F448ESP가 위치하게 됩니다. 이후 &GadgetpExceptionHandler 위치이므로 이 가젯을 실행하게 되는데 여기에는 ADD ESP, 0x800POP, ret이 있으므로 ROP Chain이 존재하는 0x18FC4C에서 ret을 하게 되고, ROP Chain이 실행되어 익스플로잇에 성공하게 될 것입니다. ROP Chain 위의 Dummy 부분은 어차피 말 그대로 Dummy이므로 그곳에 문자열을 넣고 간단히 MessageBox를 호출하도록 짜서 돌려봤습니다.

 

[Exploit 1]

 익셉션 발생하기 직전의 샘플, EAX0x90909090이 들어 있는데 포인터 참조하여 익셉션이 발생하려고 하고 있고 pExceptionHandler는 이미 0x452336으로 변조된 상황입니다.

 

[Exploit 2]

익셉션이 발생하고 0x452336BP에서 멈춘 상태. ESP0x18F448까지 내려갔고, ADD ESP, 800Pop이후 ret이 실행되므로 0x18FC4C의 값이 ret 될 것으로 예상 가능합니다.

 

[Exploit 3]

정확히 0x18FC4C의 값을 ret하며, 그 밑에 두번째 인자로 0x1B4 크기의 Dummy에 넣은 문자열 “Exploited!!”가 들어가는 것을 볼 수 있습니다.

 

[Exploit 4]

해당 함수는 MessageBoxA 함수였으며, 넣은 값 그대로 출력 후 종료됩니다. POP~RET 가젯도 찾아두었으니 여기에 라이브러리 함수를 연결해서 돌리기만 하면 ROP 체인을 계속 연결해 나갈 수 있겠습니다.

 ASLR이 걸려있지 않았기 때문에 주소값 넣는 데에 지장이 없었지만 ASLR까지 걸려있다면 주소를 Leak할 수 있는 취약점이 없는 이상 익스플로잇은 어려워 보입니다.

블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

,

 SEHOP는 SEH Chain의 Validation을 런타임에 검사하는 미티게이션으로, SafeSEH와는 달리 컴파일 시 별다른 옵션을 주지 않았더라도 OS단에서 검사하여 공격을 차단하고 응용 프로그램을 보호한다. Windows 7이나 Windows Vista의 경우 SEHOP를 지원하지만 일부 프로그램이 호환되지 않는 문제가 있어 자동으로 적용되지는 않고, 레지스트리를 편집하여 사용할 수 있도록 설정해 주어야 한다.


[regedit으로 레지스트리 수정]

1. 윈도우키 + R 또는 시작->실행을 열어 regedit 실행.

2. HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\kernel 로 이동.

3. DisableExceptionChainValidation 항목이 없을 경우 DWORD 값으로 새로 만들고 0으로 설정한다. 거꾸로 끄고 싶을 경우에는 1로 설정해주면 된다.

4. 재부팅. ( 바로 적용이 되는지는 모르겠지만 직접 해봤을 때는 재부팅해야 적용됐다. )


이 레지스트리 설정을 변경할 경우 일부 응용 프로그램이 비정상적으로 동작할 수 있으므로 조심해야 한다.

블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

,


[GS (Stack Canary/Cookie) 해제법]


 프로젝트 속성 -> C/C++ -> 코드 생성 -> 보안 검사 -> 보안 검사 사용 안 함(/GS-) 으로 변경.

함수 프롤로그 이후 스택에 버퍼 할당 전에 랜덤한 값을 Push해 두고, 함수 에필로그 직전에 검사하여 변조되었는지 체크하는 보호 기법. 보통 윈도우에서는 GS 또는 Stack Cookie라고 불리고 리눅스에서는 Stack Canary라고 불리지만 그거나 그거나이므로 넘어가자.



[DEP(NX) 해제법]


 프로젝트 속성 -> 링커 -> 고급 -> DEP(데이터 실행 방지) -> 아니요(/NXCOMPAT:NO) 로 변경.

각 페이지마다 Read/Write/Execute 권한 플래그를 설정하여 Write/Execute 권한을 동시에 주지 않는 보호 기법. 간단하면서도 강력한 기법.


[ASLR 해제법]


 프로젝트 속성 -> 링커 -> 고급 -> 임의 기준 주소 -> 아니요(/DYNAMICBASE:NO) 로 변경.

매핑된 바이너리 및 DLL 주소, 버전에 따라서는 힙, 스택, PEB, TEB까지 프로그램 실행 시마다 랜덤하게 변환해버리는 보호 기법. 높은 버전에서는 메모리 릭을 통해서 주소를 찾거나 고정된 DLL 주소를 찾지 않으면 주소값을 사용할 수 없기 때문에 골치아픈 보호 기법이다.



[SafeSEH 해제법]


 프로젝트 속성 -> 링커 -> 명령줄 -> 추가 옵션(D) -> /SAFESEH:NO 추가 작성.

SEH가 가리키는 주소가 스택이거나, MS Library이지만 핸들러로 등록된 주소가 아닐 경우, 혹은 SafeSEH가 적용된 모듈의 주소일 경우 탐지하여 실행되지 않게 하는 보호 기법. 이 보호 기법을 우회하고 SEH Overwrite를 하기 위해서는 SafeSEH가 적용되지 않은 고정된 바이너리의 주소를 찾아서 점프해야 한다.

블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

,



[사키사기 1화의 한 장면]


 사키라는 만화&애니메이션을 보고 마작을 시작한 지 1년 반쯤 되어갑니다. 사실 그동안 공백이 너무 길어서 간간히 앱으로 쳐보고 있는데도 아직도 실력은 바닥을 기고 있고, 겨우 주요 역과 판수, 주의할 점 등만 다 외운 참이라 버림패를 보고 상대 패를 예측한다던지 하는 기술은 전혀 없습니다. 그러다가 실제 작사들이 마작을 치는 모습을 보게 되었고, 휴대폰 앱으로만 하는게 아니라 실제 패를 가지고 치면 훨씬 손맛도 있을 것 같고 재미있을 것 같다고 생각하여 구매를 마음먹었습니다. 하지만 전동작탁의 경우 기본 백 이상을 호가하는 물건이고, 크기도 너무 크다 보니 집에 두기에는 부담이 컸고 결국 접을 수 있는 좌식 작탁 + 마작패를 구매하여 쳐보자고 생각하게 됐습니다.



[피규어토이에서 구매대행중인 작탁]


 하지만 확실히 일본에 비해 국내에는 마작이 그리 인지도 있는 보드게임이 아니고, 실제로 수요도 많지 않기 때문인지 작탁과 마작패를 구매하기 위해서는 해외에서 직구하는 것이 최선의 수였습니다. 위는 피규어토이라는 해외 구매대행 사이트인데, 저는 저기에서 작탁을 검색하여 구매하였습니다. 저 가격은 상품 자체의 가격이고, 관세나 배송비를 포함하여 8~9만원정도가 더 붙었습니다. 상품의 무게나 부피에 따라 가격이 더 부과될수도 있으니 넉넉하게 잡고 주문하는 것이 좋습니다.


[배송오자마자 박스를 뜯고 찍은 사진]


 주문은 7월 9일에 했는데 해외배송임에도 불구하고 바로 일주일 후인 7월 16일 오늘 도착했습니다. 배송에 걸리는 시간과 서비스는 매우 만족스럽습니다. 생각했던 것보다 무게는 상당했습니다.


[탁자를 펴고 마작패를 그대로 올려둔 상황]


 비닐로 둘러싸여있던 테이블 밑에는 뽁뽁이로 칭칭 감겨 있는 마작패가 있었습니다. 이를 뜯어서 테이블 위에 올려둔 사진입니다. 유명한 브랜드인지는 모르겠으나 일단 케이스는 깨끗했습니다.



[마작 테이블의 발]


 테이블 발에는 저렇게 플라스틱으로 받침이 끼워져 있어 장판도 어느정도 괜찮을 것 같습니다.



[마작패 케이스]



[마작패 내용물]


 고급진 마작패 케이스 내부에는 마작에 필요한 기본적인 패들과 꽃패, 적도라, 칩과 주사위, 점수봉 등이 들어있습니다. 마작패는 21×28×17mm 사이즈에 16g이었습니다.  



[혼자 패산 쌓고 놀기]


 전부 컴퓨터가 다 해주던 모바일 마작만 하다가 직접 패를 잡고 섞고 쌓고 나누려고 하니 보통 어려운 일이 아니었습니다. 혼자서 패 섞다보니 뒤집어놓은게 다시 뒤집히기도 하고, 애니나 실제 작사들이 하던 패 여러개 양쪽 끝 잡고 한번에 옮기고 하는게 쉽지 않다는 것을 알게 됐습니다. 힘 살짝만 적게 줘도 떨어지거나 밀려나고, 너무 세게 잡거나 방향이 조금이라도 어긋나면 미끌려서 패가 여기저기 튀어버리기 일쑤입니다.  (._,



[혼자 하는 마작 결과]


 오랫동안 칠 생각도 없고 혼자 치는거라 그렇게 했다가는 날밤을 샐 것 같아서 한번 날때까지만 쳐봤습니다. 기본적으로 아리아리(쿠이탕 있음, 적도라 있음) 룰을 선호하기 때문에 그렇게 쳤습니다. 아래쪽이 동이고 현재 친인 상황인데, 동이 리치하고 3순째에 하가에서 7삭을 버려 쏘였네요.  리치(1) + 핑후(1) + 탕야오(1) + 도라1(1)로 4판이네요. 뒷도라의 경우 확인해봤으나 북이었던 걸로 기억합니다. 멘젠 핑후 상태에서 론으로 났으므로 4판에 30부, 친이 화료했으므로 11,600점 직격입니다. 4판인데도 상당히 아프네요.


 나중에 친구나 지인이 집에 찾아오거나 했을 때 인원이 맞다면 함께 마작도 할 수 있고, 그게 아니더라도 혼자서 마작패 만지면서 연습도 해볼 수 있을 것 같습니다. 확실히 아직 손에 익지 않아서 그런가 계속 미끄러지고 패가 흐트러지더라구요. 가능하면 집 근처에 있는 이수마장도 한번 가보고 싶습니다. 아직 언제 갈지 확실한 계획은 없지만 가서 한번 제대로 배워보고 싶네요.



블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

,

[스택 오버플로우를 발생시키는 memcpy 루틴]

 실제 SEH Overwrite 취약점이 존재하는 상용 프로그램을 분석했습니다. 프로그램 종류나 제품명은 공개하지 않겠습니다. 정확히는 SafeSEH밖에 걸려있지 않지만 여기서의 방법을 이용하면 설령 Stack Canary가 있더라도 우회가 가능하기 때문에 제목에는 두 미티게이션 모두 적어두었습니다.

 문자열을 입력받는 루틴에서 길이 체크를 하지 않아 스택 기반 오버플로우가 발생합니다. 현재 명령을 보면 rep movsd 으로 ESI의 값을 EDImemcpy하게 되는데, 이들은 각각 덤프 1 탭과 스택에 나타나 있습니다. ESI에는 오버플로우용 NOP Sled와 쉘코드, SEH Overwrite 코드가 Input으로 들어와 있고 EDI는 부모 함수의 스택 프레임 내부 주소값입니다.

 

[오버플로우 전]


[오버플로우 후]

 rep movsd 명령이 수행되고 위에서 설명한대로 SEH가 변조되었음을 볼 수 있습니다.

 

[익셉션 발생]

 부모 함수의 스택 프레임을 수정하여 오버플로우를 일으켰기 때문에 원래 있던 함수에서는 정상적으로 리턴되고, 직후 EBP-10의 값을 EAX에 넣고 EAX에 포인터 참조 연산을 수행합니다. 여기서 EBP – 10은 아까 rep movsd 명령에 의해 NOP으로 채워졌기 때문에 잘못된 포인터(0x90909090) 참조로 함수 에필로그 이전에 익셉션이 발생합니다.

 

[SEH Overwrite 실행 과정]

 이 글에서 설명할 때 사용했던 그림으로 살펴보면 pExceptionHandlerppr 가젯의 주소가 들어가 있고, pExceptionHandlerCall한 상태이므로 ESP는 스택 위쪽 어딘가에 있는 ret을 가리키고 있을 것입니다. ppr 가젯이 실행되면서 retExceptionRecordpop되고, EstablisherFrameret되는데 해당 주소는 pNextSEHRecord이고 여기에는 미리 넣어둔 Short JMPEB AC 가 있어 현재 주소에서 -82만큼 점프하게 됩니다. 이는 NOP Sled + Shellcode의 주소이고, 따라서 쉘코드가 정상적으로 실행됩니다.

 

[쉘코드 실행 성공]

 NOP Sled를 타고 내려와 계산기를 실행시키는 간단한 쉘코드가 실행된 모습입니다.


블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

,


 군대갔다오면서 한달동안 기타 놨더니 많이 까먹었다. Spread Clever도 몇부분 까먹었고 메이저 스케일이랑 펜타토닉 스케일도 상당 부분 잊어버렸다. 다시 연습하면서 외워야지... 앞으로 연습하고 계속 칠 곡들이나 리스트업해보자.



[Warak - Spread Clever]



[WANIMA - ともに]



[SPYAIR - Samurai Heart]



[KOTOKO - Loop The Loop]


 일단은 이정도

블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

,

산업기능요원 군사훈련 후기 및 준비물


[육군훈련소]


 2018년 5월 31일 ~ 2018년 6월 28일로 총 4주간 군사훈련을 다녀왔습니다. 현역의 경우 5주간의 훈련을 받고 자대배치를 받지만 보충역이거나 산업기능요원/전문연구요원의 경우 4주 군사훈련 후 다시 사회로 복귀하여 병역을 계속합니다. 이틀 전에 군대에서 돌아온 관계로 기억이 비교적 선명할 때 후기를 써두려고 합니다. (글 쓰는 도중 3일 전이 되었다)


 저는 서울에서 논산에 있는 육군훈련소에 가기 위해서 센트럴시티터미널에서 연무대 터미널로 가는 버스를 탔습니다. 가는 데는 넉넉잡고 2시간 반~3시간정도를 생각하시면 되고, 연무대 터미널에서 버스나 택시를 타고 육군훈련소 앞까지 이동이 가능합니다. 택시를 타지는 않았지만 여기서는 고정요금으로 5,000원정도를 받고 현금으로 계산해야 한다고 하는데, 혹시 모르니 참고하시기 바랍니다. 버스는 여러 종류가 육군훈련소 앞까지 가지만 배차간격이 좀 긴 편이라 조금 일찍 출발하시는게 좋습니다. 

주의 : 위의 사진에서 보이는 육군훈련소 입구로 가는게 아니라, 조금 더 길을 따라 올라가서 육교 너머에 있는 입영심사대로 가야 합니다. 입영심사대는 육군훈련소를 정면으로 보고 오른쪽으로 길을 따라 올라가면 됩니다.


 연무대터미널 앞이나 육군훈련소부터 입영심사대까지 가는 길목에서 몇 미터 간격으로 장사판 펴놓고 입대시 필수품이라면서 시계나 위장크림 등을 판매하는 사람들이 많은데 노상에서 판매하는 물품들은 가격에 비해 질이 떨어지기도 하고 어딘가 하자가 있을 가능성도 높으므로 가능하면 미리 준비해서 다 챙겨가는 편이 좋습니다. 준비물은 밑에서 작성하겠습니다.


 우선 군사훈련의 일정에 대해 작성하겠습니다. 5주 훈련자(현역)는 매주 월요일에 입대하며 4주 훈련자(보충역/산업기능요원/전문연구요원)의 경우 목요일에 입대합니다. 4주 훈련 뒤 목요일에 수료식을 진행하며 점심때쯤 사회로 나가게 됩니다. 

- 1주차 : 입영한 목요일부터 그 주 일요일을 거쳐 그 다음 주 일요일까지가 1주차입니다. 일정 변동이 없는 한 입영 이후 3일정도는 동화기간이라 하여 필요한 물자(의복/군화/세면용품/총기 등)를 지급받고 예방접종을 하고 기본적인 교육을 하는 등 무척 바쁩니다. 이후 나머지 기간은 정신전력교육(원래는 정신교육이었으나 변경됨)이라 하여 학교에서와 비슷하게 교육을 받고, 훈련은 한다고 해도 제식 구급법 등 간단한 것만 진행합니다. 수료가 까마득하지만 무난한 주입니다.

- 2주차 : 1주차에 지급받은 총을 분해, 청소, 안전확인하는 방법을 교육받고 실제로 영점/기록사격을 합니다. 수류탄 훈련도 함께 진행하며 슬슬 진짜 군에 온 느낌이 듭니다. 1주차에 배운 정신전력교육에 대해 시험을 보는 정훈평가를 진행합니다.

- 3주차 : 화생방각개전투가 있는 주입니다. 가장 힘들고 그만큼 시간이 잘 가는 주입니다. 슬슬 희망이 보입니다.

- 4주차 : 월요일부터 수료식인 목요일까지 4일짜리 짧은 주입니다. 마지막 훈련인 행군이 있습니다. 

위 일정의 경우 기본적으로는 이렇게 정해져 있지만 훈련기간동안 공휴일의 유무에 따라 변경되는 경우도 있습니다. 저의 경우 이틀의 공휴일이 껴있었기 때문에 수류탄 훈련을 사격보다 먼저 진행하기도 했습니다. 


 다음으로 훈련 및 중요한 과정들 각각의 후기입니다. 훈련 중 먼 훈련장까지 이동하는 경우 건강에 문제가 있거나 몸이 좋지 않은 인원에 대해 이동간 차등제라고 하여 먼저 출발하여 천천히 걸어가거나 버스를 통해 이동하기도 하며 건강상의 문제(알레르기 등)로 훈련장에 갈수는 있지만 훈련에 참가할 수 없는 경우 교육간 차등제라고 하여 참관방식으로 훈련을 지켜보기만 하고 주말에 보충을 받는 식으로 처리할수도 있습니다. 허리디스크 등이 있거나 다리를 다쳐 완전군장이 힘든 경우 단독군장으로 변경도 가능합니다.

- 동화기간 : 대략 2~3일정도 진행되며 이 기간동안 생활복, 군복, 군화, 세면도구, 총기 등을 지급받고 사이즈가 맞지 않으면 서로 교환하는 등 4주 중 가장 바쁜 시기입니다. 5주 훈련의 경우 잘 모르겠지만 4주 훈련의 경우 수료식 때 가져갈 군화, 군복 1벌, 베레모, 속옷 등을 제외한 훈련용 전투복 및 생활복은 모두 전에 쓰던 것들을 물려받아 사용하기 때문에 자신에게 맞는 사이즈를 찾아서 여기저기 헤매어야 합니다. 사이즈가 살짝 크더라도 입을 수 있으면 그냥 입는 것이 마음 편합니다.

- 정신전력교육 : 강의장에 모두 모여 고등학교 수업처럼 진행됩니다. 졸지 않고 잘 듣기만 하면 되므로 훈련 중 가장 쉬운 편에 속합니다. 이후 정훈평가에서 시험을 보긴 하지만 정신전력교육에서 배우는 것보다는 동화기간에 지급되는 신병교육 가이드북에 예상문제가 나와 있으니 이를 보고 공부하는 편이 훨씬 편합니다.

- 제식 : 맨손제식, 총기제식이 있습니다. 맨손제식은 차렷/열중쉬어/쉬어/편히 쉬어 및 이동 간 발맞추기, 방향 전환 등이 있습니다. 총기제식은 세워 총/앞에 총/받들어 총 등이 있습니다. 전체적으로 무난하지만 햇볕이 강한 여름에는 좀 더워서 힘들 수 있습니다. 비가 올 경우 실내에서 실습하고 평가하기도 합니다. 편하고 쉬운 훈련에 속합니다.

- 구급법 : 밖에서도 자주 배우는 심폐소생술과 지혈대를 사용한 지혈법에 대해 배웁니다. 제식과 마찬가지로 별건 없습니다. 가끔 지혈대가 너무 낡아서 잘 안되는 경우가 있는데, 이 경우 평가할때 다른 지혈대를 빌려와서 잠시 사용하는 게 좋습니다.

- 영점/기록사격 : 각각 하루씩 진행합니다. 실탄사격을 하므로 무척 엄격하게 진행되며 사고가 날 경우 난리가 나므로 정신 바짝 차리고 주의하는게 좋습니다. 영점사격은 말 그대로 총기의 영점을 잡기 위해 진행합니다. 영점사격으로 영점을 잡은 후에는 기록사격을 진행하는데, 총 20발 발포하여 10발 이상 맞추면 합격입니다. 18발 이상을 맞출 경우 특등사수 평가를 받게 되고, 보통 전화포상을 줍니다. 개인적으로 훈련 중 가장 재미있었지만 훈련 시간이 긴 만큼 영외배식을 하게 되고 훈련장 특성상 모래먼지가 많기 때문에 마스크를 꼭 착용하고 가야 합니다. 저는 16발 맞춰서 아쉬웠네요. 기록사격 후 야간사격도 진행하는데 여름에는 어둡지 않아서 까맣게 칠해진 고글같은걸 착용하고 쏘기도 합니다. 이건 맞출 필요는 없고 한번 경험해보라는 의미에서 쏘는 것이므로 대충 쏴도 됩니다(맞추고 싶어도 하나도 안보입니다).

- 수류탄 훈련 : 원래는 진짜 수류탄을 던졌지만 사망사고 및 자살사건 발생 이후로 손에서 터져도 화상 정도밖에 입지 않는 연습용 수류탄을 던지게 되었습니다. 훈련장이 가까운 편이지만 마찬가지로 모래먼지가 많기 때문에 마스크는 필수입니다. 비교적 쉬운 훈련에 속합니다.

- 화생방 : 처음으로 완전군장을 하고 훈련장에 가게 됩니다. 훈련장이 사격장이나 수류탄 훈련장에 비해 멀고 오르막길도 있기 때문에 가는것만으로도 지칠 수 있습니다. 방독면의 상태에 따라 천국/지옥이 갈리는데 저는 불량이라 CS탄[각주:1] 잔뜩 들이마시고 왔습니다. 훈련 자체는 크게 어려울건 없습니다. 4주 훈련의 경우 12초 이내에 정해진 규칙을 지키며 방독면을 착용하면 합격입니다. 화생방실에 들어가는것도 사실 그렇게 심각하게 괴롭지도 않습니다.

- 각개전투 : 기초/숙달/종합이 있으며 각각 하루씩 하여 3일동안 진행합니다. 기초에서는 포복, 약진, 위장을 배우고 숙달에서는 이들을합쳐서 실습해보며 종합에서는 평가를 봅니다. 숙달 훈련장이 훈련소에서 1시간 20분 거리인데다 완전군장으로 이동해야 해서 훈련장까지 도착하는 것 자체가 지옥입니다. 훈련은 말 그대로 뛰고 기는 것이기 때문에 비가 오면 진흙에서 굴러서 무척 고통스럽습니다. 팔꿈치 및 무릎 보호대가 없으면 온몸에 멍이 들고 난리가 납니다. 모래먼지도 잔뜩 들이마시므로 꼭 마스크를 쓰고 갑시다. 4주 훈련 중 가장 힘든 훈련입니다. (본인은 숙달 훈련 이후 돌아오는 도중 열사병으로 실려가는 경험도 해봤습니다)

- 행군 : 완전군장으로 진행하며 총 20km를 걷는다고 하지만 체감상 12~13km정도밖에 되지 않았습니다. 그마저도 중간중간 쉬면서 가기 때문에 무척 쉽습니다. 여름의 경우 열사병의 위험이 있기 때문에 새벽 4시 반에 기상하여 5시 반에 출발하기도 합니다. 이럴 경우 10시정도면 끝납니다. 제식을 맞춰서 걸을 필요도 없고 그냥 제걸음으로 걷기만 하면 되기 때문에 의외로 편한 훈련입니다. 이게 끝나고 나면 수료식까지 남은 3일간 시간이 더럽게 안갑니다.


  다음으로 챙겨갈만한 준비물과 그 이유입니다. 신분증 및 나라사랑카드, 입영통지서는 필수 수준이니 그냥 챙깁시다. 입영통지서가 없다고 해도 자신이 어느 지역 병무청 소속인지 알고 있다면 굳이 가져가지 않아도 되긴 합니다. 그래도 작은 종이 한장인데 혹시 모르니 그냥 챙겨갑시다. 휴지나 비누, 치약의 경우 부족한 사람도 있었지만 평범하게 아껴서 사용하면 잃어버리지 않는 한 전혀 부족하지는 않았습니다. 밑에 적어둔 준비물들은 못 가져가는 경우도 있지만 밑져야 본전이니 갖고 가는게 좋습니다. 어차피 4주훈련의 경우 잠깐 보관했다가 수료식날 다시 돌려줍니다.

- 세면용품 : 칫솔, 치약, 비누, 수건 및 면도기는 제공되지만 수건은 2장밖에 주지 않고 이외에 세면용품이 없기 때문에 폼클렌징, 바디워시 등을 따로 챙겨가는 게 좋습니다. 특히 샤워할 때 거품을 낼 수 있는 타월이 있다면 풍요로운 샤워시간을 가질 수 있습니다. 또한 샤워장은 숙소와 조금 떨어져 있고 씻먹(씻고 밥먹기)/먹씻(밥먹고 씻기)를 하는 경우가 많으므로 이 많은 세면용품을 담아 들고 다닐 수 있는 작은 비닐가방도 있으면 좋습니다. 

- 화장품 : 간단한 로션 종류와 선크림을 챙겨가는 게 좋습니다. 유리병에 들어있는 제품의 경우 엄격히 통제하므로 튜브 형태의 제품을 사서 가져가면 됩니다. 보통은 가져갈 수 있게 해줍니다. 위장크림은 가져갈 필요 없습니다. (어차피 각개전투에서만 사용합니다)

- 손목시계 : 훈련할때나 불침번 설 때 꽤나 요긴하게 쓰입니다. 특이하게 시간을 무척 중요하게 여기면서도 숙소에 시계 하나가 없기 때문에(온/습도계는 있는데도) 거의 필수품이라고 볼 수 있습니다. 어두운 데서 액정에 불빛이 들어오게 할 수 있는 디지털 시계가 좋으며, 방수 기능이 있다면 더욱 좋습니다. 여러가지 훈련 진행하면서 긁히기 일쑤이므로 비싼 것은 들고오지 말고 2만원대 카시오 시계정도면 무난합니다. 실제로 저도 그렇게 들고갔습니다.

- 물티슈 : 총기손질을 하거나 작은 얼룩을 닦을 때, 창틀 청소를 할 때 등 여러모로 쓸모가 많습니다. 못 들고가게 하는 경우도 있지만 저의 경우 가능했습니다. 

- 필기구 : 특히 네임펜 등 유성펜이 있으면 좋습니다. 그와 더해서 수성펜이나 매직도 가져가는 게 좋습니다. 총기함에 붙어 있는 코팅된 종이에 내역을 작성하고 지울 일이 많은데, 유성펜으로 작성할 경우 지우개로 지우지 않으면 거의 지워지지 않기 때문입니다. 입영할 때 신병교육 가이드북이라고 하는 작은 책자를 주기는 하지만 메모할 공간은 거의 없으므로 수첩이나 노트를 가져오는 것이 좋습니다. 거기에 가족이나 친구 전화번호 및 주소를 적어오면 금상첨화. 라이트펜은 있으면 불침번 설때 온/습도계 확인이 편하므로 가져가면 쓸만합니다.

- 우표 : 꼭 챙겨갈 필요는 없지만 군사우편에 비해 좀 더 빨리 도착한다고 하므로 사회와의 소통을 위해서라면 챙겨가는 게 좋습니다. 저는 한 통도 편지를 보내지 않았기 때문에 해당사항은 없었지만 챙겨가서 나쁠 건 없을 것 같습니다.

- 팔꿈치 및 무릎 보호대 : 가져가면 사격 및 각개전투에서 상당히 편해집니다. 없을 경우 그냥 팔꿈치랑 무릎에 멍이 좀 생기지만 굳이 꼭 가져가지는 않아도 됩니다. 요즘은 훈련소에서 자체적으로 보호대를 나눠주기도 하지만 그 수량이 한정되어 있어 받아 쓰기는 힘듭니다.

- 책 : 일과시간이 끝나고 나면 청소 및 점호를 제외하고는 시간이 남고, 공휴일이나 주말에는 청소 이외에는 오침[각주:2] 시간을 줄 정도로 할게 없기 때문에 읽을 책이나 공부할 것들을 들고 가는것도 좋습니다. 만화책 등을 제외하면 어지간하면 볼수 있으며, 본인의 경우 정보처리산업기사 필기 책을 가져가서 자격증 공부를 했습니다. 숙소 내부에 비치된 책들도 몇 개정도 읽을만 하지만 대여섯권을 제외하면 자기계발 관련 서적뿐이기 때문에 할게 없어집니다.

- 가방 : 부피가 큰 일반 가방이 아닌 접이식 쇼핑백 등 부피가 작고 튼튼한 녀석이 좋습니다. 펼쳤을 때 크기는 좀 큰 편이 좋습니다. 수료식이 다가오면 받은 군화, 속옷, 손수건, 양말, 군복, 세면용품, 남은 부식 등을 전부 담아가야 하는데, 이런 가방이 없을 경우 무척 막막해집니다. 아예 캐리어를 가져와서 담아가는 사람도 있었습니다. 꼭 챙겨가는게 정신건강에 좋습니다.


 훈련소에서의 하루 일과는 완전히 틀에 박힌 것처럼 진행됩니다. 22시에 취침하여 6시에 기상[각주:3]하며, 날이 괜찮을 경우 밖에 나가서 아침점호를 진행합니다. 입영 후 며칠간은 약식으로 하지만 며칠이 지난 후부터는 운동장에 연대 전체가 모여서 점호하며 뜀걸음이라고 하여 운동장 주변 도로로 1~2바퀴씩 뛰기도 합니다. 1바퀴에 대충 1km정도 되므로 날에 따라 2km정도를 뛰게 되기도 하는데, 뛰는 속도가 그렇게 빠르지는 않습니다. 뛰는 도중 계속 군가를 부르게 하는 경우가 있기 때문에 분대장에 따라 강도는 달라집니다. 아침점호 이후 아침식사를 하고, 이후 바로 일과를 시작하며 저녁밥을 먹은 후 일과가 끝납니다. 그 후 1~2시간 정도의 여유가 생기며 청소, 저녁점호 후 바로 취침합니다. 아침저녁 점호때마다 육군복무신조(우리의 결의!)와 병영생활 행동강령을 외게 하기 때문에 수료할때 쯤 되면 자연스럽게 전부 외우게 됩니다. 군가도 걸을 때나 식사 준비 등 틈날 때마다 불러대서 적어도 서너 곡은 자동으로 외워집니다. 군가 외 사회의 노래들은 가끔 분대장이 틀어주거나 종교활동에 갈 때를 제외하면 들을 일이 없습니다.


 훈련소에서 쓸만한 가장 좋은 팁은 '늦지만 늦지 않게 행동하라'라고 할 수 있습니다. 훈련소 특성상 수많은 인원이 한번에 모이고 움직여야 하기 때문에 변수가 많고 그만큼 변동사항이 많습니다. 예를 들어 전투복으로 환복하고 10분 뒤에 집합하라고 했다가 한 5분쯤 지났을 때 다시 방송으로 정정하여 생활복을 입고 집합하라고 하는 경우가 있습니다. 이럴 경우 미리 환복한 인원들은 다시 생활복으로 환복해야 하는 불편함이 있습니다. 이런 경우가 거의 매일같이 발생합니다. 즉, 정해진 시간에 늦지 않는 범위 내에서 준비는 최대한 늦게 하는 것이 불필요한 행동을 줄일 수 있는 최선의 수입니다. 


 원래 무척 많은 내용을 쓰려고 생각하고 있었는데 이만큼 작성하고 나니까 더이상 내용이 떠오르질 않네요. 나중에 더 생각나면 추가하도록 하겠습니다. 사회에 나와서 생활하니 며칠이 금방 지나가는데 훈련소에서는 정말 인생에서 가장 긴 4주를 보내고 왔습니다. 4주간 훈련을 가시는 모든 분들께 조금이나마 글이 도움이 되었으면 좋겠습니다.


  1. 화생방 훈련용 가스탄으로 실제 최루탄의 1/10정도의 강도라고 합니다. 입자가 갈고리 모양이라 피부를 문지르면 더욱 따갑고 아프므로 절대 만지지 않고 바람에 날려보내거나 물로 씻어내야 합니다. [본문으로]
  2. 낮잠. 보통 2시간 정도를 주며 이 시간동안 외부 문을 잠가 통제합니다. [본문으로]
  3. 주말/공휴일의 경우 7시 [본문으로]
블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

,



 재작년, 그러니까 2016년 8월 1일에 입사해서 일하다가 작년, 2017년 3월에 신체검사를 받고 4급이 나왔고 바로 병특 시작이 가능했지만 회사에 알리는게 늦어 2017년 6월 1일부터 병특을 시작해서 내일인 2018년 5월 31일에 군사훈련을 받으러 갑니다. 아마 6월 28일에 돌아올 것 같고, 실제 병특이 끝나는건 2019년 8월이 되겠네요. 딱 2년 2개월이라고 치면 내년 8월 1일이 되겠습니다. 일단 위에 명시한 기간동안 열심히 운동하다 돌아오겠습니다~

블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

,

SEH Overwrite

Analysis/Technique 2018. 5. 29. 17:15

SEH : Structured Exception Handling의 약자로, Windows를 위한 네이티브 예외 처리 메커니즘이다. 각 스레드마다 독립적으로 설치되고 처리된다.

 __try, __except, __finally 구문을 사용하여 SEH를 설치하고 해제할 수 있다. __try{} 선언은 컴파일러에서 정의된 EH_prolog 함수를 호출하는데, 이 함수는 스택에 _EXCEPTION_REGISTRATION_RECORD를 할당하고 SEH 링크드 리스트의 헤드에 레코드를 추가한다. (출처)

[SEH 설치 디스어셈블 모습]

 어셈블리 코드를 확인해 보면 익셉션 핸들러 함수 주소를 먼저 push하고, FS:[0x00]에 접근하여 그 값을 Push하는 것을 볼 수 있다. _EXCEPTION_REGISTRATION_RECORD는 다음과 같은 구조를 갖고 있다.

typedef struct _EXCEPTION_REGISTRATION_RECORD

{

     PEXCEPTION_REGISTRATION_RECORD Next;

     PEXCEPTION_DISPOSITION Handler;

} EXCEPTION_REGISTRATION_RECORD, *PEXCEPTION_REGISTRATION_RECORD;


 Stack은 높은 주소에서 낮은 주소로 할당되므로 Handler 함수를 먼저 push하였고, 두번째로 push한 값은 Next 값이 되는데 이는 이 레코드에서 처리하지 못했을 경우 처리될 다음 _EXCEPTION_REGISTRATION_RECORD의 주소이다. 위에서 언급한 FS:[0x00]에는 TIB(Thread Information Block) 또는 TEB(Thread Environment Block)이라고 불리는 구조체가 존재한다.

 

[TIB 내용. 출처]

 그림과 같이 FS[0x00]에 할당된 TIB는 첫번째 인자로 현재 SEH 프레임의 주소, 즉 링크드 리스트의 헤더 주소를 갖고 있다.

 

[SEH Chain]

 _EXCEPTION_REGISTRATION_RECORD__try 문의 중첩 정도에 따라 그림과 같은 링크드 리스트 구조를 갖고 스택에 할당된다. 먼저 pExceptionHandler 함수가 호출되고, 해당 핸들러에서 익셉션을 처리하지 못할 경우 pNextSEHRecord를 참조하여 다음 핸들러를 호출한다. 이를 계속 반복하다가 pNextSEHRecord0xFFFFFFFF가 할당되어 있는 디폴트 핸들러인 UnhandledExceptionHandler까지 도달할 경우 해당 익셉션을 커널로 넘겨 프로세스를 재개하거나 종료시킨다. 

 

 

[SEH in Stack]

 함수가 Call 될 때 자동으로 스택에 저장되는 ret과 함수 프롤로그에서 자동으로 생성되는 SFP 이후에 함수 내부에서 __try 구문을 사용했다는 가정 하에 스택 프레임에는 위와 같은 구조로 _EXCEPTION_REGISTRATION_RECORD가 쌓일 것이다. Buffer에 원하는 만큼 데이터를 집어넣어서 BOF를 일으킬 수 있다면 가장 쉬운 공격 방법은 역시 ret을 덮어씌워서 공격하는 것이지만, 이는 보통 Stack cookie 또는 Stack canary라고 불리는 보호 기법에 의해 공격이 여의치 않다.

 

[Stack Canary]

 Stack Canary는 고전적인 BOF 방지 기법 중 하나로, retSFP 뒤에 랜덤한 값을 생성하여 설정한 후 함수가 끝날 때 검사하여 값이 바뀌었을 경우 탐지하고 강제로 종료시켜버리는 보호 기법이다. 이런 상황에서는 Canary를 덮어쓰고도 공격이 가능하게 하기 위해 SEH Overwrite를 이용할 수 있다.

 

[Basic SEH Overwrite]

 가장 간단하게 SEH Overwrite를 사용하는 방법은 위와 같다. pExceptionHandler를 덮어쓰기 위해 Canary 값을 변경했으므로 함수 에필로그 직전에 Canary를 검사하는 루틴을 지나가는 순간 프로그램이 종료되어 버린다. 따라서 SEH Overwrite가 제대로 기능하도록 하기 위해서 Canary 검사가 진행되기 전에 다른 Exception이 발생하도록 만들어야 한다. 이 방법은 여러 가지가 있지만 대표적으로는 위 그림처럼 파라미터로 넘어온 포인터까지 Dummy 값으로 덮어씌우고 이를 사용했을 때 Exception이 발생하도록 할 수 있겠다.

 위처럼 단순하게 스택에서 _EXCEPTION_REGISTRATION_RECORDpExceptionHandlerShellcode의 주소로 덮어쓰는 방법을 쓸 수 있으면 좋겠지만, 이 방법은 Microsoft에서 SafeSEH라는 보호 기법을 도입하면서 불가능하게 되었다. 이 보호 기법은 pExceptionHandler 내부에 스택 주소가 들어가거나, MS에서 핸들러로 등록한 주소가 아닌데 kernel32.dll MS에서 지정한 모듈 주소가 들어갈 경우 실행되지 않도록 한다. 따라서 이를 우회하기 위해서는 다른 방식을 사용해야 한다.


typedef EXCEPTION_DISPOSITION (*PEXCEPTION_ROUTINE) ( 

    IN PEXCEPTION_RECORD ExceptionRecord, 

    IN ULONG EstablisherFrame

    IN OUT PCONTEXT ContextRecord, 

    IN OUT PDISPATCHER_CONTEXT DispatcherContext 

);


 위의 함수 정의부는 pExceptionHandler 함수의 프로토타입이다. SEH 처리가 시작되면 pExceptionHandler 주소를 위의 인자들과 함께 Call하게 되는 것인데, 여기서 중요한 부분은 두번째 인자인 EstablisherFrame이다. EstablisherFrame은 이 pExceptionHandler 함수를 호출한 _EXCEPTION_REGISTRATION_RECORD 구조체의 주소를 갖게 된다. , 익셉션 발생 후 SEH 처리가 정상적으로 실행될 경우 다음과 같은 스택 상황이 만들어진다.


[정상적으로 실행된 SEH]

 여기서 주의 깊게 봐야 할 부분은 바로 ESP+8에 위치한 EstablisherFrame 값이 우리가 직접 변조 가능한 pNextSEHRecord를 가리키고 있다는 점이다. 만약 pExceptionHandler를 변조하여 Pop-Pop-Ret 가젯의 주소로 바꿔놓는다면 위 스택에서 ret이 먼저 Pop되고, ExceptionRecordPop되고, EstablisherFrameret되면서 자연스럽게 EIP가 스택의 pNextSEHRecord를 가리킬 것이다.

 

[변조된 SEH]

 위에서 적은 대로 pExceptionHandler &ppr로 덮어씌우고 추가적인 작업을 더 해서 Exploit을 완성한 모습이다. ppr 가젯에 의해 EIP&pNextSEHRecord를 가리키게 되면서 최대 4바이트의 임의의 OPCode를 실행시킬 수 있다. 여기서 사용할 수 있는 가장 간단하면서 강력한 OPCodeshort relative-jmp, EB XX2바이트짜리 점프이다

[Negative Short JMP. 출처]

 이 명령은 [현재 주소] + [Second Byte Value(XX)] + 2 주소로 점프하게 된다여기서 +2가 붙은 이유는 이 명령 자체의 크기가 2이기 때문이다. 예를 들어 0x00120100이라는 스택 주소에 EB 9A 90 90 이라는 OPCode가 들어갈 경우 0x9Asigned int8 형에서 -102와 같으므로 -102 + 2 하여 현재 EIP에서 -100의 주소로 점프한다. 이를 잘 이용하면 위의 버퍼에 미리 입력해 둔 NOP Sled + Shellcode로 점프하는 것이 가능하다.


블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

,




블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

,