[CVE-2017-8759]


http://www.cvedetails.com/cve/CVE-2017-8759/


Microsoft .NET Framework 2.0, 3.5, 3.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2 and 4.7 allow an attacker to execute code remotely via a malicious document or application, aka ".NET Framework Remote Code Execution Vulnerability."


- 문제점

  . WSDL 에 문제점 존재

  . word 문서내 macro 가 txt 파일을 다운로드 하고. WSDL parser 가 txt 를 읽을때 임의 코드가 실행될수 있다.


https://github.com/bhdresh/CVE-2017-8759



버퍼오버플로우 보호 해제 옵션

-fno-stack-protector -z execstack



 . -fno-stack-protector : stack 오버플로우시 dummy value 가 들어간다

 . -z execstack : stack 영역을 실행가능하도록 한다. (default - no executable )

       Data Execution Prevention (DEP)


 . 우회방법 :  ROP (Return Oriented Programming)



kernel 랜덤주소 해제 : Address space layout randomization (ASLR)

sudo echo 0 > /proc/sys/kernel/randomize_va_space


 - randomize_va_space 가 0 인 경우 기능 해제

 - 2 인 경우 on ( default : 2 )


References

. http://www.madhur.co.in/blog/2011/08/06/protbufferoverflow.html

문제 : MATCHORDER 출전순서 정하기

https://algospot.com/judge/problem/read/MATCHORDER


접근방법

 - 방법

  상대방 각 출전 선수에 대해 가장 적은 차이로 이기는 경우를 구한다.

시간복잡도 : 러시아 선수(N) X 한국 선수(N)


-방법

 정렬한후 Merge Sort 방법으로 비교한다

시간복잡도 : 정렬에 드는 시간 + 각 비교 (N)




본 내용은 USB메모리에 다양한 LiveOS 를 넣는 법을 설명한다.

이 내용이 궁금해서 읽는 사람은 대충 어느정도 실력이 있다고 생각되므로
자세한 설명은 생략합니다.

먼저 USB메모리를 준비한다.

본인은 8GB를 사용하였다.

1) 포멧이 되어 있는 USB라도 HP USB Format Tool 을 이용하여 포맷을 한다.
포맷할때 시동디스크로 설정을 해야 나중에 USB로 부팅가능하게 된다.

2) Grub4Dos를 다운 받는다.
Grub4Dos를 USB에 설치하기 위해 여러가지 도구가 있는데 본인은
WinGrub을 사용하여 설치하였다. 하지만 MultiBootUSB 프로그램을 사용하면 필요없다.

3) MultiBootUSB프로그램을 이용하면 LiveCD iso만 있으면 알아서 만들어준다. 끝.

4) MultiBootUSB 는 grub 을 이용하고 USB안에 multibootusb/syslinux.cfg 파일이 menu.lst 라고 생각하면 된다.

하지만, Chrome OS Linux 는 이 방법으로 설치가 되지 않으니....
본인이 반나절 동안 삽질한 끝에 알아낸 방법이니...
(기존에 있는 방법들은 raw 데이터를 USB에 직접 쓰는 방식이기 때문에 Windows에서는 인식이 되지 않는다.)

syslinux.cfg 에

label chromeOS
MENU LABEL chromeos
kernel /chromeos/boot/i386/loader/linux
append initrd=/chromeos/boot/i386/loader/initrd.img ramdis_size=512000 ramdisk_blocksize=4096 splash=silent showopts kiwidebug=1

추가한다.

chrome os linux iso에 들어있는 파일중 /boot/i386/loader 를 USB폴더에 복사한다.

여기까지는 SUSE usb 부팅 관련 사이트를 뒤져보면 구할수 있다.

문제는 initrd 파일인데 initrd.img는 본인이 직접 수정한 이미지이다.

SUSE 포럼에서 initrdud 파일을 구해서 include 파일을 보고 재수정하였다.

여기에 올리기에는 용량이 많으니 include 파일과 init 파일만 올립니다.



이 파일만 수정한뒤 이미지를 다시 만들어서 USB에 넣은 다음

