$bash

'0x0300 : Study/0x0301 : System'에 해당되는 글 27건

  1. 생각난김에 쓴 심볼릭 링크
  2. System - Return To Library
  3. System - Assembly Handray
  4. System - stack? gdb?
  5. System - 시스템해킹이란?
  6. Egg Shell
  7. bof 기초 입문용 서적 by 달고나

생각난김에 쓴 심볼릭 링크

0x0300 : Study/0x0301 : System

학교 친구 개놈이 narnia3 에서 막혔다고 한다. 그러면서 알려준 심볼릭 링크 인데 어느정도 중요하다 생각이 든다.

그래서 간단히 써본 심볼릭 링크 란??


$In -s [existing file/dir name: 저는] [new file/dir name: 뉴비입니다]

$In -s 기존에 있는 파일 또는 디렉토리_새로 만들 링크의 이름

// -s 심볼릭 링크를 만든다?? 라는 의미


이미 존재하는 (저는)라는 파일 또는 디렉터리를 (뉴비입니다) 라는 이름을 통해 접근을 해주는 것.

'0x0300 : Study > 0x0301 : System' 카테고리의 다른 글

근황.  (0) 2016.09.01
System - Format String Attack 1  (0) 2016.08.05
System - Return To Library  (0) 2016.06.30
System - Assembly Handray  (0) 2016.06.12
System - stack? gdb?  (0) 2016.06.12

System - Return To Library

0x0300 : Study/0x0301 : System

PLG ? GOT?

Plt (Procedure linkage table)

사용자가 만든 함수는 plt를 참조할 필요가 없지만 외부 라이브러리에서 가져다 쓸 경우 plt 를 참조 하게 된다.


got (global offset table)

함수들의 주소를 담고 있는 테이블이다. 라이브러리에서 함수를 호출할 때 plt가 got를 참조한다.



즉 외부 라이브러리에서 함수를 참조할 때? plt에서 got로 넘어가고 got는 실제 라이브러리 함수주소가 들어있다.


got overwrite라는 기법이 plt, got의 동작 과정에서 고안해낸 기법이다. got는 실제 함수의 주소를 가리켜서 그곳을 실행 하기 때문에

got에 우리가 원하는 주소로 덮어버리면 특정 함수가 실행되지 않고 우리가 원하는 주소가 실행된다.


plt (Procedure linkage table)

gdb를 통해 디버깅을 해보면..


fflush@plt

fget@plt

puts@plt


처럼 외부 라이브러리가 있는 것을 확인 할 수 있다.

그 밖에도 사용자가 만든 procedure들도 확인 할 수 있는데...예시가 없어 확인 해줄 방도가..


got (global offset table)

// 뭐라 설명하기 힘든데...공부한 블로그 자료 보는게 좋을듯 ..

// 주소는 아래에 !


즉.

함수 실행전>>

plt 주소 > got 주소 (JMP plt + 6) > jmp got > dl_runtime_resolve > dl_fixup > dl_lookup_symbol > jmp function address


함수 실행후>>

plt 주소 > got 주소 > jum function address



Return To Library

:: 공유 라이브러리에 있는 함수의 주소를 이용해서 바이너리에 존재하지 않는 함수를 사용 할 수 있다.


DEP (Data Execution Prevention) 메모리 보호기법 우회.

:: 데이터 실행방지로 스택이나 힙에서 쉘 코드를 실행방지를 해주는 메모리 보호 기법.

NX bit (Never Execution Bit) 가 적용된 스택을 우회하기 위해 사용.

:: NX 특성으로 지정된 모든 메모리 구역은 데이터 저장을 위해서만 사용되며, 프로세서 명령어가 그 곳에서 상주 하지 않음으로써 실행되지 않도록 만들어 준다.


본문에서 사용된 예시이다.

// 커피하고 2진법 저거는 무시..


이 코딩을 보면 strcpy라는 함수구문에 libc_start_main대신 system을 실행 하고자 한다.

// system("bin/sh")을 실행 시키는 것이 목표.


