어셈블리 프로그래밍
올리디버거에서 지원하는 assenble 기능을 이용해서 프로그래밍..
OllyDbg의 Assemble 명령
asmtest.txt를 올리디버거로 열어서 코드 섹션의 맨 윗부분(401000) 봄
여기 주소에 커서 올리고 마우스 우클릭해서 'New origin here[Ctrl+Gray]항목 누르면 EIP가 해당 주소로 변함
여기서 스페이스 누르면 어셈블 입력창 떠서 간단한 어셈블리 프로그래밍 할 수 있음
ThreadProc() 작성
C로만든 ThreadProc()함수와의 차이점은 Code 사이에 필요한 Data를 포함하는 것
CALL 명령어 넣고.. ASCII 항목에는 ReverseCore 문자열 넣음 이때 문자열은 반드시 NULL로 끝나야하 하니 hex 에서 00을 추가함..
이 명령 하면 코드 원래대로 돌아도 감.
저장할 때는 Copy to executable - All modifications하고 Copy all 선택 일케 저장안하면 다시 실행했을 때 수정한게 날아간다..
인젝터 제작
ThreadProc()함수의 바이너리 코드 얻기
생성한 asmtest_patch파일을 올리디버거로 열면 ThreadProc()주소가 나오는데 이 주소로 이동해서 Copy-To file을 한다.
저장
이 텍스트 내용이 Hex값으로 표현된 TrheadProc()함수임(IA-32명령어로된..) 이게 상대방 프로세스에 인젝션될 코드가 되는 것.
CodInjection2.cpp
인젝터 프로그램의 소스코드임
CodeInjection.cpp이랑 비슷하지만 인젝션하는 코드에 필요한 문자열 데이터를 같이 포함시킨다는 점에서 차이를 가짐
디버깅 실습
notepad를 running상태로 만들어놓고 스레드부터 시작하도록 옵션을 설정해둠
process explorer로 pid구하고 그 값을 실행 파라미터로 codeinjection2 실행함
실행해서 코드인젝션 성공하면 인젝션된 스레드 코드 위치에서 디버깅이 멈춘다.
스레드 코드 상세 분석
스택 프레임 생성
002D0000 55 PUSH EBP
002D0001 8BEC MOV EBP,ESP
전형적인 스택 프레임 생성 명령어
THREAD_PARAM 구조체 포인터
002D0003 8B75 08 MOV ESI,DWORD PTR SS:[EBP+8]
[EBP+8]은 함수로 넘어온 첫 번째 파라미터
이 예제에서는 THREAD_PARAM 구조체 포인터
user32.dll문자열
002DO006 68 6C6C000O PUSH 6C6C ; "\0\0ll"
002D0OOB 68 33322E64 PUSH 642E3233 ; "d.23"
002D0010 68 75736572 PUSH 72657375 ; "resu"
스택에 문자열을 저장하는 기법
스택에 직접 전근가능한 어셈블리 프로그래밍 언어에서만 가능한 기법
user32.dll 문자열 파라미터 입력
002D0015 54 PUSH ESP
LoadLibraryA() API로 파라미터로 로딩시킬 DLL 파일 이름 문자열 주소를 받아옴
LoadLibraryA("user32.dll")호출
OO2D0016 FF16 CALL DWORD PTR DS:[ESI] ; kernel32.LoadLibraryA
"MessageBoxA" 문자열
O02DO018 68 6F784100 PUSH 41786F ; "\0Axo"
0O2D001D 68 61676542 PUSH 42656761 ; "Bega"
0O2D0O22 68 4D657373 PUSH 7373654D ; "sseM"
GetProcAddress(hMod, "MessageBoxA")호출
002D0027 54 PUSH ESP ; - "MessageBoxA"
002D0028 50 PUSH EAX ; - hMod (778E0000)
002D0029 FF56 04 CALL DWORD PTR DS:[ESI+4] ; kerne!32.GetProcAdd ress
MessageBoxA()파라미터 입력 1 - MB_OK
O02D002C 6A 00 PUSH 0
MessageBoxA()파라미터 입력 1 - "ReverseCore"
0O2D002E E8 0C000000 CALL 002DO03F
002DO033 52 PUSH EDX
O02DOO34 65:76 65 JBE SHORT O02D009C
002DO037 72 73 JB SHORT 0O2DOOAC
002D0039 65:43 INC EBX
OO2D003B 6F OUTS DX,DWORD PTR ES:[EDI]
0O2D003C 72 65 JB SHORT O02D00A3
0O2D003E 00E8 ADD AL,CH
MessageBoxA()파라미터 입력 3 - "www.reversecore.com"
0O2DO03F E8 14000000 CALL 002D0058
002D0044 77 77 JA SHORT 002D00BD
002D0046 77 2E JA SHORT 002D0076
002D0048 72 65 JB SHORT O02D00AF
O02D004A 76 65 JBE SHORT 002D00B1
002D004C 72 73 JB SHORT 002D00C1
0O2D004E 65:636F 72 ARPL WORD PTR GS:[EDI+72],BP
002D0052 65: PREFIX GS:
002DO053 2E:636F 6D ARPL WORD PTR CS:[EDI+6D],BP
002D0O57 006A 00 ADD BYTE PTR DS:[EDX],CH
MessageBoxA() 파라미터 입력 4 - NULL
002DO058 6A 00 PUSH 0
MessageBoxA() 호출
002D005A FFDO CALL EAX
ThreadProc() 리턴 값 세팅
002D0O5C 33C0 XOR EAX,EAX
스택 프레임 해제 및 함수 리턴
002D005E 8BE5 MOV ESP,EBP
002DOO60 5D POP EBP
O02D0061 C3 RETN
'공부해요 > 리버싱_핵심원리' 카테고리의 다른 글
30. 메모장 WriteFile() 후킹 (0) | 2024.11.17 |
---|---|
29. API 후킹: 리버싱의 '꽃' (0) | 2024.11.17 |
27. Code 인젝션 (1) | 2024.11.12 |
26. PE Tools (0) | 2024.11.06 |
25. PE 패치를 이용한 DLL 로딩 (0) | 2024.11.06 |