본문 바로가기

Learning/└◆Reversing

reverse engineering / assembly language / computer structure 리버스 엔지니어링 여러분들은 크랙에 대해서 아는가? 크랙crack. 부수다 라고 해석할 수 있다. 부수다? 소프트웨어의 크랙은 본래의 내용을 부숴서 자기 마음대로 수정하는 것이라 할 수 있겠다. 그리고 크래킹의 세계에서 패치는 결국 크랙과 같은 의미로 쓰이고 있다. 크랙을 하기위해선 결국 궁극적으로 리버싱을 해야한다. 리버싱? 리버스reverse 뒤집힌 것이겠지. 정확한 뜻은 사전을 찾아보라. 리버싱은 리버스 엔지니어링을 하는 것을 일컫는다. 리버스 엔지니어링reverse engineering 역공학이라 해석한다. 완성되어진 실행파일 등을 분석해서 내부가 어떤식으로 수행되는지 분석하는 것을 역공학, 리버스 엔지니어링이라 할 수 있다. 그렇게 분석하여 우리가 원하는 대로 수정하는 작업이 크랙이자 패치가 되.. 더보기
15_Level15 -> Level16[FTZ] 루틴 분기 키값의 이해 2 ■ Level15 -> Level16 ■ 목적 루틴 분기 키값에 대한 이해 2 메모리 값을 바꾸는 것과 메모리에서 가리키는 주소의 값을 바꾸는 것에 대한 차이점 이해 ■ Level15 풀이 level8 사용자 로그인 -> ID/PASS : level15/guess what $ cat hint #include main() { int crap; /* crack 변수 선언 */ int *check; /* *check 포인터 변수 선언 */ char buf[20]; /* buf[20] 배열 선언 */ fgets(buf,45,stdin); /* 키보드로 입력받은 문자열을 buf[20]에 할당 */ if (*check==0xdeadbeef) /* check 포인터가 0xdeadbeef 문자열을 가리키는지 확인 */.. 더보기
14_Level14 -> Level15[FTZ] 루틴 분기 키값의 이해 ■ Level14 -> Level15 ■ 목적 루틴 분기 키값의 이해 루틴 분기 구문이 사용되는 예 소프트웨어를 설치할 때 시리얼 키(Serial Key)/라이센스 키(License Key) 입력 받는 부분 특정 값을 입력하면 프로그램이 실행이 되는 원리 (시디키 입력 -> 설치 진행) (원하는 값 입력 -> 쉘 권한) ■ Level14 풀이 level14 사용자 로그인 -> ID/PASS : level14/what that nigga want? $ cat hint 레벨14 이후로는 mainsource의 문제를 그대로 가져왔습니다. 버퍼 오버플로우, 포맷스트링을 학습하는데는 이 문제들이 최고의 효과를 가져다줍니다. #include #include main() { int crap; int check; ch.. 더보기
13_Level13 -> Level14[FTZ] 스택가드(스택 쉴드) 알아보기 ■ Level13 -> Level14 ■ 목적 스택 가드(Stack Guard)에 대해서 스택 가드(스택 쉘드) 버퍼 오버플로우는 정확하게 말하면 애플리케이션 개발자의 실수이다. 이런한 취약점을 보안하기 위해 나온 아이디어가 스택가드(Stack Guard)이다. 스택 가드에 저장돼 있는 값이 바뀌었다는 것은 버퍼 오버플로우 공격이 일어났다는 것을 의미하고, 스택가드의 변경이 확인되면 프로세스 실행을 차단해서 공격을 방어 할 수 있다. [메모리 구조] ----------------------------------------------- 256bytes 4bytes 4bytes 4bytes char str[256] stack guard SFP RET AAAA...AAAA AAAA AAAA (새로운주소) --.. 더보기
12_Level12 -> Level13[FTZ] gets함수의 취약점(Stack Buffer Overflow) ■ Level2 -> Level13 ■ 목적 버퍼 오버플로우에 대해서 BOF(Buffer Overflow) Stack Buffer Overflow(Stack BOF) Heap Buffer Overflow(Heap BOF) gets함수는 매우 위험한 함수이다. $ vi cmd.c #include #include #include int main(void) { char str[256]; char *ptr; int a; printf("Enter string : "); gets(str); printf("%s\n", str); } $ gcc -o cmd cmd.c /tmp/ccAhNMFS.o(.text+0x2e): In function `main': : the `gets' function is dangerous a.. 더보기
[참고] Format String 공격시 format string 공격시 ① 리턴 주소를 확인 특정 주소(0x8049610)를 어떤 주소로 바꾸어 하는지 확인(0xbffff858) -> 우리의 예는 소멸자의 주소(08049610)를 (0xbffff858) 주소로 변경하는 예를 들어 보자. ② "특정 주소/특정 주소 +2"를 지정한다. $ (공격할 프로그램) | $(printf "AAAA㉠주소BBBB㉡주소+2")%8x%8x%8x%㉢숫자1c%n%㉣숫자2c%n 공격할 프로그램 = /home/level11/attackme ㉠ 주소 = 특정 주소(\x10\x96\x04\x08) 특정한 주소를 지정한다. 우리의 예제에서는 소멸자의 주소이다. ㉡ 주소+2 = 특정 주소 + 2(\x12\x96\x04\x08) 특정한 주소를 지정한다. 우리의 예제에서는 소멸자.. 더보기
[참고] 쉘코드(ShellCode) 만드는 방법2 (2) 칼리리눅스의 payload 사용하여 쉘코드 만들기 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!! 다음 문서에서 KaliLinux 2.X 버전은 상단의 정보를 사용하세요 !!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ■ 사용시스템 - KaliLinux 다음과 같은 임의의 명령어를 수행할 수 있는 쉘코드를 만들어 보자. /bin/ls /bin/cal (on KaliLinux) ① msfpayload 명령어 사용법 확인 ■ (칼리리눅스 2.0) 아래와 같이 실습한다. # cd /test # msfvenom -.. 더보기
[참고] 쉘코드(ShellCode) 만드는 방법 쉘코드(shellcode) 만드는 방법 (1) 경량 쉘코드 만들기 쉘코드는 작게 만들수록 좋다. bufer를 메모리에 집어 넣을 때 크기가 작아야 한다. 함수의 return address를 임의의 주소로 조작할 경우 프로그램의 스택영역에서 특정코드를 실행시킬 수 있다. 이때, cracker의 관심을 끌어당기는 부분은 프로그램(application)이 user의 ID가 아닌 특정 ID,즉, Set-UID나 daemon으로 실행되고 있다는 사실일 것이다. 이런 종류의 실수가 document reader같은 프로그램에서 일어난다면 상당히 위험하다고 할 수 있다. shell을 실행시키는 이런 작은 프로그램들을 일반적으로 shellcode라고 부른다. /bin/bash/를 바이너리 형태로 실행 하는 것, 메모리에.. 더보기
[참고] FTZ LEVEL11 쉘코드 제작시 참고 /bin/sh & /bin//sh 비교 어셈블리어에서 문자열을 처리하는 단위는 4바이트이다. 하지만 "/bin/sh"는 7바이트 문자열이다. 8바이트의 문자열어서 다루는 것이 편리하기 때문에 "/" 문자를 하나 더 입력하고 8바이트 길이의 문자열로 인위적으로 만든것이다. 동작은 /bin/sh 와 /bin//sh는 동일하게 동작한다. 다루기 쉬운 문자열로 변경만 한것이다. /bin/sh(7바이트) == /bin//sh(8바이트) NULL처리 하기 복잡 /기호를 하나 더 적어 변환처리 없이 사용 (linux200) # ps PID TTY TIME CMD 14186 pts/1 00:00:00 bash # /bin/sh # ps PID TTY TIME CMD 14186 pts/1 00:00:00 bash 142.. 더보기
[참고] Format String이란 Format String 대해서 다음은 인터넷상의 글을 공부하면서, 다시 정리한 문서입니다. 인터넷에 글을 올려 모든 분들께 감사합니다. 되도록 원문의 내용을 변경하지 않는 상태로 실습용 예제만 편집하였습니다. 1. 포맷 스트링(Format String) 이란? => ret 또는 dtors값을 쉘코드의 주소 값으로 덮어 공격용 쉘을 실행 시키는 공격이다. (예제) test.c main() { char put[30]; printf("What your name: "); scanf("%s", put); printf("%s hello!\n", put); } 이러한 소스에서 %s의 역활은 입력받고 출력되는 변수의 Format를 지정하면서 나타나게된다. 포멧스트링의 종류에는 ----------------------.. 더보기
11_Level11 -> Level12[FTZ] 포맷스트링(Format string directive) 취약점 ■ Level11 -> Level12 ■ 목적 포맷스트링(Format String Bug)과 버퍼오버플로우(Buffer Over Flow) 포맷스트링(Format String)에 대해서 포맷 스트링 = 포맷 스트링 지시자(Format String Directive) 포맷스트링은 %d %x %.. printf에서 사용하는 지시자를 나타낸다. 포맷 스트링 버그/어택 특이한 포맷스트링 지시자를 사용하는 것 프로그래머가 코딩을 잘 못 했을 때 우선 포맷 스트링 지시자 가 무엇인지부터 알고 넘어가야 버퍼오버플로우에 대해서 접근할 수 있다. 2진수로 저장된 값을 우리가 인식할 수 있는 형태로 바꿔 주는 것이 printf() 함수와 같은 곳에 전달하는 포맷 스트링 인자이다. 특정한 형식으로 출력해보자. $ vi fo.. 더보기
[참고]공유 메모리 관련 함수 공유 메모리 관련 함수 shmget() 함수 shmat() 함수 shmdt() 함수 ■ shmget() 함수 NAME shmget - allocates a shared memory segment 메모리 안에 들어있는 일부내용 조각들을 세그먼트라고 부른다. 그것을 할당한다. SYNOPSIS #include #include int shmget(key_t key, int size, int shmflg); DESCRIPTION shmget() returns the identifier of the shared memory segment associated to the value of the argument key. A new shared memory segment, with size equal to the rou.. 더보기
10_Level10 -> Level11[FTZ] 공유 메모리에 데이터를 읽고 쓰기 ■ Level10 -> Level11 ■ 목적 공유 메모리에 데이터 읽고 쓰기 프로세스와 프로세스가 통신(메세지를 주고 받는 방법) -소켓 사용하는 경우(EX: Clint/Server 프로그램) cs프로그래밍 이라고 한다. server - client 통신 [EX] 서울버스 어플리케이션 화면 구성이나 메뉴는 스마트폰(client)에 있고, 실제 버스의 데이터는 Server에 존재한다. 어플(client)이 서버로부터 데이터를 갖고 와서 화면에 출력하는 방식. -공유메모리를 사용하는 방법(EX: DB 프로그램(Oracle)) DB에 여러 데몬들이 같은 메세지를 가지고 작업해야할 때 -파일을 사용하는 경우 가장 성능이 떨어지는 방식 -DB 사용하는 경우 DB에 정보를 요청해서 빼가는 방식 -기타 이번 레벨에.. 더보기
09_Level9 -> Level10[FTZ] 버퍼 오버 플로우 소개 ■ Level9 -> Level9 ■ 목적 버퍼오버플로우(BOF, Buffer Overflow)소개 버퍼오버플로우 기법을 이해하기 위해 메모리의 값을 조작하는 방법 Stack Buffer Overflow (지역변수 활용) - 쉽고 복잡하게 구성 Heap Buffer Overflow (메모리 할당) - 어렵고 단순하게 구성 [참고] 변수의 메모리 배치 확인과 GDB 사용방법 http://hyess.tistory.com/366 ■ Level9 풀이 level9 사용자 로그인 -> ID/PASS : level9/apple $ cat hint 다음은 /usr/bin/bof의 소스이다. #include #include #include main(){ char buf2[10]; char buf[10]; printf(.. 더보기
[참고] 버퍼 오버 플로우 [본 문서는 http://geundi.tistory.com/118의 블로그에 기재된 내용으로 학습 용도로 사 용함에 있어서 훼손이나 문서를 수정하지 않았습니다.] (1)프로그램 실행시 메모리의 구조 하나의 프로그램이 실행되면 프로그램 수행에 필요한 메모리가 할당 됩니다. 하나의 프로그램에 할당되는 메모리의 전체적인 모습은 다음과 같죠. /--------------------/ ← 메모리의 높은 숫자의 주소 | | | Stack | | | /------------------/ | | | Heap | | | /--------------------/ | | | Data | | | /--------------------/ | | | Text | | | /--------------------/ ← 메모리의 낮은 .. 더보기
[참고]변수의 메모리 배치 확인 및 GDB 사용법 변수의 메모리 배치 확인 및 GDB 사용법에 대해서 사용시스템 - HackMe(level9/apple) 1. 변수의 메모리 배치 변수의 메모리 배치를 확인하기 위해서 프로그램을 만들어 보자. 변수와 변수의 사이에 dummy 라는 공간확인(정확한 배열을 위함) 여러개의 지역변수를 많이 할당한 것을 배열이라고 한다.(순차적) [level9@ftz level9]$ ls -l 합계 12 -rw-r--r-- 1 root root 391 11월 13 2002 hint drwxr-xr-x 2 root level9 4096 2월 24 2002 public_html drwxrwxr-x 2 root level9 4096 1월 16 2009 tmp [level9@ftz level9]$ cd tmp [level9@ftz le.. 더보기
08_Level8 -> Level9[FTZ] 로컬/원격 패스워드 크랙 ■ Level8 -> Level9 ■ 목적 패스워드 크랙(Crack) 대표적인 패스워드 크랙툴 로컬패스워드 크랙툴(Offline Password Crack) : John the Ripper(johnny) 원격패스워드 크랙툴(Online Password Crack) : Hydra(xhydra) ) --> 힌트는 충분하다. $ cd /etc ; ls -l shadow* -r-------- 1 root root 3195 Sep 17 02:40 shadow -rw------- 1 root root 3168 Jan 15 2009 shadow- -rw------- 1 root root 5 Jan 15 2009 shadow.lock /etc 밑에 있는 shadow는 root만 볼 수 있으며 용량 또한 위와 같지 않다.. 더보기
07_Level7 -> Level8[FTZ] 암호학(2진수 <->10진수 <-> 16진수) ■ Level7 -> Level8 ■ 목적 암호학 printf() 함수를 사용할 때 메모리에 2진수로 값이 저장되어 있지만 사람이 이해하기 쉽도록 하기 위해서 %c를 지정하면 한글자가 보이고, %d로 지정하면 모니터에 정수가 출력된다. 메모리상에는 101010101으로 되어있는 있다. 이것을 캐릭터타입, 인트타입 방식으로 읽어들이것. 반대로 사용자가 메모리에 원하는 문자를 저장하려면 아스키 테이블을 보고, 그 문자에 해당하는 16진수 값을 저장해야 한다. ■ Level7 풀이 level7 사용자 로그인 -> ID/PASS : level7/come together 우선 hint를 확인한다 $ cat hint /bin/level7 명령을 실행하면, 패스워드 입력을 요청한다. 1. 패스워드는 가까운곳에.. 2.. 더보기
[참고] Signal에 대해서(시그널 함수) 시그널(signal)에 대해서 ■ 시그널에 대한 정보 확인 @linux200 # whatis signal signal (2) - ANSI C signal handling signal (3p) - signal management signal (7) - list of available signals signal.h [signal] (0p) - signals # man 7 signal NAME signal - list of available signals DESCRIPTION Linux supports both POSIX reliable signals (hereinafter "standard signals") and POSIX real-time signals. Signal Dispositions Each si.. 더보기
06_Level6 -> Level7[FTZ] signal() 함수 취약점 살펴보기 ■ Level6 -> Level7 ■ 목적 signal() 함수의 취약점. ■ 시그널(signal)? 하나의 프로세스(Process)가 다른프로세스(Process)에게 보내는 비동기적 알림 이벤트 메세지 [참고] 시그널에 대해서 http://hyess.tistory.com/360 ■ Level6 풀이 level6 사용자 로그인 -> ID/PASS : level6/what the hell Last login: Mon Aug 25 08:41:35 from localhost.localdomain hint - 인포샵 bbs의 텔넷 접속 메뉴에서 많이 사용되던 해킹 방법이다. ##################################### ## ## ## 텔넷 접속 서비스 ## ## ## ## ## ## 1... 더보기