공부해요/리버싱_핵심원리

28. 어셈블리 언어를 이용한 Code 인젝션

yenas0 2024. 11. 12. 15:33
반응형

어셈블리 프로그래밍

올리디버거에서 지원하는 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