본문 바로가기

리버스-엔지니어링

(29)
SimpleBackdoor - IDA 정적 분석 사전 지식 Handle : 프로그램 내부에서 생성되며, 특정 자원(파일)에 접근하기 위한 포인터 Socket : 네트워크에서 통신을 연결하기 위한 규칙 socket : 소켓 생성 bind : 소켓을 특정 port에 할당 listen : 연결 대기 accept : 연결 성공 recv : 외부 데이터 수신 send : 외부로 데이터 전송 문제 : 악성코드의 통신 port를 찾아라 통신을 위해서는 socket - bind - listen - accept 단계를 거쳐야 한다. socket에 port를 지정하는 절차는 bind에서 수행되므로 string 검색을 통해 bind를 찾아간다. "bind error" 문자열의 바로 전 단계가 socket을 bind 하는 단계라고 추측된다. 위 사진을 보면 mov esi,..
Lab07_01 - 악성코드 동적 분석 동적 분석 가상환경에서 악성코드를 실행하고 실행 전/후 환경 변화를 분석한다. ➽ 도구 DirWatch : 파일 수정을 모니터링한다. ApiLogger : API 로그를 남긴다. SniffHit : HTTP 및 IRC 트래픽을 스니핑한다. ProcWatch : 생성 및 삭제 된 프로세스를 모니터링한다. SysAnalyzer : 프로세스가 수행한 작업을 분석하여 보여준다. 악성코드 샘플 분석 StartAddress는 스레드를 생성하는 함수로서 사용자가 정의한 반복문을 실행할 때 사용된다. StartAddress에서 아래와 같이 특정 웹사이트에 질의를 무한 반복하고 있다. 따라서 DOS 공격을 수행하는 악성코드임을 알 수 있다.
Lab05-01 - IDA 정적 분석 ி 정적 분석 악성코드 실행 없이 코드 내부 구조와 흐름을 파악한다. 도구는 IDA와 Ghidra가 있다. ி IDA 주요 기능 sub : 함수를 시작하는 주소 loc : 목적지로 점프하는 주소 Offset : 메모리 주소가 가리키는 곳의 메시지를 가져온다 xref(cross ref) : 특정 함수가 호출하는 또는 호출되는 부분을 표시 Space : Graph 모드 Text View 모드 ி IDA 샘플 분석 Lab05-01.dll - IDA의 기능을 숙달하는 것이 목적이므로 기초 분석만 진행하겠다. DllMain의 주소는 무엇인가? - gethostbyname : 서버의 IP 주소 확인 - 어셈블리코드에서 G를 누르면 원하는 주소로 이동한다. 10019040의 데이터를 가져와서 0D를 더해서 eax에 ..
[Reversing.kr] Music Player 음악 파일의 재생시간 제한을 우회하도록 한다. 1분 미리듣기 팝업을 띄워서 콜스택으로 해당 함수의 출처를 확인한다. 사용자 영역에서 실행한 함수는 rtcMsgBox이므로 해당 주소로 이동한다. 분기점을 찾기 위해 해당 함수 윗부분으로 이동한다. MsgBox 함수 호출 이전에 음악 재생 시간을 비교하고 있다. 0x0EA60은 10진수로 60000, 즉 음악 재생시간이 60000ms이므로 그 이상의 값으로 수정한다. 로직 자체를 우회하려면 40456B의 JL을 JMP로 바꾸면 된다. 그러나 실행하면 음악은 계속 재생되지만 런타임 에러가 발생된다. 오류 메시지를 보니 현재 재생 시간의 값을 확인하는 구문이 있는 것으로 추정된다. All intermodullar calls를 열어보면 vbaHresultcheck..
[Reversing.kr] Easy CrackMe 해당 프로그램의 패스워드 인증키가 무엇인지 알아내야한다. All referenced text strings로 패스워드 인증과 관련된 문자열이 정의된 곳은 금방 찾을 수 있다. 분기문을 찾아 코드 윗 부분으로 올라가면 아래 코드를 만나게 된다. GetDigItemTextA는 아까 보았던 대화상자에서 문자열을 획득하는 API이다. (필자는 패스워드를 asda로 인증 요청 후 디버깅을 진행한다) 분기 조건문(CMP)을 해석했을 때 현재 ESP는 12FA14이므로 5를 더하면 12FA19이다. 해당 위치에 있던 값을 변수값 출력창으로 확인해본다. 메시지창에서 입력한 두 번째 문자를 가져오고 있다. 패스워드 두 번째 글자와 아스키코드 61('a')가 같으면 다음 코드로 분기하게 된다.따라서 프로그램을 재실행한뒤 ..
[Reversing.kr] Easy Unpack 프로그램 실행 시 빈 화면이 나타난다. 문제는 언패킹 후 OEP를 찾는 것이다. 디버깅하여 한 스텝씩 실행하다보면 401150으로 분기하는 주소가 있다. 해당 주소로 이동해보니 패킹된 코드들이 풀어질 영역으로 생각된다. 40A1F9에 BP를 걸고 프로그램을 실행한다.Ctrl+A를 눌러 코드를 정렬시키면 아래 왼쪽 사진과 같이 나온다. (우측 사진) 언패킹된 코드를 한 단계씩 실행해보면 아까 프로그램을 실행했을 때 나타났던 빈 창이 출력된다.즉, 401150이 OEP라는 것을 알 수 있다.
리버싱 레나 튜토리얼28 - 서버 인증 우회 리버싱 레나 튜토리얼21 - UPX UnPackMe https://jdh5202.tistory.com/680 해당 프로그램은 계정 등록 과정에서 서버 인증 체크를 하므로 이를 우회한다. 디버깅 시 저번 문제처럼 PUSHAD/POPAD가 존재하지 않지만, 시작점이 CODE영역 밖이기 때문에 실행코드가 패킹되어 있다고 의심된다. PUSHAD/POPAD는 없지만, PUSH 명령어가 이어지기 때문에, PUSHAD와 유사한 로직이 수행되고 있음을 추측해 볼 수 있다. 현재 스택에 저장된 원래 레지스터 값들이 언제 회수(POPAD) 되는지 확인하기 위해 ESP Trick을 시도할 것이다. 첫 시작점인 55F881에서는 ESP값이 존재하지 않으므로 1 step 실행해서 ESP 값을 생성한 후 HW Break Poin..
리버싱 레나 튜토리얼21 - UPX UnPackMe 리버싱 레나 튜토리얼20 - UnPackMehttps://jdh5202.tistory.com/679 이번 문제는 저 프로그램의 패킹을 풀고 덤프를 뜨는 것이 목적이다. 올리디버거에서 디버깅을 하다보면 아래 코드가 보인다. (PUSHAD) 레지스터 값을 스택에 백업하고 (POPAD) 스택에 저장된 값을 다시 레지스터에 저장한다. 언패킹 중 레지스터 변경 방지를 위해 백업/복구와 유사한 절차를 수행한다. PUSHAD ~ POPAD 부분에서 언패킹을 수행하며스택에서 레지스터들이 꺼내지는 순간 OEP로 진입한다. POPAD까지 실행하고 Dump debugged process를 통해 언패킹된 프로세스를 추출한다. 프로그램 실행이 되지 않아 Rebuild Import를 각각 체크/체크해제를 하고 Dump를 진행하였..