52일차

52일차

홈으로 돌아가기

자신의 서버 백업하기
본인의 서버 / 에 st(IP) 로된 폴더를 만들고 chmod 777 st(IP)로 권한 부여 해준 후 
backup.sh작성
#!/bin/sh
set $(date)
fname="backup-home$1$2$3.tar.gz"
tar cvzf /st21/$fname /home

rsync.sh작성
#!/bin/sh
rsync -avz --exclude-from=/etc/rsync_exclude.lst /st21 192.168.0.94::backup
.sh파일에 777로 권한 부여후 ./로 실행

본인의 서버에 패킷비트와 파일비트를 설치후 129로 전송
서버의 로그는 118로 보낼것

자신의 서버 https://jeonjucom.kr:4252 (root / p@ssw0rd!@123)


PE Imphash
import한 헤더의 헤쉬
import가 같다면 헤쉬도 같다

p1
PE Compile Time
2025-02-24 18:27:56
PE Imphash
9f1579000202bdd19d6bd3473200a845

p3
PE Compile Time
2025-02-24 18:20:22
PE Imphash
9f1579000202bdd19d6bd3473200a845

파일헤더를 읽어서 알려주는것
헤드쪽에는 CPU정보를 알수있는 정보가 있다

참고 디버거책 114쪽

p3
Address of Entry Point
000014E0
Image Base
00400000

프로그램의 시작주소 Entrypoint
Image Base + Address of Entry Point
004014E0

x32dbg에서 확인하기
설정에 환경설정에서 이벤트 진입점 중단점만 체크하고 나머지 끄기


00401180
jne
0040124B

004013DD > 00401500

004014E0 > jmp
00401500

char *name="hello";
문자열 : hello
404000


EAX : 사칙연산 등 산술 연산에 자동으로 사용되며, 함수의 반환 값을 처리할 때도 사용됩니다.

EBX : 간접 번지 지정에 사용됩니다. 산수, 변수를 저장합니다.

ECX : 반복(Loop)에서 반복 Count 역할을 수행합니다.

EDX : EAX를 보조하는 역할을 합니다. 예를 들어 나누기를 진행할 경우 몫은 EAX에 나머지는 EDX에 저장됩니다.

ESI : 복사나 비교를 할 경우 출발지 주소를 저장하는 레지스터입니다.

EDI : 복사나 비교를 할 경우 목적지 주소를 저장하는 레지스터입니다.

EIP : 다음에 실행할 명령어의 주소를 가지고 있는 레지스터입니다. 현재 실행하고 있는 명령어가 종료되면 이 레지스터에 있는 명령어를 실행하게 됩니다.

ESP : Stack Pointer의 가장 최근에 저장된 공간의 주소를 저장하는 레지스터입니다.

EBP : Stack Pointer의 기준점(바닥 부분)을 저장하는 레지스터입니다.

어셈블리어 자주 사용하는 명령어
push	push eax	eax의 값을 스택에 저장	스택 조작
pop	pop eax	스택 가장 상위에 있는 값을 꺼내서 eax에 저장	스택 조작
mov	mov eax, ebx	메모리나 레지스터의 값을 옮길때 사용	데이터 이동
inc	lnc eax	eax의 값을 1증가시킨다 (++)	데이터 조작
dec	dec eax	eax의 값을 1감소시킨다 (--)	데이터 조작
add	add eax, ebx	레지스터나 메모리의 값을 덧셈할때 쓰인다.	논리, 연산
sub	sub eax, ebx	레지스터나 메모리의 값을 뺄셈할때 쓰인다.	논리, 연산
call	call proc	프로시저를 호출한다.	프로시저
ret	ret	호출했던 바로 다음 지점으로 이동	프로시저
cmp	cmp eax, ebx	레지스터와 레지스터의 값을 비교	비교
jmp	jmp proc	특정한 곳으로 분기	분기
int 	int $0x80	OS에 할당된 인터럽트 영역을 system call	인터럽트
nop	nop	아무 동작도 하지 않는다. (No Operation)

Data Transfer
명령어	 	설명
MOV	Move	데이터 이동 (전송)
PUSH	Push	오퍼랜드의 내용에 스택을 쌓는다.
POP	Pop	스택으로부터 값을 뽑아낸다.
XCHG	Exchange Register / memory with Register	첫번째 오퍼랜드와 두번째 오버랜드 교환
IN	Input from AL/AX to Fixed port	오퍼랜드로 지시된 포트로부터 AX에 데이터 입력
OUT	Output from AL/AX to Fixed port	오퍼랜드가 지시한 포트로 AX의 데이터 출력
XLAT	Translate byte to AL	BX:AL이 지시한 데이블의 내용을 AL로 로드
LEA	Load Effective Address to Register	메모리의 오프셋값을 레지스터로 로드
LDS	Load Pointer to DS	REG←(MEM), DS←(MEM+2)
LES	Load Pointer ti ES	REG←(MEM), ES←(MEM+2)
LAHF	Load AH with Flags	플래그의 내용을 AH의 특정 비트로 로드
SAHF	Store AH into Flags	AH의 특정 비트가 플래그 레지스터로 전송
PUSHF	Push Flags	플래그 레지스터의 내용을 스택에 쌓음
POPF	Pop Flags	스택으로부터 플래그 레지스터로 뽑음
 

