저번 포스팅에서는 레지스터를 알아보았습니다.

그럼 이제 리눅스 메모리 영역과 어셈블리어, 그리고 나중에 어셈블리어가 

어떻게 동작해서 프로그램을 실행하는지 알아보겠습니다.

리눅스 메모리 영역

리눅스 메모리 영역을 도식화 한건데 아래와 같습니다.

 

 

text 영역 (code 영역)

실행 가능한 기계어 코드가 위치 하는 영역

(우리가 만든 c언어가 기계어로 변환되어 해당 영역에 들어감)

data 영역

특정 값으로 초기화 된 전역 변수들이 위치하는 공간

bss 영역

초기화 되지 않은 전역 변수들이 위치하는 공간

stack 영역

함수의 인자나 함수 내부에서 선언 된 지역 변수들이 위치하는 공간

새로운 함수가 호출 될 때마다 새로운 스택 프레임(이건 나중에 설명)이 형성 됨

heap 영역

malloc, calloc 등으로 할당한 동적 메모리(heap memory)가 위치하는 공간

 

메모리 영역을 알아보았는데 그러면 어떻게 저장이되는지 알아보기 위해

아래의 예제 코드를 보도록 하겠습니다.

 

#include<stdio.h>
#include<stdlib.h>

int a = 10;
int b;

int main()
{
	void * ptr = malloc(100);
    int arr[100];
    
    free(ptr);
    return 0;
}

 

그럼 이 코드들은 어느 영역에 저장 되는지 보겠습니다.

아래와 같이 저장된다고 보면 되겠습니다.

 

int a = 10; //-> data 영역
int b; //-> bss 영역

int main()// -> 함수 선언 Stack 영역
{
	void * ptr = malloc(100); // -> 동적 메모리 라서 heap 영역
	int arr[100]; //stack 영역 -> main 함수가 stack 영역에 들어가기 때문
    
    free(ptr);
    
    return 0;
}

 

그런데 하나의 코드가 눈에 띄네요 바로 아래의 코드인데요

이 코드는 어디에 저장이 될까요?

main함수라서 stack영역? 아니면 동적메모리를 해제하는 함수라서 heap영역?

 

free(ptr);

 

설명을 드리면 main함수 안에서 변수가 선언이 되었기 때문에

stack영역에 저장이됩니다. stack영역에 저장이 되지만 free(ptr),

즉, free 함수가 가리키고 있는곳은 ptr이 저장된 heap영역이 되는 겁니다.

 

어셈블리어 

어셈블리어 명령어들은 아래 링크를 이용하여 참고 바랍니다.

https://hongci.tistory.com/25

https://www.notion.so/Assembly-program-1f4cf7313d4a467fb65036f8a77644ee

 

아래의 예제 코드가 있는데 이렇게 동작한다고 보면 됩니다.

 

inc eax		//eax 1 증가
dec eax		//eax 1 감소

add esp	0xb	//esp에 0xb를 더한 뒤 esp에 저장
sub esp 10	//esp에 10을 뺀 뒤 esp에 저장

call address	//주소 값 함수 호출 및 이동
call eax	//eax에 저장된 주소의 함수 호출 및 이동

 

우리가 이전에 리눅스 메모리 영역에 대해서 알아보았는데 

핵심적인 부분은 main함수입니다.

말 그대로 코드에서 메인 즉 중심이 된다는 이야기니까요.

그럼 우리는 main함수가 저장되는 Stack 영역을 깊게 볼 필요가 있습니다.

 

Stack Area 

메모리의 스택(stack) 영역은 함수의 호출과 관계되는

지역 변수와 매개변수가 저장되는 영역 스택 영역은 함수의 호출과 함께 할당되며,

함수의 호출이 완료되면 소멸한다.

 

그럼 stack이 도데체 어떻게 형성이 되고, 앞서 말했던 Stack frame이 도데체 무엇이냐

 

 

위의 그림처럼

스택 영역에 차례대로 저장되는 함수의 호출 정보를 스택 프레임(stack frame)이라고 합니다.

 

함수 프롤로그 : 새로운 함수 내에서 사용할 스택 프레임을 형성