먼저 저 코드의 스택 구조를 살펴보면


buf[128] 

sfp[4] 

ret[4]

 dummy[4]

parameter[1] 


이러한 구조로 나타나 있다.

// 이 또한 gdb를 통해 구조를 파악. 사실 굳이 안해도 이정돈 구상 해야되는듯...?


우린 저 구조에서 ret[4]를 ..


 ret [4]

 >>

 libc.so.6

 

 

system() 

처럼 변환 하여 sh을 실행 시키고자한다.


// 왜 이렇게 되는지는 bof하면서 아니깐 pass...궁금하면 원문 링크 .


buf [128] + sfp 값 + return 값 + "AAAA" + parmeter 를 넣어서 실행 시키면?

eip에 0x41414141 이라는 값이 입력 되어있을 것이다...이 곳으로 bof? 이론처럼 하면 되는듯..?


-----

ASLR (Address Space Layout Randomization)

:: 동적 라이브러리의 주소를 프로그램 실행마다 매핑!


ulimit -s unlimited를 이용하면 스택이 더이상 증가하지 않고 랜덤으로 매핑이 되는 것을 방지 할 수 있다.

// ulimit > 시스템 제한    ,    -s > 최대 스택 크기 출력    ,    unlimited > 크기제한 해제.

// 리눅스 상위 버전이나 대부분인거 같은데... aslr이 걸려있다는 거 같다..


-----


다시 돌아와서 ..

시스템 주소값과 파라미터 주소 값을 알게 되어 sh 를 실행 시키면 되는데...


원문에서는 export PATH를 이용해 환경변수에 시스템 출력 하는 것을 지정하였다.

// export PATH=.:$PATH    >    환경변수에 현재 위치( . )를 등록..


페이로드를 작성하면...


buf [128] + sfp [4] + 0x4007b190 (시스템 주소값) + dummy [4] + 0x44가 들어 있는 주소.

// 0x44값을 지우고 쉘 코드를 넣어서 해도 될듯 하다...

// 사용된 주소값은 원문에서 쓰인 값이다.



" 출처 : http://shayete.tistory.com/ "

'0x0300 : Study > 0x0301 : System' 카테고리의 다른 글

System - Format String Attack 1  (0) 2016.08.05
생각난김에 쓴 심볼릭 링크  (0) 2016.07.19
System - Assembly Handray  (0) 2016.06.12
System - stack? gdb?  (0) 2016.06.12
System - 시스템해킹이란?  (0) 2016.06.12

System - Assembly Handray

0x0300 : Study/0x0301 : System

Assembly Handray?

어셈블리 헨드레이란 어셈블리어를 c 언어로 복원시키는 것을 의미.


Assembly Instruction.

기본적인 어셈블리 명령어를 ArABoJa.


push : 스택에 특정 값을 넣고 ESP -4


pop : 특정 값에 ESP가 가리키는 값을 넣고 ESP + 4

 

nop : 아무것도 하지 않는다.


mov a, b : b를 A에 복사한다. ( a=b )


lea a, [b] : b의 주소에 있는 값을 a에 복사. ( a=*b )


cmp a, b : a와 b를 비교한다.


a > b    ZF = 0    CF = 1

a < b    ZF = 0    CF = 0

a == b  ZF = 1     CF = 0


add a, b : a와 b를 더해서 a에 결과를 넣는다. ( a+= b )


sub a, b : a와 b를 빼서 a에 결과를 넣음. ( a -= b )


imul a, b : a와 b를 곱해서 a에 넣음. ( a *= b )


xor a, b : a와 b를 xor 연산을 하여 a에 넣는다. ( a xor b )


inc a : a에 1 더함 ( a += 1 )


dec a : a에 1 뺌 ( a -= 1 )


je : 비교 값이 같은 경우 ( ZF = 1 )일때 점프한다.


jne : 비교 값이 다를 경우 ( ZF = 0 )일때 점프.


call : 해당 프로시저를 호출 (리턴값이 스택에 저장)