Arithmetic
명령어	 	설명
ADD	Add	캐리를 포함하지 않은 덧셈
SBB	Subtract with Borrow	캐리를 포함한 뺄셈
DEC	Decrement	오퍼랜드 내용을 1 감소
NEG	Change Sign	오퍼랜드의 2의 보수, 즉 부호 반전
CMP	Compare	두 개의 오퍼랜드를 비교한다
ADC	Add with Carry	캐리를 포함한 덧셈
INC	Increment	오퍼랜드 내용을 1 증가
AAA	ASCII adjust for Add	덧셈 결과 AL값을 UNPACK 10진수로 보정
DAA	Decimal adjust for Add	덧셈 결과의 AL값을 PACK 10진수로 보정
SUB	Subtract	캐리를 포함하지 않은 뺄셈
AAS	ASCII adjust for Subtract	뺄셈 결과 AL값을 UNPACK 10진수로 보정
DAS	Decimal adjust for Subtract	뺄셈 결과의 AL값을 PACK 10진수로 보정
MUL	Multiply (Unsigned)	AX와 오퍼랜드를 곱셈하여 결과를 AX 또는 DX:AX에 저장
IMUL	Integer Multiply (Signed)	부호화된 곱셈
AAM	ASCII adjust for Multiply	곱셈 결과 AX값을 UNPACK 10진수로 보정
DIV	Divide (Unsigned)	AX 또는 DX:AX 내용을 오퍼랜드로 나눔. 몫은 AL, AX 나머지는 AH, DX로 저장
IDIV	Integer Divide (Signed)	부호화된 나눗셈
AAD	ASCII adjust for Divide	나눗셈 결과 AX값을 UNPACK 10진수로 보정
CBW	Convert byte to word	AL의 바이트 데이터를 부호 비트를 포함하여 AX 워드로 확장
CWD	Convert word to double word	AX의 워드 데이터를 부호를 포함하여 DX:AX의 더블 워드로 변환
 

Logic
명령어	 	설명
NOT	Invert	오퍼랜드의 1의 보수, 즉 비트 반전
SHL/SAL	Shift logical / arithmetic Left	왼쪽으로 오퍼랜드만큼 자리 이동 (최하위 비트는 0)
SHR	Shift logical Right	오른쪽으로 오퍼랜드만큼 자리 이동 (최상위 비트 0)
SAR	Shift arithmetic Right	오른쪽 자리이동, 최상위 비트는 유지
ROL	Rotate Left	왼쪽으로 오퍼랜드만큼 회전 이동
ROR	Rotate Right	오른쪽으로 오퍼랜드만큼 회전 이동
RCL	Rotate through Carry Left	캐리를 포함하여 오른쪽으로 오퍼랜드만큼 회전 이동
AND	And	논리 AND
TEST	And function to Flags, no result	첫 번째 오퍼랜드와 두 번째 오퍼랜드를 AND하여 그 결과로 플래그 세트
OR	Or	논리 OR
XOR	Exclusive Or	배타 논리 합 (OR)
 

String Manipulation
명령어	 	설명
REP	Repeat	REP 뒤에 오는 스트링 명령을 CX가 0이 될 때까지 반복
MOVS	Move String	DS:SI가 지시한 메모리 데이터를 ES:DI가지시한 메모리로 전송
CMPS	Shift logical Right	DS:SI와 ES:DI의 내용을 비교하고 결과에 따라 플래그 설정
SCAS	Scan String	AL 또는 AX와 ES:DI가 지시한 메모리 내용 비교하고 결과에 따라 플래그 설정
LODS	Load String	SI 내용을 AL 또는 AX로 로드
STOS	Store String	AL 또는 AX를 ES:DI가 지시하는 메모리에 저장
 