chrome os에 들어있는 config.isolinux 파일과 Chrome_OS_Linux-read-only.i686-1.7.932 파일을 USB최상위에 저장한다.

그리고 부팅하면 USB로 크롬 OS가 부팅된다...

하지만, 그냥 SUSE 에 크롬 브라우저 하나 달랑 있는 느낌??이랄까...

initrd 파일 푸는법:
cp initrd initrd.img.gz
gzip -d initrd.img.gz
cpio -i --make-directories < initrd.img

파일 만든는 법
find . | cpio -o -c |gzip -9 > ../initrd-custom.img

저번에 배웠던 MessageBox 코드 삽입을 이용해서 이번에는 기본 프로그램인 노트패드를 이용해 보자.

테스트 환경은 Windows 7 SP1에서 테스트 하였다.

윈도우7에서는 기본적으로 ASLR을 사용하므로 기본 베이스 주소가 랜덤하게 바뀐다. 그렇기 때문에 일단, 이 옵션을 제거하고 시작한다. 제거하는 방법은 http://www.reversecore.com/69 여기를 참고하였다.


노트패드의 원본 DLL Characteristics 값은 8140이다. 이 값을 8100 으로 만들어 줘야 ASLR 기능을 끌 수 있다.

Hex Editor를 이용해서 파일 오프셋 13E 위치에서 8140 값을 8100으로 바꿔주면 된다.

그다음 Impoart Address Table을 참고해서 MessageBox 주소를 얻으면 된다.


MessabeBox 함수는 USER32.dll 에 있고 user32.dll 이 로드되는 메모리의 위치는 11A8이 된다. 노트패드의 ImageBase 주소는
0x01000000 가 되므로 user32.dll 이 로드되는 위치는 0x010011A8 이 된다.

user32.dll 의 맨 첫번째 함수는 SetActiveWindow 의 파일 오프셋 주소는 5A8이 되고, MessageBoxW의 파일오프셋은 668이다.

이걸로 계산해보면 MessageBoxW의 위치는 0x01001268 이 된다는 것을 알 수 있다. MessageBoxW함수는 유니코드를 입력받는 함수이므로 텍스트 문자열을 유니코드로 맞춰줘야 한다. 유니코드로 만든 문자열을 추가하고 앞서 소개했던 코드를 넣으면 메모장이 실행되기 전에 먼저 원하는 메세지 박스를 먼저 띄울 수 있다.



컴퓨터 바이러스란 의미가 요즘은 악성코드 혹은 시스템을 파괴하는 형태로 쓰여지고 있다. 근데 왜 바이러스라고 부를까...

초창기 바이러스 프로그램은 실제 의학에서 쓰는 바이러스 용어처럼 숙주가 없인 살수 없고 숙주 프로그램에 묻어서 실행되는 코드를 의미한다. 즉, 원래의 실행 파일에 바이러스 코드가 삽입되서 실행된 후, 원래의 코드로 다시 점프해서 바이러스 자신을 숨길 수 있다. 이런 바이러스 코드들은 어셈블러와 OS 로더 구조를 조금만 이해하면 금방 짤 수 있다.

이번 시간에는, 실제 바이러스코드가 아닌 원래의 프로그램에 원하는 코드를 넣어 실행한 후 오리지널 프로그램으로 점프하는 방법을 소개한다.

테스트는 Windows 7 SP1 에서 테스트 되었으며, 프로그램은 비주얼 스튜디오 2008 SP1 에서 컴파일 되었다.

1. 간단한 메세지 박스 출력 프로그램
MessageBox 함수를 이용하여 Hello, World를 출력하는 간단한 프로그램을 만들어 보자.

#pragma comment(linker,"/ENTRY:main /FILEALIGN:0x200 /MERGE:.data=.text /MERGE:.rdata=.text /SECTION:.text,EWR /IGNORE:4078")
#include 
int main(int argc, char *argv[])
{
    MessageBox(NULL, "Hello, World", "waintman.tistory.com", MB_OK);
    ExitProcess(0);
}

