전체 글 (49) 썸네일형 리스트형 [static 안티디버깅] NtSetInformationThread() ' NtSetInformationThread() ' 설명 스레드의 우선 순위를 설정합니다. 함수 원형 NtSetInformationThread는 ZwSetInformationThread 의 wrapper function이며, ring3 에서는 두 함수의 기능이 동일 하다. NtSetInformationThread 2번째 파라미터에 ThreadHideFromDebugger를 전달 할 경우 첫번쨰 인자로 전달되는 ThreadHandle 과 디버거의 연결을 해제 (Dettach) 한다. ThreadInformationClass는 enum (열거형)으로써 다음과 같다. typedef enum _THREAD_INFORMATION_CLASS { ThreadBasicInformation, ThreadTimes, Th.. [static 안티디버깅] NtQueryInformationProcess() ' NtQueryInformationProcess() ' 설명 지정된 프로세스에 대한 정보를 검색합니다. 함수 원형 NtQueryInformationProcess는 ZwQueryInformationProcess 의 wrapper function이며, ring3 에서는 두 함수의 기능이 동일 하다. ntdll 라이브러리는 중요한 함수이므로 직접 호출을 하지않고 간접 호출을 한다. 2번쨰 파라미터인 ProcessInformationClass 에서 ProcessDebugPort (0x07), ProcessDebugObjectHandle (0x1E),ProcessDebugFlags (0x1F) 정보 유형을 가져와서 디버깅 중인지 여부를 체크 할 수 있다. ProcessInformationClass는 enum (.. [static 안티디버깅] CheckRemoteDebuggerPresent() ' CheckRemoteDebuggerPresent() ' 설명 지정된 프로세스가 디버그되고 있는지 여부를 확인합니다. 반환값 함수가 성공하면 반환 값이 0이 아닙니다. 함수가 실패하면 반환 값은 0입니다. 함수 원형 BOOL CheckRemoteDebuggerPresent( [in] HANDLE hProcess, [in, out] PBOOL pbDebuggerPresent ); hProcess : 디버깅 중 인지 체크할 프로세스 핸들 pbDebuggerPresent : 함수 리턴 값이 저장될 변수 bool 형 현재 자신 프로세스를 디버깅 여부를 체크하기 위해선 다음과 같은 코드를 작성해 볼 수 있다. CODE #include #include void anti() { BOOL DebugCheck; Che.. [static 안티디버깅] IsDebuggerPresent ' IsDebuggerPresent ' 설명 호출 프로세스가 사용자 모드 디버거에 의해 디버깅되는지 여부를 확인합니다. 반환값 현재 프로세스가 디버거의 컨텍스트에서 실행 중인 경우 반환 값은 0이 아닌 값입니다. 현재 프로세스가 디버거의 컨텍스트에서 실행되고 있지 않으면 반환 값은 0입니다. CODE #include #include void anti() { if (IsDebuggerPresent()) { MessageBox(NULL, "Detect", "", MB_OK); } } int main() { anti(); return 0; } Disassemble IsDebuggerPresent() 함수의 반환 값으로 현재 프로세스가 디버깅 중인지 eax 구분을 하여 분기를 일으킨다. IsDebuggerPre.. DreamHack - rev-basic-3 풀이 파일은 exe 실행 파일 형식이며 Input로 key를 받고 분기하여 성공 및 실패 문자열을 출력해주는 문제인거 같다. 우선 IDA 로 열어 String을 추출해서 해당 함수로 이동해본다. Input으로 입력받은뒤 sub_140001000 함수를 콜 한후 나온 반환값으로 성공 및 실패로 분기하는 코드가 보인다. 해당 함수를 디컴파일러 기능으로 c언어로 변환하면 이렇게 되고 sub_140001000 함수 매개변수에 v4(입력값)이 담기는 코드가 보인다. sub_140001000 함수로 들어가보면 여기서 연산을 한 결과가 성공 및 실패로 가는 분기를 결정하는거 같다. byte_140003000 를 비교하는걸 봐서 해당 주소로 이동해보니 이런 data 가 나온다. i 값이 for문을 돌면서 연산 후에 나온값을.. CodeEngn Basic RCE 12 문제 풀이 디버거 : x64dbg 분석환경 : Window 10 해당 프로그램을 실행해봤더니 패스워드를 입력하고 체크후 일치하다면 성공 메세지를 받는 프로그램 같습니다. pe툴로 열어보니 패킹은 안되있는것 같네요. 해당 프로그램을 디버거로 붙여서 텍스트 문자열을 뽑아줬습니다. 성공문으로 추측되는 문자열이 있는 것 같습니다. 해당 주소로 가보면 바로 위에 eax값이 7A2896BF 인지 확인후 성공 메세지가 출력되는지 분기가 갈리는 코드가 있습니다. eax에 어떤 데이터가 들어가는지 BreakPoint(중단점)을 걸고 확인하면 패스워드 키 1234로 입력해보았습니다. 4D2로 16진수로 내가 입력한 패스워드가 eax에 담기는걸 확인했습니다. 즉 내가 입력한 키와 성공 키 열을 비교한다는 것을 알 수 있고 해당 프로그.. CodeEngn Basic RCE 11 문제 풀이 디버거 : x64dbg 분석환경 : Window 10 Basic 09와 동일한 문제입니다. Stolenbyte 개념을 확실히 잡아가기위해 한번 더 출제된 문제같습니다. 해당 프로그램을 실행해봤더니 keyfile이 있는지 없는지 체크후 성공 실패로 갈리는 프로그램 같습니다. 해당 프로그램은 UPX(2.03)로 패킹되어 있는 것을 확인했습니다. OEP 주소로 이동하기위해 ESP 주소에 중단점을 걸어줬습니다. OEP 주소로 이동하기 전 StolenByte가 보입니다. OEP 주소로 이동후 StolenByte를 복원 해줬습니다. 후에 00401000 주소로 OEP를 재설정후 덤프를 해줬습니다. 그럼 결과적으로 OEP는 00401000가 되고 StolenByte 는 6A 00 68 00 20 40 00 68 12.. CodeEngn Basic RCE 10 문제 풀이 디버거 : x64dbg 분석환경 : Window 10 OEP주소를 구하고 등록성공으로 가는 옵코드를 구하는 문제입니다. 해당 프로그램은 ASPACK(2.0)로 패킹이 되어있습니다. EP 주소로 이동후 ESP 주소에 하드웨어 중단점을 걸어줍니다. OEP로 이동하는 주소를 찾았습니다. 계속 트레이스 해줍시다. OEP 주소로 이동하는데 성공했습니다. 이제 덤프를 해서 언패킹 작업을 해줍니다. 프로그램을 실행해보니 Name 과 Serial 입력이 불가능하고 Not registerd 라는 캡션이 출력됩니다. 성공구문으로 가기위해 문자열을 뒤져 성공 구문을 찾아보도록 합시다. 텍스트값을 뽑아내어 성공구문으로 추측되는 문자열이 있는 것 같습니다. 해당 주소로 이동해봅시다. 해당 주소로 이동해봤더니 성공문으로 갈지 안.. 이전 1 2 3 4 5 6 7 다음