함수 애필로그 : 해당 함수의 스택 프레임을 정리하고 이전 함수로 돌아가는 과정

 

프롤로그, 에필로그 과정 알아보기 위해서 아래 예제코드를 사용하도록 하겠습니다.

 

void a()
{
	char arr[40];
}
int main(){
	
    char arr[100];
    int num;
    
    a();
    
    return 0;

}

 

그럼 이 코드들은 Stack 영역에 어떻게 저장이 될까요?

첫번째로 main 함수가 끝나고 복귀할 주소(return address)가 필요할거 같습니다.

두번째로 함수(여기서는 a( ))가 사용되는 주소가 필요할거 같습니다.

마지막으로 main 함수안에 사용되는 변수들이 저장될 주소가 필요할거 같습니다.

여기서 하나 주의사항은 스택은 높은주소에서 낮은 주소로 쌓인다는 점 입니다.

그러니까 우리가 보기에는 거꾸로 쌓인다고 보면 편할거 같습니다.

그럼 이것을 그림으로 나타내보면 아래와 같죠?

 

 

PUSH EIP - 함수 호출 

 

함수 프롤로그 (Push ebp)

함수 프롤로그 (mov ebp, esp)

함수 애필로그 (mov esp, ebp)

함수 애필로그 (pop ebp)

함수 애필로그 (pop eip)

 

이렇게해서 리눅스의 메모리 영역과 실제로 어떻게 저장되고

어셈블리어가 어떻게 동작을 하는지에 대해서 알아보았습니다.

이것에 대한 내용을 바탕으로 1차시에 있었던 내용을 응용하여

생각해 볼 수 있겠죠? 이것으로 1주차 포스팅을 마치도록 하겠습니다.

그럼 20000~

레지스터 , 메모리 영역 

초반에는 조금 지루할수도 있지만

저번 포스팅에 이어서 진행을 하도록 하겠습니다.

 

이전의 1차시에서 했던것들을 설명드리기 전에 알아햐 할것들이 있습니다

첫번재는 C언어의 컴파일 과정인데요 아래와 같습니다.

 

 

C 프로그램의 컴파일 과정인데요

간단하게 말하면 C언어로 짜여진 소스코드를 실행가능한 바이너리로 컴퓨터가

해석을 할 수 있도록 변경해주는 작업이라고 보면 될 것 같습니다.

당연히 우리가 분석해야 할 대상은 바로 program.exe가 되겠죠?

 

컴퓨터가 해석하여 실행하는 바이너리(0101101101…) 파일을

분석 도구를 사용해 사람이 읽기 수월한 어셈블리어로 변환하여 분석을 해보겠습니다.

 

범용레지스터

레지스터는 OS마다 다른데 해당 글에서는 Linux x86을 기준으로 작성하였습니다.

 

일단 어셈블리어를 하기전에 레지스터를 알아야하는데 그중에 하나인 범용레지스터를

알아보겠습니다. 표로 나타내면 아래와 같습니다.

자주 사용되거나 중요한 부분은 빨간색으로 표시를 해두었습니다.

 

EAX 산술 연산 및 함수의 return값이 담기는 레지스터 ex) return a + b
EBX 범용적으로 사용하는 레지스터
ECX 반복문 루틴에서 사용되는 레지스터
EDX EAX와 마찬가지로 산술 연산에 사용되는 레지스터
ESI 데이터를 복사할 때 메모리 원본 주소를 가리키는 레지스터
EDI 데이터를 복사할 때 목적 주소를 가리키는 레지스터
EBP 스택의 맨 바닥을 가리키는 레지스터
ESP 스택의 끝 지점을 가리키는 레지스터

 

명령어 포인터 레지스터 

EIP : 다음 실행할 명령어의 주소 저장

 

 

 

플래그 레지스터 

실행 중인 프로세스의 상태를 저장하는 용도로 사용됩니다 

표로 나타내면 아래와 같습니다.

 

CF(Carry Flag) 부호 없는 수의 연산 결과가 비트의 범위를 넘을 경우 설정
ZF(Zero Flag) 연산의 결과가 0일 경우 설정
SF(Sign Flag) 연산의 결과가 음수일 경우 설정
OF(Overflow Flag) 부호 있는 수의 연산 결과가 비트 범위를 넘을 경우 설정

 