jmp : 해당 주소로 점프


// nop 명령어는 나중에 nop sled 기법으로 공부하면서 다시 언급 하자.


Handray!


// 시작하기전에 http://shayete.tistory.com/ 이사람 에서 공부한다. 그니깐 내가 끄적이는 것보다 저기를 추천함.

// 나는 저사람 블로그를 보고 공부한 내용을 서술하는 것 이다.. 문제되면 보호해서 암호화 할 계획.


ebp + 8 이상의 값이면 함수의 인자를 나타냄.

// int add (ebp + 8 , ebp + c , ebp + 10 )

// 3개의 함수의 인자가 나타남..


ebp - 4 , esp + 8 이상의 값은 지역변수이다.

숫자가 높을수록 가장 먼저 선언된 변수 !


mov x, y는 간단하게 x=y 이며 이게 lea x, [y] 와 같은 소리다.


인자 앞에 BYTE, WORD , DWORD 가 붙은 건 각각 1, 2, 4byte 임을 의미한다.


함수 프롤로그 밑에 sub x 가 있다는 것은 x 만큼 지역 변수가 선언해 있다는 것을 의미한다.


call x는 x라는 함수를 부른다는 뜻 인데 call 위에 보면 esp , esp + 4 , esp + 8 이 보인다. 이것은 각각 함수의 첫번째 인자 , 두번째 인자, 세번째 인자를 뜻한다.


for를 예시로 들어보자.

1    mov ebp - 0x8 , 0x0

2    cmp ebp - 0x8 , 0x9

3    add ebp - 0x8 , 0x1

2번줄 까지에 내용은 인자를 초기화 시키고 인자를 비교하는 것을 의미한다. 쭉 명령어를 실행시키고 3번째 부분에선 연산을 수행한다.

즉 ebp값이 0부터 8보다 같거나 9보다 클때 까지 1을 더한다는 의미가 된다...(맞나?)아몰랑 ^ㅡ^


// 이후 예시는 따로 참고 안함.

// 문제풀때 바로 걍 써먹었다.




" 출처 : http://shayete.tistory.com/ "

'0x0300 : Study > 0x0301 : System' 카테고리의 다른 글

생각난김에 쓴 심볼릭 링크  (0) 2016.07.19
System - Return To Library  (0) 2016.06.30
System - stack? gdb?  (0) 2016.06.12
System - 시스템해킹이란?  (0) 2016.06.12
Egg Shell  (0) 2016.06.07

System - stack? gdb?

0x0300 : Study/0x0301 : System

Stack Corruption?


요즘에 쓰이는 buffer over flow의 말 스텍에 할당량 공간에 버퍼의 메모리를 넘치게 해서 메모리를 오염시킨다는 의미.


Kernel - os의 시스템 코드가 로드되는 부분


-- Off limit --   사용자가 접근 못하도록 남겨둔 공간


Stack - 프로그램에서 사용되는 각종 환경변수, 파라미터, 리턴, 지역변수등 있는 공간


libc - 라이브러리가 이따..


Heap - 동적 할당되는 변수의 데이터가 위치하는 영역


BSS, Data - 프로그램에서 사용하는 전역변수, 정적변수 등 각종 변수들이 실제로 위치하는 메모리 영역.

                   변수가 초기화 = > Data             초기화 X = > BSS


Code - 실제 실행되는 기계어 명령어, 어셈블리 코드가 있는 곳, 프로그램 실행시 코드 영역에 있는 어세블리 코드가 해석되어 실행


(스택 쌓이는 구조는 안올렸는데...검색하세용 낄낄 ^ㅡ^)노양심


함수 프롤로그? 에필로그?


어셈블을 하면 보게되는 내용. 말그대로 시작부분과 끝부분을 지칭한다.


프롤로그에는

push EBP

mov EBP, ESP


이는 이전 함수의 Stack Frame의 시작점을 백업 하고 새로운 Stack Frame 을 생성하는 의미.


에필로그에는

