●52일차(20250225052.php)
#본인의 개인별 산특 서버 백업
> 192.168.0.94에 백업되는지 확인
cd /
mkdir st11
chmod 777 st11
cd ~
nano backup.sh
---------------------------------
#!/bin/sh
set $(date)
fname="backup-home$1$2$3.tar.gz"
tar cvzf /st11/$fname /home
---------------------------------
chmod 755 backup.sh
./backup.sh
cd ~
nano rsync.sh
---------------------------------------------------------------------------
#!/bin/sh
rsync -avz --exclude-from=/etc/rsync_exclude.lst /st11 192.168.0.94::backup
---------------------------------------------------------------------------
chmod 755 rsync.sh
./rsync.sh
> 94에 알아서 올라감
본인의 서버에 패킷비트와 파일비트를 설치후 129로 전송할것
> 19일차
서버의 로그는 118로 보낼것
rsyslog > 15일차
http://jeonjucom.kr:4242
http://jeonjucom.kr:4245(root / p@ssw0rd!@123)
#쿠쿠 다시 활성화
버츄얼박스 호스트 전용 어댑트 remove 했다가 create
> win7 키자
우분투에서
cuckoo -d
> 안되면 systemctl start mongod
cuckoo web -H 192.168.0.3
> 웹이 뜬다
#imports
P2.exe를 쿠쿠에 넣음
> static analysis
> KERNEL32.dll과 msvcrt.dll이 imports 된다
#PEview
PEview로 P2.exe를 불러오면 PE구조를 알 수 있다.
> 쿠쿠가 PE구조를 불러와서 보기 쉽게 만들어준 것

> image_file_header
> 정적 분석을 통해 나온 compile time이 나옴
> machine : 014C > intel386이라는 말
> CPU 종류를 알 수 있다
> 리버싱 교재 111page
64비트로 컴파일 하면 복잡해짐
32비트 release로 하자

> image_optional_header
> 시작 주소 + 메모리 로딩 주소 = 코딩 주소 진입점
> Address of Entry Point : 000000A8
> Image Base : 000000B4
더하면 > 코딩 주소 진입점이 나온다
#P3.exe
> 변수가 정수
> dev c++에서 P3 생성
#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char *argv[]) {
int a=100;
int b=200;
int c=300;
int d=400;
printf("%d",a);
return 0;
}
x32dbg에 들어가자(거미모양)
> P3 이미지 가져옴
> 디버깅 하자
> EIP 값과 같은지 확인
설정 > 환경설정 > 진입전 중단점만 체크 > 다시불러오기
> F9 > 프로그램을 실행하라고 나옴
> 16진수로 정수가 저장됨
#P4.exe
> 변수가 문자열
#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char *argv[]) {
char *name="hello";
printf("%s",name);
return 0;
}
> F2 누르면 빨간 줄이 생기는데 그 지점에서 멈춤
> F9로 실행
> hello가 뜸

> leave가 마무리 하는 명령어 인듯
char *name="hello"
문자열 : hello

> hello가 저장되어있는 위치(404000)
shift + d > hello 검색
ctrl + g > 404000

> 68 656c6c6f > hello의 아스키코드
#P5.exe
#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char *argv[]) {
char *id="admin";
char *passwd="123456";
return 0;
}
admin > 404000

123456 > 404006
#Easy_CrackMe
> Easy_CrackMe.exe를 활용해 아이디와 비밀번호를 알아내자
> 클릭하면 비밀번호를 치라고 나온다
> 스택에 저장되어있다
> 밑에서부터 저장되는게 스택 구조
> 암호는 총 13자리
> 레지스터와 레지스트리는 다르다
> 리버싱 교재 100p 참고
ctrl + F2 새로고침
핸드폰 모양 클릭 > 모듈 함수 찾기
> GetDlgItemTextA에서 오른쪽 마우스 클릭 > 디스어셈블러에서 따라가기
> 이 함수에서 중단점, F4 > 암호치는 란까지만 실행되고 멈춤 > 암호치고 확인 > 아무데나 클릭 > F8
> 이래야 incorrect가 안뜨고 한줄씩 내려가짐
+) getDigItemTextA
> text를 쓰는 란
+) 순서
시작 두번째 자리 찾기
세번째 네번째 찾기
한자리씩 반복
마지막 첫번째 자리 찾기
1. abcde