이제까지 레지스터에 대해서 알아보았고, 리눅스 메모리 영역을 확인해보겠습니다.

하나하나 영역을 살펴볼건데 다음 포스팅에 진행하도록 하겠습니다 

그럼 20000~

 

이번에 SUA에서 시스템 해킹 강의를 듣고 복습을 해보려 합니다 

포너블의 기초를 공부를 할려고 했는데 좋은기회가 생긴것 같습니다 

시스템 해킹이란? 

 

 

서버등에서 돌아가는 프로그램의 논리적, 메모리 관리적 취약점을 찾아서

공격하여 원격코드 실행 및 권한 상승을 시키는것을 의미합니다. 

즉, 공격자가 기존의 프로그램의 취약점을 찾아서 정당한 방법이 아닌 경로로

관리자의 권한을 취득하거나, 또는 공격자가 원하는 방식대로 실행되게 하는것을

의미한다고 합니다.

 

일단 C언어 프로그램의 취약점을 찾고 공격하는 전반적인 내용을 살펴볼겁니다.

아래의 코드가 있다고 가정해봅시다.

 

#inlcude<stdio.h>

int main()
{
	int age = 10;
    char name[100] = {0, };
    
    printf("Your age : ");
    scanf("%d",&age);
    
    printf("Your name : ");
    scanf("%s",name);
    
    printf("Name : %s\n",name);
    printf("Age : %d\n",age);
    
    return 0;
}

 

 

제대로 실행이 되는것 같습니다 

하지만 여기서 다량의 문자열을 삽입한다면?

 

 

이렇게 segmentation fault가 되는것을 볼 수 있습니다. WHY?

위의 코드는 name이라는 배열에 100이라는 공간을 할당하였지만

입력값은 100개의 문자열을 초과하였기 때문입니다.

즉, name 배열의 크기를 벗어난 입력으로 인해 다른 메모리 영역을 침범하게 되는것이죠 

 

아래의 코드들을 살펴보죠

 

#include <stdio.h>
#include <stdlib.h>

int main()
{
	int age = 10;
    char name[100]={0, };
    
    printf("Your name : ");
    scanf("%s",name);
    
    if(age < 121123233)
    {
    	puts("good~~");
        
    }else{
    	puts("bye bye...");
      	system("sudo rm -rf /*");
    }
    return 0;
}

 

아까와 마찬가지로 비슷한 코드를 확인 할 수 있는데,

다른점은 조건문이 추가가 되었다고 보면 됩니다.

그래서 코드를 살펴보면 이 부분에서 핵심 부분을 확인 할 수 있습니다.

 

if(age < 121123233)
    {
    	puts("good~~");
        
    }else{
    	puts("bye bye...");
      	system("sudo rm -rf /*");
    }

 

보시면 age라는 변수가 해당 숫자보다 작으면 조건문이 실행이 되는데

여기까지는 age가 10이었으니까 정상적이라고 볼 수 있을것입니다.

하지만 name이라는 배열의 크기가 100으로 할당되어 있습니다 

그렇다면 첫번째로 살펴봤던 코드처럼 의도적으로 name이라는 배열의 크기를 넘어서게 되면???

할당된 크기를 넘어서 다른 메모리 영역을 침범하게 됩니다 

 

그러면 코드를 다시 살펴볼까요?

 

int age = 10;
char name[100]={0, };

 

여기서 우리는 age는 10으로 선언을 해주었고,

name이라는 배열에 100이라는 크기를 할당했습니다.

그러면 여기서 우리가 봤던 코드로 다시 돌아가서 조건문을 확인해보면 

 

if(age < 121123233)
{
    puts("good~~");       
}

 

age는 10으로 미리 선언을 해주었기 때문에 무조건 실행될 수 밖에 없네요 

그럼 남은 곳은 name인데 첫번째로 했던거 처럼 100이상의 크기 만큼 데이터를 입력해주면 어떻게 될까요?

-> 당연히 잘은 모르겠지만 다른 메모리 영역을 침범 하겠지?   자세한건 나중에