mov ESP, EBP

pop EBP


Stack Pointer를 Caller Function 의 Stack Frame 시작 주소가 저장되어 있는 곳으로 변경하고 EBP를 원래대로 복구 하는것을 의미.


Stack Frame 시작점을 백업하여 함수가 끝나고 이전 함수로 넘어갈 때 base pointer 를 복원 시켜준다. 이때 push EBP 값이 sfp이다.

그리고 mov EBP, ESP 를 하여 이 함수가 끝나는 새로운 Stack Frame 을 생성한다.

mov ESP, EBP 를 해서 sfp가 저장되어 있는 곳으로 스택 포인터를 맞추고 그걸  POP EBP, sfp를 EBP에 빼내 이전 EBP를 다시 복구시켜준다. 

그리고 ReTurn Address . Stack Frame Pointer 바로 밑에 있는 이전 함수의 리턴 주소를 EIP에 POP해서 복구.


함수 호출규약


cdecl - 부모쪽 에서 스택 복구

stdcall - 자식쪽에서 스택 복구

fastcall - 레지스터를 통해 인자 전달.


이거에 대해서는 머릿속에서 정확히 정리를 못했다. 다시 공부해야될듯..


Registers!


EIP - Extend instruction pointer :: 다음에 실행될 주소를 담고 있다.

EBP - Extend base pointer :: 함수로 전달되는 파라미터 또는 지역변수를 나타낼때의 기준.

ESP - Extend stack pointer :: 스택의 끝부분.


eip를 컨트롤 한다는것이 eip는 다음에 실행될 주소가 담겨 있다. 때문에 우리가 원하는 주소를 eip에 넣으면 거기로 건너뛰어 원하는것을 실행 가능 !


EAX - 대부분의 산술 연산에 사용되며, 함수의 반환값이 들어기도함.

EBX - 주로 주소 지정을 확장하기 위해 index로 사용된다.

ECX - 루프의 반복 횟수, 좌우방향의 쉬프트 수를 기억.

EDX - 곱, 나눗 셈에서 EAX와 같이 사용되며 부호 확장 명령 등에 쓰인다.

ESI / EDI - cpu가 현재 코드 세그먼트에서 다음에 실행할 명령어의 오프셋을 저장하는 32bit 레지스터이다.


데이터, 인덱스 레지스터이다. 걍 변수랜다. 그래도! 기억은 하자


gdb!


명령어에 대해 서술할 것이다!


gdb -q [이름] : gdb 온 !


run (r) : 바이너리 실행


continue (c) : 다음 브레이크 포인트까지 실행


quit (q) : 종료


disas [함수이름] : 특정 함수의 어셈블리 코드 출력


info

- function : 함수의 정보 출력

- break : 브레이크 포인트의 정보 출력

     - del : 모든 브레이크 포인트 제거

     - del [숫자] : 특정 브레이크 포인트 제거

- reg : 레지스터의 정보 출력


break (b * [ㅡㅡ] )

 - function (main...add...기타등등 이름) : 함수에 브레이크 포인트를 건다. 함수 프롤로그 포함.

 - address : 특정 주소에 break를 건다.


stepi (si) : 코드 한줄 실행. - 세부


nexti (ni) : 코드 한줄 실행. - 세부 x


print [function] (p) : 해당 함수 주소 출력


p $reg : 해당 레지스터 값 출력


x/[범위][출력형식][범위단위][메모리주소 나 함수명]

- x/[범위]i [address] : 특정 주소를 범위 만큼 어셈블리로 출력

- x/[범위]s [address] : 특정 주소를 범위 만큼 문자로 출력

- x/[범위]wx [address] : 특정주소를 범위만큼 16진수 4바이트 단위로 출력


set {type}[address] 특정메모리에 값을 지정 = set{int}0x000000 = 100


set $[reg] : 특정 레지스터에 값을 지정 = set $eip = 0x41414141


finsh : 현재 함수를 수행하고 빠짐


u : 현재 루프를 탈출