> cmp > esp+5인 값과 61에 있는 값을 비교
> jne > 맞지 않으면 파란선으로 점프
> 맞으면 그대로 진행
> 꺾여서 빨간선으로 내려옴

> 빨간선으로 꺾어서 내려오면 incorrect password라는 메세지 박스가 뜨도록 한다
> 두번째 자리는 b가 아니다
2. bacde
> 그냥 내려감
> 두번째 자리가 a다
> 내려가다보니 push2 > 3번째 자리를 나타냄
> 옆을 보니 5y가 있다
> 아스키코드가 5y > 5y와 비교하고 있는 문이 나온다
3. ?a5y???
> 그 아래에 있는 jne가 그냥 넘어감
> ?a5y?? 가 된거임
> 옆을 보니 R3versing이 있음
> R3versing의 아스키코드도 코드에 있음
4. ?a5yR3versing
> R3versing은 반복문을 통해서 문자 하나하나를 비교해가고 있다
> 문자 하나가 비교가 끝나면 문자를 하나씩 빼주면서 비교한다
> 반복문은 지정해준 범위까지 반복하기 때문에 내려가다가 다시 올라가는 어셈블리어를 갖고있음
> 내려가다보면 첫째 짜리 E와 비교하는 문이 나온다
> E의 아스키 코드
5. Ea5yR3versing
> 끝까지 내려가진다
> MessageBoxA를 만나면 성공했다는 메세지가 나옴
#P7.exe
간단하게 코드를 짜고 어셈블리어로 번역 > 이해
#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char *argv[]) {
int a;
int b;
int c;
a=15;
b=16;
printf("before if statement\n");
if(a>b) c=100;
else c=200;
printf("after if statement\n");
printf("%d",c);
return 0;
}
1. 코드분석
mov dword ptr ss: [esp+18], F
> 아스키코드 F가 15, 15을 esp+18에 저장
mov dword ptr ss:[esp+14], 10
> 아스키코드 10이 16, 16을 esp+14에 저장
mov dword ptr ss:[esp], p7.404000
> 0x00404000를 esp에 저장 > 16진수가 before if statement
call <JMP.&puts>
> puts 함수를 호출 > 스택에 저장한 문자열 before if statement가 출력된다
mov eax, dword ptr ss:[esp+18]
> esp+18에 저장된 값을 eax 레지스터에 로드
> 15가 eax로 이동
cmp eax, dword ptr ss:[esp+14]
> eax 값 15와 esp + 0x14 저장된 16을 비교한다
> eax가 16보다 작다는 결과값이 나오게 된다
jle p7.40153E
> eax가 esp+14보다 작거나 같다면 점프해라
> 점프하게됨
mov dword ptr ss:[esp+1C], C8
> esp+1C 위치에 C8인 200을 저장해라
mov dword ptr ss:[esp], p7.404014
> esp가 가리키는 주소에 404014 값을 저장 > 16진수가 after if statement
call <JMP.&puts> > after if statement이 출력됨
mov eax, dword ptr ss:[esp+1C]
> esp+1C에 저장된 값을 eax 레지스터로 가져옴
> 지금 상황에서는 200을 가져오게됨
mov dword ptr ss:[esp+4], eax
> eax값을 esp+4 주소에 저장 > 스택에 저장해서 후속작업에 사용
mov dword ptr ss:[esp], p7.404027
> esp가 가리키는 주소에 404027 값을 저장 > %d
call <JMP.&printf>
> printf 함수를 호출
> %d라는 형식 지정자를 사용해서 eax에 저장된 값을 출력
2. 요약
1. esp + 0x18과 esp + 0x14에 각각 값 F와 16을 저장합니다.
2. esp에 "before if statement"라는 문자열 주소를 저장하고 puts를 호출하여 이를 출력합니다.
3. eax에 esp + 0x18의 값을 로드하고, 이를 esp + 0x14와 비교합니다.
4. 조건이 만족되면 값 64 또는 200을 esp + 0x1C에 저장하고, "after if statement"라는 문자열을 출력합니다.
5. eax에 저장된 값을 printf로 출력합니다.