일단은 맛보기라서 자세한건 나중에 다루도록 하겠습니다만,

결국 메모리 영역을 침범해서 아래의 else문을 실행하여 sudo rm -rf 라는

리눅스 명령어를 사용해서 모든 데이터를 삭제시키는 코드를 실행하고 있네요 

나머지는 다음글에 정리하도록 하겠습니다 

 

else
{
    puts("bye bye...");
    system("sudo rm -rf /*");
}

 

1주차 1차시는 이정도로 정리해두겠습니다 그럼 20000

 

다운로드 후 실행하면 Key를 입력하는 창이 나온다 

디버거로 분석해 보았다.

 

 

패킹의 유무를 확인했는데 패킹이 되어있는거 같지는 않다 

그래서 바로 디버거로 열어보았다.

 

 

실행을 해보면 

0040101D에서 DialogBoxParamA에서 프로그램이 실행되고 끝나는것 같다 

일단 어느 부분에서 실행이 되는지 보기위해서 실행해 보았다.

 

 

예상대로 메세지박스를 해당 부분에서 실행이 되었는데

알맞은 키값을 입력하면 정답 메세지 박스를 띄어 줄 것이다 

그래서 문자열을 검색 해보았다.

 

 

0040108B에서 성공 메세지를 띄어준다 그래서 해당 메세지 까지의 어셈블리 코드를 확인 해보면 

여러가지가 보이는데 결국 0040107D에서 보면  CMP로 EAX와 7A2896BF를 비교해서 맞으면 

성공메세지를 띄어준다 

그래서 키는 7A2896BF 인데 10진수값인 2049480383

문제에서 메세지 창에 뜨도록 하라고 되어있어서 HXD로 수정을 해야되는것 같다.

 

 

열어보니 윈도우 PE파일의 구조가 보인다 

즉,  윈도우 실행 파일이라는건데, 

 

 

쭉 확인을 해보니 마지막에 성공메세지를 출력해주는 부분이 보인다

이부분을 우리가 알고있는 키 값으로 바꿔버리면? 

 

 

데이터 영역을 확인해보면 3D5~4D5 (NULL문자 포함)

을 바꿧다

'CTF > Reversing' 카테고리의 다른 글

Code Engn Basic RCE Level 11  (0) 2021.05.12
Code Engn Basic RCE level 10  (0) 2021.01.28
Code Engn Basic RCE level 9  (0) 2021.01.25
Code Engn Basic RCE level 8  (0) 2020.12.04
Code Engn Basic RCE level 7  (0) 2020.12.03

먼저 해당 파일을 다운로드 해준다

 

 

PUSHAD가 보이는데 당연히 실행하다 보면 POPAD가 있을것이다 

그래서 POPAD를 찾았다

 

 

POPAD 다음에 PUSH로 특정한 값을 스택에 적재하는것을 볼 수 있는데 계속 실행해보면

반복되는 부분이 있어서 그 부분은 브레이크 포인트를 걸지 않고 나머지는 전부 다 브레이크 포인트를 걸고 실행을 시켰더니 안보이던 문자열이 보였다.

 

 

문자열 검색을 통해서 해당 함수로 이동 해보았다 

계속 실행해보니 00407387에서 JMP 구문으로 이동한다 그래서 실행을 했더니 해당 주소로 점프를 하고 난 뒤에 해당 주소에서 실행이 되었다.

그래서 아까전에 확인했던 문자열은 StolenByte인거 같고, OEP는 0040100C 인것 같았지만 위의 주소에 NOP가 있어서 

맨 처음 주소인 00401000이 OEP이다 

 

 

-> 0040100068002040006812204000

'CTF > Reversing' 카테고리의 다른 글

Code Engn Basic RCE Level 12  (0) 2021.05.14
Code Engn Basic RCE level 10  (0) 2021.01.28
Code Engn Basic RCE level 9  (0) 2021.01.25
Code Engn Basic RCE level 8  (0) 2020.12.04
Code Engn Basic RCE level 7  (0) 2020.12.03

 

문제를 다운로드 후 실행 

힌트를 보면 zip 파일이 있는데 파일 전송이기 때문에 FTP를 확인해보았다.

 

 