disas [address] [address] : 주소 사이의 어셈블리 코드를 출력




" 출처 : http://shayete.tistory.com/ "

'0x0300 : Study > 0x0301 : System' 카테고리의 다른 글

System - Return To Library  (0) 2016.06.30
System - Assembly Handray  (0) 2016.06.12
System - 시스템해킹이란?  (0) 2016.06.12
Egg Shell  (0) 2016.06.07
bof 기초 입문용 서적 by 달고나  (0) 2016.06.07

System - 시스템해킹이란?

0x0300 : Study/0x0301 : System

풀이나 기술적으로 무엇인가 알려줄내용은 아니다. 그냥 내가 공부한 것에 대해 끄적일 것인데...

공부를 위해서 라면 읽어보는 것도 나쁘지 않을 것이다. 그럼 시작?


시스템 해킹?


내가 크게 알고있는 내용은 없다. 하지만 특정 권한이 존재하는 취약한 바이너리를 찾아 다양한 공격기법들을 사용해 메모리 보호기법을 통과하여 해커들이 원하는 결과를 도출하는 것 이라고 생각한다.


종류?


: BOF (buffer over flow)

 - Stack corruption

 - Heap corruption

: Format String Bug

: Integer Overflow

: Use - After -Free

: Type Confusion


(사실 아는건 bof끝 ㅎ)


VIM?


리눅스에서 사용되는 프로그래밍 모듈인데..본인은 걍 프로그램써서 코딩 따로함...끙

만약에 명령어가 궁금하다 ! (검색해 ㅡㅡ)


만약 필요로 하게 된다면 나중에 다시 서술해야겠다.




" 출처 : http://shayete.tistory.com/ "

'0x0300 : Study > 0x0301 : System' 카테고리의 다른 글

System - Return To Library  (0) 2016.06.30
System - Assembly Handray  (0) 2016.06.12
System - stack? gdb?  (0) 2016.06.12
Egg Shell  (0) 2016.06.07
bof 기초 입문용 서적 by 달고나  (0) 2016.06.07

Egg Shell

0x0300 : Study/0x0301 : System

Eggshell


에그쉘이란 bof에서 버퍼의 크기가 쉘코드의 크기보다 작아서 쉘코드를 써넣을 수 없을때 환경변수에 쉘을 등록해놓고 그 주소값만 가져와서 쉘을 띄울 수 있게 해주는 프로그램이다.


그러나 에그쉘은 환경변수에 등록 후 등록된 주소의 값을 불러오는 프로그램을 작성 해야 제대로 쓸 수 있음. 그렇기 때문에 에그쉘 코드 작석 후 한번 실행하여 "Egg"라는 이름으로 쉘코드를 환경변수에 넣어줘야 프로그램으로 에그쉘의 주소를 가져올 수 있다.



파일은 C로 첨부 했씀다...


EGG Shell.c


'0x0300 : Study > 0x0301 : System' 카테고리의 다른 글

System - Return To Library  (0) 2016.06.30
System - Assembly Handray  (0) 2016.06.12
System - stack? gdb?  (0) 2016.06.12
System - 시스템해킹이란?  (0) 2016.06.12
bof 기초 입문용 서적 by 달고나  (0) 2016.06.07

bof 기초 입문용 서적 by 달고나

0x0300 : Study/0x0301 : System

말그대로 bof 기초 입문 용 pdf 파일로 정리된것이다.


갓고나 님깨서 뉴비들에게 빛을 선사하셨다.

 파일 올려 배포하되 저작권으로 문제가 생긴다면 베포 중단 하겠습니다.


해커_지망생이_알아야할_bof_기초-달고나.pdf


'0x0300 : Study > 0x0301 : System' 카테고리의 다른 글

System - Return To Library  (0) 2016.06.30
System - Assembly Handray  (0) 2016.06.12
System - stack? gdb?  (0) 2016.06.12
System - 시스템해킹이란?  (0) 2016.06.12
Egg Shell  (0) 2016.06.07