우리집은 FUJI xerox라고 레이저 프린터기를 쓰고있다. 그런데 어느샌가부터 희미하게 새로줄이 생기더니 완전 선명해지기 시작해졌다. 프알못이기 때문에 수리점에 맡겨야 하나 싶어서 이것저것 구글링해보는데 이렇게 새로줄이 생기는 경우는 기계적인 결함이라기 보다는 내부에 뭔가 끼거나 먼지가 있거나 등의 청소 문제인 경우가 많은 것 같았다. 바로 확인 고고. 프린터 윗판을 열면 아래와 같이 토너 카트리지가 있는데 잡아서 들어올리면 빠지게 된다. 토너를 빼낸 후에 프린터 가이드 (DocuPrint P115 w, User Guide)에 설명되어 있는대로 먼저 '기기 내부 청소 - 코로나 와이어 청소'를 해주었다. 아래 사진처럼 연두색 탭같은게 있는데 이걸 몇번 왼쪽, 오른쪽, 왼쪽, 오른쪽 슥삭슥삭 해주면 된다..
C++ 리버싱은 C 리버싱과는 많이 다르기 때문에 항상 난항을 겪는다. C와는 다른 대표적인 C++ 특징 중 하나가 가상 함수 테이블인 vtable이 있는데 이 vtable 중 하나의 함수를 후킹하는 경우도 있기 때문에 덤프분석을 하거나 할때는 vtable도 잘 살펴봐야 한다. 따라서 가상함수 호출 시 vtable을 어떻게 참조하는지 어떤 특징이 있는지 등과 덤프에서 vtable 영역을 찾으려면 어떻게 해야하는지를 여기에 정리해보려 한다. 가상 함수 테이블 (vtable) 이란 가상 함수 테이블(vtable)이란 C++에서 virtual 메소드를 사용해 함수를 만들 때 생기는 테이블로 각 클래스 별 가상함수만 빼내어 그 주소를 가르키는 함수포인터를 저장해놓은 일종의 함수 포인터 배열이라고 할 수 있다. ..
역시 정리하지 않으면 잊어버리는 것이 사람인 것 같다. 나만 그럴수도... ROP 개념을 정리하는 와중에 먼저 RTL Chaning 부터 제대로 정리하자는 생각이 들어 여기에 정리한다. RTL(Return to Library) 이란 일단, RTL은 메모리에 이미 적재되어있는 공유 라이브러리를 이용해 원하는 함수를 실행시키는 기법이다. func1 함수를 실행시켜야 한다는 가정에서 아래 예를 봐보자. [buf + SFP +RET] 의 RET 자리에 func1 함수의 주소값이 들어갔고 4바이트의 dummy 후에 func1함수의 인자값이 들어간 구조가 됐다. 참고로 여기서 설명을 위해 사용하는 func1은 인자가 1개인 함수이고 func2는 인자가 2개가 필요한 함수라는 가정이다. // 기존 스택 상황 buf ..
때는 바야흐로..... 수림아 돈도없는데 제로데이한번 찾아보자...라는 생각에 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로 입력값을 받고 있다. 원본파일이든 패킹된 파일이든 메모리에서의 실행코드는 같기 때문에 실행 결과?가 같아야되는데 다른것을 보..
CHSOP은 닷넷 디컴파일툴을 사용해서 풀어야 하는 문제이고 나같은 경우 정적분석만으로는 문자열 배합 방법을 모르겠어서 소스 수정이 불가피했다. reversing.kr CSHOP 풀이 CSHOP.exe를 실행시켜보면, 아래와 같이 빈 창이 뜬다. 일단, CSHOP은 닷넷 프로그램이기 때문에 IDA로는 분석이 불가하고 닷넷 디컴파일 툴이 필요하다. CodeEngn을 풀 때, 닷넷 프로그램이 한번 문제로 나온적이 있어서 그때 사용했던 dotPeek을 사용하기로 했다. 먼저 FrmMain을 살펴보면, 첫번째로 눈에 띄는 것은 _Click 함수에 특정 문자열이 저장되어 있다는 것이다. 정답값은 아니었다. 그리고 바로 위에 Form1_Load 함수가 있는데 문자값들이 비어있다. 폼로드라는 함수이름 특성 상, 어떤..
간단한 32bit exe인 '지뢰찾기.exe'에 스레드 내에서 메시지창을 실행시키는 DLL을 제작해 인젝션하는 인젝터를 제작해보려 한다. 지뢰찾기.exe를 사용한 특별한 이유는 없고 32bit 프로그램이라면 어떤것이든 (아주아주 예외적으로 내부에 kernel32.dll을 로드하지 않는 프로그램은 제외) 상관없다. - 빌드 : Visual Studio 2015 - 환경 : Windows10 x64, Windows7 x32 둘다 됨 인젝션시킬 dll 코드 인젝션시킬 dll 코드는 아래와 같다. dll이 인젝션되면 DllMain이 호출되고 DllMain이 왜 호출되었는지에 대한 인자값인 fdwReason이 DLL_PROCESS_ATTACH이면 (Dll이 프로세스에 로드되면) CreateThread로 ShowM..
이번 문제는 오토핫키 실행파일에서 key값들을 찾아내는 문제로, CRC 체크하는 부분을 하나하나 우회해주어야 되는 문제인 줄 알고 하루 온종일 삽질했던 문제이다. reversing.kr AutoHotkey1 풀이 주어진 오토핫키 실행 파일을 실행시켜보면, 아래와 같이 무언가 입력값을 받고 있다. 먼저 오토핫키에 대해 아주 간단히 살펴보면, 오토핫키는 매크로 프로그램 중 하나이다. 오토핫키 스크립트 확장자는 .ahk이고 오토핫키 프로그램을 설치하면 Compiler 폴더의 Ahk2Exe를 사용해서 ahk를 exe로 컴파일하게 된다. 그리고 컴파일된 exe파일은 원래라면 아래와 같이 RCdata 부분에서 평문 스크립트를 확인할 수 있다. 이때, 디컴파일을 막기 위해 패스워드를 따로 지정해서 컴파일을 하는 경우..