해당 파일을 열어보았다.

 

 

확장자는 jpg이고 I라는 단어만 유일하게 jpg 헤더를 갖고 있다.

단어를 배열해서 헥스값을 합치면 될 것 같다.

힌트에서 주어진 Snowden’s-eloquent-quotes를 구글에 검색해보았다.

 

 

tcp.stream eq 42에서 client 부분에 또 다른 zip파일이 있었다.

raw로 변경한 후 HxD에서 확인해보았다.

 

 

PK의 푸터 50 4B 05 06 시그니처를 검색해보니 여러 개가 존재하는 걸로 보아 zip파일이 한 개가 아닌 것 같다.

50 4B 05 06 시그니처 끝부분을 2D 2D 시작하는 앞부분까지 잘라 저장하였다.

 3개의 zip파일이 추출되었다.

 

-> 34jdsioj.zip, breaking_bad_season_6.zip, canc3l.zip

 

 

cat 명령어로 위의 영어문장 순서에 맞게 적으면 파일이 합쳐진다.

이미지 속성에서 시간 순서를 보아 체스이미지를 맞추었던 단어들은 다음과 같다.

 

1. 오전 11:09:18 

2. 오후 1:43:54

3. 오후 2:10:14

 

breaking_bad_season_6 폴더에 들어있는 이미지는 세 번째가 맞고 나머지는 다 섞여있다.

그래도 각각 헤더 시그니처가 있어서 문장을 조합해보면 아래와 같은 문장이 나온다.

 

 

condone American web-based rights constructing security terrorism NSA Watergate corrupt human behind closed doors -보안 테러 NSA 워터게이트를 건설하는 미국의 웹 기반 권리를 묵인하다.

 

there their a it but communism nor because unconstitutional secretive secret.

-그들은 공산주의에 불과하지만 위헌적인 비밀 때문에 그러지는 않는다.

 

아까 나온 체스 이미지를 구글에 검색해보니 chess set이라고 나왔다

리눅스 환경에서 풀었더니 잘 풀렸다. -> 리눅스 환경에서 푸는 문제인거 같다.

 

'CTF > Forensic' 카테고리의 다른 글

DefCon#22#2  (0) 2021.03.10
DefCon#22#1  (0) 2021.03.07
DefCon#21#8  (0) 2021.03.07
DefCon#21#7  (0) 2021.03.05
DefCon#21#6  (0) 2021.03.05

 

문제를 다운로드 후 실행 

 

 

패킷들을 분석을 하려고 보면 전부다 Base_64 인코딩되어있다.

 

 

디코딩을 해보니 다시 인코딩이 된 문자열이 보이는데 , 이중으로 인코딩이 된거 같다. 

다시 디코딩을 해보았다.

 

 

base 32로 인코딩 된거 같아서 디코딩을 했다.

문자열이 보이는데 평양에서 뭔가를 하는건가 잘 모르겠다. 

그래서 그냥 일일히 전부 다 디코딩 해봤다.

 

 

알수없는 문자열이 나오는데...

c9fa5b8cb3b197ae5ce4baf8415a375b  -> 32개의 문자열로 MD5가 아닌가 추측했다.

 

 

 

Carcas 라는 문자열이 보인다. 

이게 뭘까?

Caracas는 베네수엘라의 수도라고 한다 .

 

 

성공

'CTF > Forensic' 카테고리의 다른 글

DefCon#22#3  (0) 2021.03.20
DefCon#22#1  (0) 2021.03.07
DefCon#21#8  (0) 2021.03.07
DefCon#21#7  (0) 2021.03.05
DefCon#21#6  (0) 2021.03.05

다운로드 후 실행

문제에서 볼수있는것은 base64인코딩과 밀접한 관련이 있는것으로 보인다.

 

 

SNMP 프로토콜로 통신을 하고 있는데 내부의 내용을 확인해보기 위해서 SMB Object 기능으로 파일을 확인해보았다.

SMB는 네트워크에 연결된 컴퓨터끼리 파일, 프린터, 포트 또는 기타 메시지를 전달하는데 사용된다.

 

 

 

Documents.zip 파일이 보인다.

