TEB(Thread Environment Block)는 쓰레드정보를 담고 있는 구조체이고 PEB(Process Environment Block)은 프로세스 정보를 담고있는 구조체이다. 옛날에 덤프 분석할 때, PEB 정보 확인을 안해서 중요 정보를 놓쳤던? 적이 있다. 어쨌든 덤프 분석할 때도 잘 알아야 하고 안티리버싱에도 많이 사용되고 기타 등등 중요한 구조체들이기 때문에 잘 알아둘 필요가 있어서 여기에 정리한다. +추가되는 정보가 있다면 계속 채워나갈 예정이다. EPROCESS, ETHREAD, PEB, TEB 차이먼저, 같은 프로세스, 스레드 정보를 담고 있는 구조체이지만 EPROCESS, ETHREAD 구조체와 PEB, TEB 구조체가 어떻게 다른지를 알고 넘어가야 한다. EPROCESS, ETH..
리버싱에 관심이 있는 사람이라면 누구나 워게임 사이트에서 제공하는 실행파일이나 우리가 일반적으로 사용하는 실행파일이 아닌 실제 악성 프로그램을 분석해보고 싶은 욕구가 한번쯤 있을 것이다. 그런데 malwares.com과 같이 대부분의 멀웨어 사이트들은 일정부분 다운 이상은 전부 유료이고 아마 상당히 비싸다. 그래서 보통 멀웨어 샘플이 필요한 기업이나 기관, 학교에서 라이센스를 획득하는 것이 대부분인 것으로 알고있다. 퇴사를 하게되면서 이제 샘플 얻는건 꿈도 못꾸겠지 했는데...! 내가 속해있는 (눈팅만하는) 보안 관련 채팅방에 아래와 같은 링크가 올라온 것이 아닌가. 찾아보니 누구나 라이센스 없이 악성코드를 무제한 다운로드 가능한 사이트라고 한다. 멀웨어나 봇넷에 대항하겠다는 취지로 만들어진 프로젝트 어..
C언어로 개발하는 PE Viewer(PE 뷰어) 다섯번째 포스팅에서는 지난 포스팅에 Import Directory Table 에 이어서 PE 파일 파싱의 꽃? 이라고 할 수 있는 IAT(IMAGE Address Table)와 INT(Image Name Table)를 파싱해보도록 한다. IAT와 INT에 접근하기 위해선 Import Directory Table에 대한 접근이 필수인데 관련 내용은 아래 포스팅에서 참고하길 바란다. PE Viewer 개발 (4) - IMPORT Directory Table PE Viewer 개발 (4) - IMPORT Directory Table C언어로 개발하는 PE Viewer(PE 뷰어) 네번째 포스팅에서는 지난 포스팅의 섹션헤더에 이어 IMPORT Directory T..
C언어로 개발하는 PE Viewer(PE 뷰어) 네번째 포스팅에서는 지난 포스팅의 섹션헤더에 이어 IMPORT Directory Table을 파싱해볼 것이다. 나중에 포스팅할 IAT나 INT와 같은 테이블을 파싱하기 위해 꼭 필요한 테이블이다. IMPORT Directory Table (IMAGE_IMPORT_DESCRIPTOR) IMPORT Directory Table은 IMAGE_IMPORT_DESCRIPTOR 구조체 배열로 이루어져 있으며 여태까지 살펴본 PE 헤더가 아닌 PE body에 위치해있다. PE 파일은 자신이 어떤 라이브러리를 임포트하고 있는지 IMAGE_IMPORT_DESCRIPTOR 구조체에 명시하고 이 구조체 배열이 들어있는 테이블이 IMPORT Directory Table이다. I..
여기 적혀있는 내용은 심볼이 없는 덤프에서 vtable 영역을 어떻게 하면 찾을수 있을까에 대한 개인적인 의견이기 때문에 정확한 정보가 담긴 포스팅은 아니다. 참고용으로만 확인해주길 바라며 틀린 내용에 대한 지적은 언제든 환영이다. 심볼이 있는 경우 심볼이 있는 경우 vtable 영역을 찾는 건 쉽다. 아래 포스팅에서도 기술했다시피 와 같은 방식으로 간단히 찾을 수 있기 때문이다. 가상 함수 호출 패턴 검색 하지만 심볼이 없는 경우는 얘기가 달라진다. 심볼이 없으면 `vftable' = 과 같이 표시가 되지 않기 때문에 위와 같은 방식으로 간단하게 vtable 영역을 찾을 수 없게된다. 그래서 처음 생각한 방식이 가상 함수 호출 패턴과 비슷한 코드(레지스터에 넣은 후 ..
C++ 리버싱은 C 리버싱과는 많이 다르기 때문에 항상 난항을 겪는다. C와는 다른 대표적인 C++ 특징 중 하나가 가상 함수 테이블인 vtable이 있는데 이 vtable 중 하나의 함수를 후킹하는 경우도 있기 때문에 덤프분석을 하거나 할때는 vtable도 잘 살펴봐야 한다. 따라서 가상함수 호출 시 vtable을 어떻게 참조하는지 어떤 특징이 있는지 등과 덤프에서 vtable 영역을 찾으려면 어떻게 해야하는지를 여기에 정리해보려 한다. 가상 함수 테이블 (vtable) 이란 가상 함수 테이블(vtable)이란 C++에서 virtual 메소드를 사용해 함수를 만들 때 생기는 테이블로 각 클래스 별 가상함수만 빼내어 그 주소를 가르키는 함수포인터를 저장해놓은 일종의 함수 포인터 배열이라고 할 수 있다. ..
때는 바야흐로..... 수림아 돈도없는데 제로데이한번 찾아보자...라는 생각에 2019년 12월에 2~3주정도 밤낮으로 퍼징을 돌렸었다. 그리고 하고많은 크래쉬중 거르고 거르고 걸렀다가 분석하다 걸렀다가 exploit 해볼라다가 안돼서 거르고 거르고 걸러 뭔가 될것같은!!!!! 느낌의 크래쉬를 겨우 얻어서 일주일간 분석했었다. 결국 edi값(destination address)과 입력파일과의 연계점을 알아내 edi를 원하는 값으로 조정하는 것이 가능했지만 쉬프트 연산 때문에 조정할 수 있는 edi값이 무조건 ~04로 끝나게 되는데, 리턴주소를 덮기 위해 가장 가깝게 edi를 조정한 주소값과 esi(source address)와의 차이가 0x13보다 커서 어찌어찌 길이값도 조정을 해보려 했으나 다른값들까지..
지뢰찾기.exe를 사용해서 단순 DLL 인젝션부터 코드 후킹 (Code Hooking), API 후킹 (API Hooking)까지 구현을 해봤는데 오늘은 마지막으로 IAT 후킹 (IAT Hooking)을 구현해보려 한다. IAT 후킹은 사실 큰개념으로 보면 API 후킹에 포함되는 개념이지만 API 후킹에서 사용했던 방식은 WinAPI의 EP 코드를 후킹하는 것이었는데 오늘할 IAT 후킹에서는 코드가 아닌 IAT 영역을 변경한다는 것이 다르다. IAT 후킹을 위해선, 핸들값을 얻은 후에 내가 후킹할 함수의 IAT 위치를 알아내는 것이 필요하기 때문에 PE구조를 어느정도 알 필요가 있다. - 빌드 : VisualStudio 2015 - 환경 : Windows10 x64 타겟 API 선정 타겟 API는 아래 ..
저번 포스팅에서는 지뢰찾기에서 클릭시 발생하는 이벤트핸들러 호출 부분 코드를 후킹해서 모든 지뢰가 표시되는 함수 실행이 되도록 해보았다. 이번에는 클릭 이벤트 핸들러 중간에 호출하는 win32u.dll의 NtUserSetCapture() API를 후킹해보도록 한다. - 빌드 : VisualStudio 2015 - 환경 : Windows10 x64 후킹이 성공하면 아래와 같이 모든 지뢰가 표시되기 때문에 지뢰들을 피해서 게임을 진행할 수 있다 :) 타겟 API 선정 타겟 API는 win32u.dll의 NtUserSetCapture()로 정했는데, 클릭시 호출되는 클릭 이벤트핸들러를 트레이싱하다보면 마우스의 움직임을 감지하는 SetCapture함수를 호출(내부에서 NtUserSetCapture 호출)하는 것..
저번 포스팅에서 CreateRemoteThread를 통해 지뢰찾기.exe에 메시지창을 띄우는 스레드를 실행시키는 DLL을 인젝션해보았다. 이번에는 DLL에 메시지창을 띄우는 스레드를 실행시키는 코드 대신에 특정 코드를 후킹하는 Code Hooking 코드를 넣어보려 한다. 사실 코드 후킹이라는 단어를 썼는데 코드 패치라고도 볼 수 있을 것 같다. - 빌드 : VisualStudio 2015 - 환경 : Windows10 x64 / Windows7 x32 타겟 코드 (함수 호출 코드) 선정 먼저 어떤 함수를 호출하는 코드를 후킹할지를 정해야하기 때문에 간단히 지뢰찾기.exe를 분석할 필요가 있다. 사실 '코드 후킹 = 꼭 함수 호출 코드 부분 후킹'을 의미하는 것은 아니고 다양한데 난 함수 호출 코드 부분..
ARM 파일인데 IDA 정적분석으로 충분히 풀 수 있는 문제이다. 분석 자체는 쉬운데 코드를 짤 때, 타입 선언이랑 초기화를 제대로 안해줘서 삽질을 했던 문제이다. reversing.kr HateIntel 풀이 Wrong/Correct 문자열이 사용되는 함수로 가보면, 아래와 같이 v1에 key값을 입력받고 sub_232C를 호출한 후에 입력받은 key값 길이만큼 반복문을 돌며 연산 값을 byte_30040 배열과 비교하고 있다. 한바이트라도 같지 않으면 Wrong Key!가 뜨게 된다. byte_3004는 총 29바이트이기 때문에 입력 key값의 길이가 29바이트여야 한다는 것을 알 수 있다. sub_232C를 살펴보면, 아래와 같이 반복문 내에서 입력 key값 한바이트씩 인자로 넘겨 sub_2494를..
먼저 복호화 루틴을 찾고, original 파일이 왜 주어졌는지 생각해보면 문제를 풀 수 있다. 그리고 ror rol이나 하위 레지스터 bh 등 사용때문에 인라인 어셈코드 작성이 필수이다. reversing.kr 중반쯤으로 넘어가면서 문제가 점점 어려워지고 있어서 한문제를 푸는데 시간이 오래걸리고 있는데 그만큼 도움이 많이 되는 것 같고 풀었을 때 뿌듯해서 좋다. reversing.kr PEPassword 풀이 original.exe를 실행시켜보면 "~ Password is ????????????" 메시지 박스가 나오고 packed.exe를 실행시켜보면 Password Check로 입력값을 받고 있다. 원본파일이든 패킹된 파일이든 메모리에서의 실행코드는 같기 때문에 실행 결과?가 같아야되는데 다른것을 보..