링커 옵션은 분석을 쉽게 하기위해 텍스트 영역과 데이터 영역을 통합하기위해 사용되었다.
프로그램을 실행하면 "Hello, World" 를 출력하는 메세지 박스가 뜬다.

코드를 분석하기 위해 올리디버거를 이용한다.

올리디비거로 위에서 만든 프로그램을 열어보면, 아래 그림과 같다.


윈도우7 비주얼 스튜디오 2008에서 컴파일시 기본적으로 ASLR(Address Space Layout Randomization)을 지원한다. 즉 실행될 때마다 ImageBase 값이 바뀌게 된다. 그렇기 때문에 비주얼 스튜디오에서 이 옵션을 해제한다.
(참고 사이트: http://www.reversecore.com/69)


올리디버거로 분석한 코드를 살펴보면,
MessageBox 함수는 4개의 파라미터를 입력받으므로 4개의 파라메터들을 스택에 push 한다. 스트링의 경우 0x00401018,
0x00401030에 있는 값들을 넣게 된다. 그리고 MessageBox 함수는 0x00401080에 적혀있는 주소값이 된다.

PE 헤더의 Import Address Table 을 분석하면 0x00401080에 MessageBox 함수의 주소를 적는다는 것을 알 수 있다.

이제, "virus" 라는 메세지 창을 띄우는 코드를 삽입하면 된다. 일단 메세지 박스 함수의 주소는 0x00401080이란 것을 알아내었으니, "virus" 란 글자를 데이터 영역에 쓰기만 하면 된다. 문자열은 텍스트 영역중에서 0x00401060부터 쓰고 그 뒤에 MessageBox를 실행하는 코드도 같이 적어준다. 메모리 영역 0x00401060의 주소는 파일 오프셋 0x00000260dp 에 위치한다. 파일 오프셋을 얻는 방법은 PEview 나 직접 PE 포맷을 분석하면 얻을 수 있다.

삽입된 코드는 다음과 같다.



원래의 OEP로 가기 위해 mov eax, 0x00401040; jmp eax 를 사용하였다. 그리고 PE 헤더의 AddressOfEntry 값을 0x00401066으로 고친뒤, 실행하면 virus 메세지 박스가 먼저 실행되고, Hello, World가 나오는 것을 확인할 수 있다.

이런과정을, 프로그램을 통해서 직접 수정하게 되면 기본 바이러스 프로그램을 만들 수 있을 것이다.

Hello, World 출력 Shellcode

printf를 이용하여 콘솔에 Hello, World를 출력하는 프로그램은 쉽게 짤 수 있다.


#include 
int main()
{
    printf("Hello, World");
    return 0;
}

windows 시스템에서 printf 함수는 msvcrt.dll에 포함되어 있다. Shellcode를 만들기 위해서 해당라이브러리를 로딩하는 코드를 작성해야 한다. 라이브러리 로딩함수는 LoadLibrary함수를 사용하고, 이 함수는 kernel32.dll에서는 LoadLibraryA로 정의되어 있다.

kernel32.dll은 따로 로딩할 필요가 없으므로, kernel32.dll에 있는 LoadLibraryA위치를 찾으면 된다.

함수의 위치를 찾는 코드는 다음과 같다.

#include 
#include 

/***************************************
arwin - win32 address resolution program
by steve hanna v.01
   vividmachines.com
   shanna@uiuc.edu
you are free to modify this code
but please attribute me if you
change the code. bugfixes & additions
are welcome please email me!
to compile:
you will need a win32 compiler with
the win32 SDK

this program finds the absolute address
of a function in a specified DLL.
happy shellcoding!
***************************************/


int main(int argc, char** argv)
{
        HMODULE hmod_libname;
        FARPROC fprc_func;
        
        printf("arwin - win32 address resolution program - by steve hanna - v.01n");
        if(argc < 3)
        {
                printf("%s  n",argv[0]);
                exit(-1);
        }

        hmod_libname = LoadLibrary(argv[1]);
        if(hmod_libname == NULL)
        {
                printf("Error: could not load library!n");
                exit(-1);
        }
        fprc_func = GetProcAddress(hmod_libname,argv[2]);
        
        if(fprc_func == NULL)
        {
                printf("Error: could find the function in the library!n");
                exit(-1);
        }
        printf("%s is located at 0x%08x in %sn",argv[2],(unsigned int)fprc_func,argv[1]);


}


위 코드로 얻은 kernel32.dll에 있는 LoadLibraryA의 주소는 0x771d395c 이다.
LoadLibraryA 함수는 로드할 dll을 매개변수로 받으므로, 어셈블 코드에서는 이름을 스택에 넣어주면 된다.

같은 방식으로 msvcrt.dll 에 있는 printf함수의 주소를 찾고 어셈블로 콜하면 된다.

콘솔 프로그램은 exit함수를 호출해야 정상 종료가 되므로, msvcrt.dll 에 있는 exit함수의 주소를 찾아서 콜해주면 Hello, World용 어셈블 코드를 얻을 수 있다.

[SECTION .text]

global _start

_start:

	xor eax, eax
	xor ebx, ebx
	xor ecx, ecx
	xor edx, edx
	jmp short GetLibrary
LibraryReturn:
	pop ecx
	mov [ecx + 10], dl
	mov ebx, 0x771d395c
	push ecx
	call ebx

	jmp short PrintfFunc
PrintfFuncReturn:
	pop ecx
	xor edx, edx
	mov [ecx+12], dl
	push ecx
	mov ebx, 0x76c3c5b9
	call ebx
	xor eax,eax
	push eax			
	mov eax, 0x76c336aa 		;exitprocess(exitcode);
	call eax	

GetLibrary:
	call LibraryReturn
	db 'msvcrt.dllN'
		
		
		
PrintfFunc:
	call PrintfFuncReturn
	db 'Hello, WorldN'


이것을 nasm으로 컴파일하고 objdump를 이용하여 기계어 코드를 뽑아낸다. (cygwin에서 작업 혹은 Linux 시스템에서)


nasm -f elf hello.asm; ld -o hello hello.obj; objdump -d hello

objdump 결과


hello:     file format pei-i386

Disassembly of section .text:
00401000 <_start>:
  401000: 31 c0                 xor    %eax,%eax
  401002: 31 db                 xor    %ebx,%ebx
  401004: 31 c9                 xor    %ecx,%ecx
  401006: 31 d2                 xor    %edx,%edx
  401008: eb 26                 jmp    401030 <_start+0x30>
  40100a: 59                    pop    %ecx
  40100b: 88 51 0a              mov    %dl,0xa(%ecx)
  40100e: bb 5c 39 1d 77        mov    $0x771d395c,%ebx
  401013: 51                    push   %ecx
  401014: ff d3                 call   *%ebx
  401016: eb 28                 jmp    401040 <_start+0x40>
  401018: 59                    pop    %ecx
  401019: 31 d2                 xor    %edx,%edx
  40101b: 88 51 0c              mov    %dl,0xc(%ecx)
  40101e: 51                    push   %ecx
  40101f: bb b9 c5 c3 76        mov    $0x76c3c5b9,%ebx
  401024: ff d3                 call   *%ebx
  401026: 31 c0                 xor    %eax,%eax
  401028: 50                    push   %eax
  401029: b8 aa 36 c3 76        mov    $0x76c336aa,%eax
  40102e: ff d0                 call   *%eax
  401030: e8 d5 ff ff ff        call   40100a <_start+0xa>
  401035: 6d                    insl   (%dx),%es:(%edi)
  401036: 73 76                 jae    4010ae <__DTOR_LIST__+0x54>
  401038: 63 72 74              arpl   %si,0x74(%edx)
  40103b: 2e                    cs
  40103c: 64                    fs
  40103d: 6c                    insb   (%dx),%es:(%edi)
  40103e: 6c                    insb   (%dx),%es:(%edi)
  40103f: 4e                    dec    %esi
  401040: e8 d3 ff ff ff        call   401018 <_start+0x18>
  401045: 48                    dec    %eax
  401046: 65                    gs
  401047: 6c                    insb   (%dx),%es:(%edi)
  401048: 6c                    insb   (%dx),%es:(%edi)
  401049: 6f                    outsl  %ds:(%esi),(%dx)
  40104a: 2c 20                 sub    $0x20,%al
  40104c: 57                    push   %edi
  40104d: 6f                    outsl  %ds:(%esi),(%dx)
  40104e: 72 6c                 jb     4010bc <__DTOR_LIST__+0x62>
  401050: 64                    fs
  401051: 4e                    dec    %esi
00401052 <__CTOR_LIST__>:
  401052: ff                    (bad) 
  401053: ff                    (bad) 
  401054: ff                    (bad) 
  401055: ff 00                 incl   (%eax)
  401057: 00 00                 add    %al,(%eax)
 ...
0040105a <__DTOR_LIST__>:
  40105a: ff                    (bad) 
  40105b: ff                    (bad) 
  40105c: ff                    (bad) 
  40105d: ff 00                 incl   (%eax)
  40105f: 00 00                 add    %al,(%eax)
 ...

_start 부분만 16진수로 얻은 코드를 테스트 해보면 정상적으로 실행이 된다.

 char shellcode[] = "\x31\xc0\x31\xdb\x31\xc9\x31\xd2\xeb\x26\x59\x88\x51\x0a\xbb\x5c\x39\x1d\x77\x51\xff\xd3\xeb\x28\x59\x31\xd2\x88\x51\x0c\x51\xbb\xb9\xc5\xc3\x76\xff\xd3"
 			  "\x31\xc0\x50\xb8\xaa\x36\xc3\x76\xff\xd0\xe8\xd5\xff\xff\xff\x6d\x73\x76\x63\x72\x74\x2e\x64\x6c\x6c\x4e\xe8\xd3\xff\xff\xff"
 			  "\x48\x65\x6c\x6c\x6f\x2c\x20\x57\x6f\x72\x6c\x64\x4e";

int main(int argc, char **argv)
{
	int *code;
	code = (int *)shellcode;
	__asm {
		jmp code;
	}
	return 0;
}


[참고자료]
http://www.vividmachines.com/shellcode/shellcode.html

김용준 케스터가 멘트를 끝낸후 나오는 음악.

검색해보니 Alex band 의 Only One 만 나와있길래 직접 검색해봄.

귀에 들리는 노래가사로 검색했는데, 내 귀에는

awesome in your eyes 로 들려서 검색했는데, 찾아보니 ocean in your eyes 였군...

결정적인 키워드는 "struggles down" 이걸로 검색하니 나오는군...


Forever Yours - Alex band

You and I, what a wild ride
Feels good to hold you close
We survived through the turbulent highs
And the struggles down below

And now
I give myself to you now
Yeah, I give myself to you

It's the way that you love me
The way that you touch me
I'm forever yours
It's the way that you move me
You give yourself to me
I'm forever yours

On this day as we stand face to face
With the ocean in your eyes
And you say, "This is love, no more pain"
It's a reflection of our lives

And I do
Give myself to you, I do
Yeah, I give myself to you

It's the way that you love me
The way that you touch me
I'm forever yours
It's the way that you move me
You give yourself to me
I'm forever yours

And even if we lived
For a thousand years
Nothing, no one
Would come between us

When the waters rise
We will sail away
To some place
And start again

It's the way that you love me
The way that you touch me
I'm forever yours
It's the way that you move me
You give yourself to me
I'm forever yours

It's the way that you love me
The way that you touch me
I'm forever yours
It's the way that you move me
You give yourself to me

I give myself to you
I give myself to you
I give myself to you
I give myself to you

가사출처: http://www.xtralyrics.com/lyrics/forever_yours.aspx
--------------------------------------------------------------------------------

08-09 신한은행 프로리그 광안리 결승 온게임넷 엔딩 BGM

Daughtry - Life After You

Ten miles from town
And I just broke down
Spitting out smoke on the side of the road
I'm out here alone
Just trying to get home
To tell you I was wrong, but you already know
Believe me, I won't stop at nothing to see you
So I've started running

All that I'm after is a life full of laughter
As long as I'm laughing with you
And I think that all that still matter is love ever after
After all we've been through
'Cause I know there's no life after you

Last time we talked
The night that I walked
Burns like an iron in the back
Of my mind
I must have been high
To say you and I weren't meant to be
And just wasting my time
Oh why did I ever doubt you
You know I would die here without you

All that I'm after is a life full of laughter
As long as I'm laughing with you
And I think that all that still matter is love ever after
After all we've been through
'Cause I know there's no life after you

You and I, right or wrong
There's no other one
After this time spent alone
It's hard to believe
That a man could be so blind
Thinking about the better times
Must've been out of mind
So I'm running back to tell you

All that I'm after is a life full of laughter
As long as I'm laughing with you
Without you God knows what I'd do


All that I'm after is a life full of laughter
As long as I'm laughing with you
And I think that all that still matter is love ever after
After all we've been through
'Cause I know there's no life after you

가사출처 : http://www.elyricsworld.com/life_after_you_lyrics_daughtry.html

구글에서 하드디스크 windows 7 설치하는법을 찾아보면 방법들이 자세히 나와있다.

이런 방법들을 응용하면 꼭 windows 7 뿐만 아니라 부팅가능한 CD 이미지 파일만 있으면 언제든지 CD 가 아니더라도 하드디스크에 저장되어 있는 이미지 만으로 부팅이 가능하다.

원리는 간단하다. Windows XP 기준으로 설명을 한다.

윈도우 XP 의 부트로더는 기본적으로 SystemRoot 에 있는 boot.ini 를 참고로 한다.

boot.ini 는 처음에는 다음과 같이 되어 있을 것이다.
===================================================================================================
[boot loader]
timeout=10
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /fastdetect /usepmtimer /Execute
===================================================================================================

마지막 줄에 특정 프로그램 경로를 넣어주면 그 프로그램으로 실행할 수 있다.

여기에서는 grub 이라는 리눅스 부트로더를 이용하도록 한다.
grub 은 리눅스용 부트로더이지만 'grub4dos' 라는 윈도우용 프로그램이 있다.

grub4dos 에 있는 grldr 이라는 파일이 부트로더이다.


이 파일을 c:\ 에 다운받은 뒤,
boot.ini 마지막줄에
c:\grldr = "GRUB"
이라고 추가해주면 다음번 부팅시에 XP 와 GRUB 을 선택하는 메뉴가 나온다.

이 부트로더는 기본적으로 menu.lst 라는 파일을 참고한다.


menu.lst 의 기본 사용법은
title "선택항목 제목"

"find --set-root " 이 명령은 각 파티션별로 원하는 파일을 찾도록한다.
"chainloader"   이 명령은 원하는 파일로 부팅시키는 역할을 한다.
"map" 이 명령은 iso 파일등을 메모리에 로드할수 있다.
OS 이미지 같은 경우 이 명령을 써서 메모리에 로드 한뒤에 설치 할 수 있다.

ex)
title install XP
find --set-root /xp.iso
map /xp.iso (0xff) || map --mem /xp.iso (0xff)
map --hook
chainloader (0xff)

이렇게 하면 xp.iso 가 메모리에 올라간뒤 부팅한다.

iso 파일이 메모리 용량보다 클 경우는 하드디스크의 최상위 디렉토리에 파일을 풀면 된다.
가상 CD 로 iso 파일을 읽은뒤 xcopy 명령을 사용하여 옮기도록 한다.
ex)
xcopy f:*.* /e /h /y d:

find --set-root /bootmgr
chainloader /bootmgr

윈도우 7 과 같이 베타버전의 OS 는 dvd 에 구울 필요없이 하드디스크에 이미지를 풀어서 설치하면 훨씬 편하다.

이 방법을 이용하면 노턴 고스트도 하드디스크이미지로 부팅할 수 있게 된다.

+ Recent posts