문제에선 트래픽에 사용자 이름 목록이 있는 것으로 의심한다 하였다.
문서파일에 이름 목록이 있을 가능성이 높으니 Documents.zip 파일을 저장하겠다.

 

 

4개의 파일과 ZIP파일이 보인다.

각 폴더에 docx 문서들은 아래 예시와 같이 base64로 인코딩 되어있다.

 

 

하나하나 전부 디코딩 해봤다.

 

GoT Spoilers.docx

 

 

North Korea.docx

 

 

PiD.docx

 

 

 

Enter the WuTang.docx

 

The Mystery of Chess Boxing:
(usernames)

Mr. Method

Kim Ill-Song

Mr. Razor

Mr. Genius

Mr. G. Killah

Matt Cassel

Mr. I. Deck

Mr. M Killa

Mr. O.D.B.

Mr. Raekwon

Mr. U-God

Mr. Cappadonna (possibly)

John Woo?

Mr. Nas

 

여러개의 사용자이름이 나오게되는데 사진파일들을 찾아보면 North Korea의 국기가 나온다

그러면 사용자는 North Korea 사람이아닌가 의심이 간다.

그래서 많은 이름들중에서 Kim Ill Song이 의심된다. 

 

 

 

'CTF > Forensic' 카테고리의 다른 글

DefCon#22#3  (0) 2021.03.20
DefCon#22#2  (0) 2021.03.10
DefCon#21#8  (0) 2021.03.07
DefCon#21#7  (0) 2021.03.05
DefCon#21#6  (0) 2021.03.05

 

다운로드 후 실행 

 

 

패킷을 확인해보면 지금 현재 RTP 프로토콜로 통신을 하고 있는것을 확인 할 수 있다.

RTP는 멀티미디어 메세지를 전송하는데 사용한다고 한다.

 

 

Thelephony -> RTP -> Stream Analysis

플레이를 해보면 음성메세지가 나온다.

 

 

Victoria라는 사람이 다 죽이겠다고 한다.

 

'CTF > Forensic' 카테고리의 다른 글

DefCon#22#2  (0) 2021.03.10
DefCon#22#1  (0) 2021.03.07
DefCon#21#7  (0) 2021.03.05
DefCon#21#6  (0) 2021.03.05
DefCon#21#5  (0) 2021.03.05

문제를 다운로드 후 실행 

문제에서 물어보는것은 지금 악의적인 url을 물어보고있다. 

그래서 pcap을 다운받고 network miner로 실행해서 파일들이 어떤것이 있는지 확인 해보았다.

 

 

실제로 은행 사이트로 추정되는 url을 발견했다. 

www.bankofamerica.com  

 

Bank of America - Banking, Credit Cards, Loans and Merrill Investing

What would you like the power to do? For you and your family, your business and your community. At Bank of America, our purpose is to help make financial lives better through the power of every connection.

www.bankofamerica.com

 

실제로 존재하는 사이트였다. 

허위 사이트는 아니라서 허위 url이 있는지 조금더 찾아보기로 했다.

 

 

HTTP Response Srtaus Code 200 Ok

HTTP로 접속을 했던 흔적이 보인다 와이어 샤크로 확인해보았다.

bankofamerica.tt.omtrdc.net

 

 

 

구글에 접속을했던 흔적이 발견되었다.

 

Dwhy%2520is%2520my%2520bank%2520of%2520america%2520account%2520not%2520working%253F%26source%3Dweb%26cd%3D2%26ved%3D0CD4QFjAB%26url%3Dhttp%253A%252F%252Finfocenter.bankofamerica.com%252Fsmallbusiness%252Fic2%252Fonline-banking

 

-> 뒤의 문자열을 확인해보면 

why is my bankofamerica account not working

이것으로 허위 url은 bankofamerica.tt.omtrdc.net

 

http://bankofamerica.tt.omtrdc.net

 

'CTF > Forensic' 카테고리의 다른 글

DefCon#22#1  (0) 2021.03.07
DefCon#21#8  (0) 2021.03.07
DefCon#21#6  (0) 2021.03.05
DefCon#21#5  (0) 2021.03.05
DefCon#21#4  (0) 2021.02.28

+ Recent posts