Control Transfer
명령어	 	설명
CALL	Call	프로시저 호출
JMP	Unconditional Jump	무조건 분기
RET	Return from CALL	CALL로 스택에 PUSH된 주소로 복귀
JE/JZ	Jump on Equal / Zero	결과가 0이면 분기
JL/JNGE	Jump on Less / not Greater or Equal	결과가 작으면 분기 (부호화된 수)
JB/JNAE	Jump on Below / not Above or Equal	결과가 작으면 분기 (부호화 안 된 수)
JBE/JNA	Jump on Below or Equal / not Above	결과가 작거나 같으면 분기 (부호화 안 된 수)
JP/JPE	Jump on Parity / Parity Even	패리티 플레그가 1이면 분기
JO	Jump on Overflow	오버플로가 발생하면 분기
JS	Jump on Sign	부호 플레그가 1이면 분기
JNE/JNZ	Jump on not Equal / not Zero	결과가 0이 아니면 분기
JNL/JGE	Jump on not Less / Greater or Equal	결과가 크거나 같으면 분기 (부호화된 수)
JNLE/JG	Jump on not Less or Equal / Greater	결과가 크면 분기 (부호화된 수)
JNB/JAE	Jump on not Below / Above or Equal	결과가 크거나 같으면 분기 (부호화 안 된 수)
JNBE/JA	Jump on not Below or Equal / Above	결과가 크면 분기 (부호화 안 된 수)
JNP/JPO	Jump on not Parity / Parity odd	패리티 플레그가 0이면 분기
JNO	Jump on not Overflow	오버플로우가 아닌 경우 분기
JNS	Jump on not Sign	부호 플레그가 0이면 분기
LOOP	Loop CX times	CX를 1감소하면서 0이 될 때까지 지정된 라벨로 분기
LOOPZ/LOOPE	Loop while Zero / Equal	제로 플레그가 1이고 CX≠0이면 지정된 라벨로 분기
LOOPNZ/LOOPNE	Loop while not Zero / not Equal	제로 플레그가 0이고 CX≠0이면 지정된 라벨로 분기
JCXZ	Jump on CX Zero	CX가 0이면 분기
INT	Interrupt	인터럽트 실행
INTO	Interrupt on Overflow	오버플로우가 발생하면 인터럽트 실행
IRET	Interrupt Return	인터럽트 복귀 (리턴)
 

Processor Control
명령어	 	설명
CLC	Clear Carry	캐리 플레그 클리어
CMC	Complement Carry	캐리 플레그를 반전
CLD	Clear Direction	디렉션 플레그를 클리어
CLI	Clear Interrupt	인터럽트 플레그를 클리어
HLT	Halt	정지
LOCK	Bus Lock prefix	 
STC	Set Carry	캐리 플레그 셋
NOP	No operation	메모리의 오프셋값을 레지스터로 로드
STD	Set Direction	디렉션 플레그 셋
STI	Set InterruptS	인터럽트 인에이블 플레그 셋
WAIT	Wait	프로세서를 일지 정지 상태로 한다
ESC	Escape to External device	이스케이프 명령
 

 지시어 
지시어	내용	형식
SEGMENT
-
END	어셈블리 프로그램은 한 개 이상의 세그먼트들로 구성된다. SEGMENT 지시어는 하나의 세그먼트를 정의한다.	segname SEGMENT ; 세그먼트 시작
PROC
-
ENDP	매크로 어셈블리에서는 프로그램의 실행 부분을 모듈로 작성할 수 있다. 이 모듈을 프로시저(Procedure)라 부르며, PROC 지시어가 이를 정의한다.	procname PROC ; 프로시저의 시작
procname ENDP ; 프로시저의 끝
ASSUME	어셈블러에게 세그먼트 레지스터와 사용자가 작성한 세그먼트의 이름을 연결시킨다	DS : data_segname
CS : code_segname
ES : extra_segname
END	전제 프로그램의 끝을 나타냄	END
 

데이터 정의 지시어
지시어	내용	형식
DB	Define Byte	name DB 초기값
DW	Define Word	name DW 초기값
DD	Define Double Word	name DD 초기값
DQ	Define Quad Word	name DQ 초기값
DT	Define Ten Bytes	name DT 초기값
EQU	변수 이름에 데이터값이나 문자열 정의	name EQU 데이터값/문자열
EVEN	어셈블리시 이 지시어가 사용되는 곳의 주소가 짝수로 되도록 함	name DQ 초기값
PAGE	어셈블리 리스트의 형식을 결정	PAGE [length][,width]
TITLE	어셈블리 리스트의 각 페이지에 제목 출력	TITLE tex


어셈블리 명령어 참고
https://coding-factory.tistory.com/650


Easy_CrackMe.exe
x32dbg로 동적 분석해보기

Easy_CrackMe.exe
입력값을 받는 GetDlgItemTextA에 브레이크 포인트를 걸고 실행
입력값이 esp+4부터 저장되는것을 확인
첫번째 조건문은 2번째값이 a와 같은지를 비교
두번째 조건문은 34번째 값을 5y와 같은지 비교
세번째 조건문은 루프문으로 뒤의 암호인 R3versing을 한글자씩 비교
마지막 조건문은 esp+4 즉 첫번째 자리가 E인지를 비교
congratulation
정답 Ea5yR3versing

비교실패시 Incorrect Password 부분으로 jmp 점프됨