자신의 서버 백업하기
본인의 서버 / 에 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 점프됨