스템 프레임이란?

 -ESP(스택 포인터)가 아닌 EBP(베이스 포인터) 레지스터를 사용하여 스택 내의 로컬 변수, 파라미터, 복귀 주소에 접근하는 기법

 

ESP레지스터의 값은 프로그램 안에서 수시로 변경되기 때문에 스택에 저장된 변수, 파라미터에 접근하고자 할 때 ESP 값을 기준으로 하면 프로그램을 만들기 어렵고, CPU가 정확한 위치를 참고하기 힘듭니다.

그래서 함수 시작의 ESP값을 EBP에 저장하고 이를 함수 내에서 유지해주면, ESP값이 아무리 변하더라도 EBP를 기준으로 안전하게 해당 함수의 변수, 파라미터, 복귀 주소에 접근할 수 있습니다. 

 

 

 

스택 프레임의 구조

PUSH EBP        ;함수 시작(EBP를 사용하기 전에 기존의 값을 스택에 저장)

MOV EBP,ESP   ;현재의 ESP를 EBP에 저장

 

...                   ;함수본체; 여기서 ESP가 변경되도, EBP는 변경 X; 안전하게 로컬 변수와 파라미터 엑세스 가능

 

MOV ESP, EBP  ;함수 시작했을 때의 값으로 복원

POP EBP         ;리턴되기 전에 저장해 놓았던 원래 EBP값으로 복원

RETN             ;함수 종료

 

 

스태겡 복귀 주소가 저장된다는 점이 보안 취약점으로 작용할 수 있습니다. buffer overflow 기법을 사용하여 복귀 주소가 저장된 스택 메모리를 의도적으로 다른 값으로 변경할 수 있습니다.

 

 

 

반응형

'보안 > 리버싱' 카테고리의 다른 글

2. abex' crackme 1  (0) 2019.07.29
1. 문자열 패치  (0) 2019.07.19

파일을 실행하면 이렇게 뜹니다. 어떻게 크랙을 하는 것인지 분석해볼게요.

 

옆쪽에 보면 저희가 띄워야 되는 구문은 ok, I really thing that your HD is a CD-ROM! :p 구문을  띄워야 되는 것을 알 수 있어요.

 

옆에 주석을 보면서 어셈블리어를 분석해볼게요.

push: 스택에 값 입력

call  : 지정된 주소의 함수 호출

inc   : 값 1 증가

dec  : 1감소

jmp  : 지정된 주소로 점프

cmp : 주어진 두 개 operand 비교

je    : 조건 분기

 

 

cmp eax,esi 를 비교합니다.

JE SHORT 0040103D 는 두 값이 같으면 40103D로 점프하고 아니면 그대로 진행합니다.

 

 

 

저희가 원하는 값으로 나오게 할려면 JE ~~~ 구문을 JMP 0040103D로 바꿔주면 됩니다. 그러면 바로 저희가 원하는 쪽으로 점프 하겠죠?

 

 

저희가 원하는 값이 잘 나오네요~

 

 

아 그리고 알아야 될 것이 있습니다. 함수 호출 시 스택에 파라미터를 전달하는 방법에 대해 살펴볼게요.

MeesageBoxA() 함수를 호출하기 전에 필요한 파라미터를 거꾸로 입력하고 있습니다.

 

MessageBoxA(NULL, "Make me think your HD is a CD_Rom.", "abex' 1st crack me", MB_OK|ME_APPLMODAL);

 

파라미터의 순서가 역순으로 입력되는 이유는 스택 메모리 구조이기 때문입니다.

파라미터를 거꾸로 넘겨주면 함수에서는 올바른 순서로 꺼낼 수 있습니다.

반응형

'보안 > 리버싱' 카테고리의 다른 글

스택 프레임  (0) 2019.08.02
1. 문자열 패치  (0) 2019.07.19

이 소스를 실행하면 Hello World 라는 문자를 출력하는 메세지 박스 창이 뜹니다.

 

이 메세지를 다른 메세지로 패치해볼게요.

 

우선 ollydbg를 실행해서 이 exe파일을 엽니다.

 

 

메인함수를 찾아보도록 합시다.

우클릭 눌러서 search for 에서 name in all modules를 누릅니다.

그리고 messageboxw를 타이핑 하면,

이렇게 찾을 수 있습니다. 여기에 f2를 눌러 브레이크포인트를(bp) 설정하고, f9를 눌러 실행합니다.

 

오른쪽 아래에 보면 이런 내용이 있습니다.

 

첫 번째는 address , 두 번째는 value, 3번째는 comment 입니다.

 

meesageboxw는 0D1758 에서 호출 되었고, 함수 실행이 종료되면 0D175E주소로 리턴한다는 뜻입니다.

 

 

 

이제 패치해보도록 할게요.

위에서 Hello World 의 주소와 meesageboxw가 호출되는 주소를 찾았습니다.

main 함수 시작 주소(0D174A)까지 실행합니다. (bp설정하고 실행하면 됩니다.)

 

문자열을 패치하는 방법에는 2가지 방법이 있습니다.

 - 문자열 버퍼를 직접 수정

 - 다른 메모리 영역에 새로운 문자열을 생성하여 전달

 

1) 문자열 버퍼를 직접 수정

덤프 창(왼쪽 아래)에서 문자열의 주소인 0D7B58주소로 찾아갑니다.(컨트롤+g)

 

선택하고 컨트롤 + e키를 눌러 edit 다이얼로그 창을 띄웁니다.(유니코드는 한 글자당 2바이트가 필요합니다. null도 고려해야되요)

여기서 unicode의 문자열을 hello reversing으로 수정할게요. keep size 체크 풀어주세요! 그리고 유니코드에선 null을 입력할 수가 없어요. 그래서 그 아래에 hex창에서 00 00 을 끝에 입력해줍시다.

메인함수로 다시 돌아가서 실행해보면,

성공적으로 수정됬습니다. 

 

뒤에 reversing의 길이가 world보다 더 깁니다. 보통 원본 문자열 뒤에 다른 데이터가 있을 수 있기 때문에 원본 길이를 넘는 문자열로 덮어 쓰는 것은 위험합니다.

 

이 방법의 장점은 간단하지만, 단점은 기존 문자열 버퍼 크기 이상의 문자를 입력하기 어렵습니다.

 

 

파일로 생성하기

위에서 한 것은 메모리에 임시적으로 한 것이라 디버거가 종료되면 패치했던 내용은 사라집니다.

영구히 보존하려면 별도의 실행파일로 저장해야 됩니다.

 

변경된 내용(hello reversing)을 선택하여 마우스 우측 버튼을 누르고 copy to executable file 메뉴를 선택하고, 다시 우측 버튼을 눌러 save file 버튼을 눌러 저장 할 수 있습니다.

 

 

2) 다른 메모리 영역에 새로운 문자열을 생성하여 전달

위의 경우처럼 원본 문자열보다 더 긴 문자열로 패치해야 될 경우에는 위의 방법은 알맞지 않습니다.

이런 경우 사용할 수 있는 방법을 알아보겠습니다.

 

컨트롤 + f2로 다시 실행 후, 아까 설정한 main 함수(0D174A)로 갑니다.

아래 사진처럼 MessageBoxW가 호출 되는 지점으로 가면, 주소 수정해도 안되요!

 

0D1751 주소의 push 명령은 0D7B58의 hello world 문자열을 파라미터로 전달합니다.(MessageBoxW() 함수)

 

이 함수는 파라미터로 입력된 주소의 문자열을 출력 해줍니다. 만약 이 문자열 주솔르 변경해서 전달하면, 메시지 박스 에는 변경된 문자열이 출력됩니다.

 

적당한 메모리 영역에 패치하고 싶은 긴 문자열을 적고, 그 주소를 파라미터로 넘겨줍니다. (지금은 임의의 영역을 고를게요. 더 자세한 방법은 더 공부하고 올릴게요)

 

dump 창에서  hello world 문자열 주소로 이동합니다. 스크롤을 밑으로 내리다 보면 NULL padding 으로 끝납니다.

 

이곳은 프로그램이 사용하지 않는 NULL padding 영역입니다.

적당 한곳에 패치 문자열을 씁시다.

이 새로운 주소를 이제 파라미터로 전달 해야겠죠? 

 

아까 코드에 마우스를 올리고 우클릭 누른 뒤 assemble 명령을 사용해주세요.(단축기 space)

 

그리고 코드를 변경해줍시다.

문자열을 새로 쓴 주소를 파라미터로 전달해줍시다.

 

 

반응형

'보안 > 리버싱' 카테고리의 다른 글

스택 프레임  (0) 2019.08.02
2. abex' crackme 1  (0) 2019.07.29

tcp/ip는 본질적으로 해킹에 취약. 연결 설정 및 통신 과정에 많은 문제 있음.

 

1. 클라이언트에서 서버로 최초 연결을 시도하는 syn 패킷 전송하면 서버는 연결을 위해  버퍼 자원을 할당.

   계속 syn 패킷만 전송하는 클라이언트가 있다면 서버는 통신 버퍼를 모두 소진해 네트워킹 불가능.

2. 정상적인 통신 연결이 완료된 후에 해커는 클라이언트를 가장해서 통신 세션을 쉽게 가로챌 수 있음.

   통신 상대방을 인증하기 위해 tcp 헤더에 있는 시퀀스 번호를 확인 하는데, 제삼자가 이 번호를 쉽게 알아내서 위장       가능

3. ip 헤더에 있는 소스 ip 정보는 쉽게 위조 가능. 소스 ip를 클라이언트 pc가 아닌 공격 대상 시스템 ip로 위조해 syn 패     킷을 서버에 전송하면 서버는 agk 패킷을 공격 대상 시스템으로 보내게 됨. 일종의 dos공격 가능.

 

1. 포트 스캐닝

ip는 서버를 식별하는 논리적인 주소. 포트는 하나의 ip를 여러 개의 애플리케이션이 공유하기 위한 논리적인 단위.

ip는 ip 프로토콜에서 식별자로 사용되고, 포트는 tcp/udp 프로토콜에서 식별자로 사용 됨. 방화벽 또는 서버에서 네트워크 서비스를 위해 포트를 개방하고 있음.

대표적인 것이 80 과 443 포트. 각각 http와 https 서비스를 위해 방화벽에서 개방하고 있음. 필수적인 포트 외에 관리 편의성을 위해 몇 개의 포트를 추가로 사용하고 있음. 대표적으로 ftp나 텔넷 서비스를 제공하는 21,22번 포트.

 

포트 스캐닝은 서비스를 위해 방화벽이나 서버에서 개방한 포트 목록을 알아내는 기술

다양한 기법이 존재. 

크게 udp기반, tcp 기반 기법 으로 분류됨.

udp 기반 : udp패킷을 전송해서 확인

tcp 기반 : syn, fin등 다양한 패킷을 전송하면서 포트 개방 여부 확인. 

기법별로 성능과 은닉성의 차이가 있음.

 

 

2. 패킷 스니핑

tcp/ip 통신을 하는 이더텟 기반 동일 네트워크 환경(하나의 라우터 사용)에서는 mac주소 기반으로 패킷이 동작.

하나의 pc에서 다른 pc로 데이터를 전송할 때, 전체 pc에 데이터를 브로드캐스트함. 패킷의 목적지 mac주소가 자신의 것과 같으면 받아들여서 처리하고, 그렇지 않으면 버리는 방식.

패킷 스니퍼는 모든 패킷을 버리지 않고 처리해서 동일 네트워크에서 이동하는 모든 데이터의 흐름을 한눈에 파악 가능.

 

 

3. 세션 하이재킹

http 세션 하이재킹과 tcp 세션 하이재킹으로 나뉨. 

전자는 웹 서비스 인증 정보를 저장할 쿠키의 SessionId 값을 탈취해서 해킹에 이용하는 방식.

후자는 tcp 패킷 정보를 탈취하는 방식. 

 

tcp 프로토콜은 통신 상대방을 인증하기 위해, ip, port, sequence number 3개 요소를 사용함. 

tcp 세션 하이재킹은 패킷 스니핑을 통해 알아낸 인증정보를 가지고 클라이언트와 서버 사이의 통신을 중간에서 가로챔.해커는 클라이언트와 서버와의 연결을 잠시 끊고 발신지 ip를 해커 pc로 변경해서 서버와 커넥션을 재설정.

서버는 통신 연결이 끊겼다가 다시 연결 됐다고 생각하고, 해커 pc를 클라이언트로 인식함.

클라이언트와 해커pc도 같은 방식으로 연결이 설정됨. 클라이언트와 서버와의 통신은 모두 해커 pc를 거치게 되고 해커는 모든 정보를 제어할 수 있게 된다.

 

 

4. 스푸핑

네트워크 관점에서는 크게 dns, ip, arp 3개의 자원에 대해서 위장을 통한 공격이 가능.

대표적으로 arp 스푸핑에 대해 알아보면,

arp는 ip주소를 가지고 mac주소를 알아내는 프로토콜.

pc는 내부에 ip와 mac정보가 저장된 arp 캐시 테이블을 가지고 있음. 통신 상대방을 인지하기 위해 해당 테이블을 조회해서 mac 정보를 추출. arp 캐시 테이블에서 정보를 찾지 못하면 arp 프로토클을 통해 ip에 해당하는 amc 정보를 찾을 수 있음.

arp 프로토콜은 보안이 고려되지 않았기 때문에 쉽게 해킹 가능.

arp reply 패킷을 통해 상대방의 arp 캐시테이블을 간단하게 조장 가능. arp 캐시 테이블에는 상대방 ip와 mac이 매핑 되어 있음. pc a와 b에 해당하는 정보를 해커 pc의 mac주소로 교체하면 모든 통신은 해커 pc를 거치게 됨.

 

 

5. dos

서비스 거부 공격은 인터넷에서 갖아 많이 활용되는 해킹 기법의 하나.

syn패킷의 발신지 주솔르 변경하거나, syn 패킷만 지속적으로 전송하고, 대량의 ip 패킷을 작은 단위로 쪼개서 전송하는 등의 행위를 통해 시스템을 서비스불능 상태로 만들 수 있다. 이뿐만 아니라 dos는 정상적인 패킷을 대량으로 발생시켜 서비스를 마비시킬 수 있음.

 

현재는 dos 대응 장비들이 발달해서 소수의 pc로 공격대상 시스템을 서비스 불능 상태로 만들기 어려움.

이를 극복하기 위해 해커는 바이러스를 배포해서 불특정 다수의 pc를 좀비 pc로 만들고, 원격에서 대량의 트래픽을 발생시키도록 제어하는 분산 서비스 거부공격(ddos)가 등장.

 

ddos는 봇넷을 활용. 봇넷은 악성 코드가 포함된 파일을 인터넷을 통해 배포해서 다수의 좀비pc를 확보, c&c서버를 통해 종비 pc를 통제하는 기술. 

반응형

'보안' 카테고리의 다른 글

웹 해킹 기술  (0) 2019.07.05
애플리케이션 해킹 기술  (0) 2019.07.05

웹은 기본적으로 인터넷 브라우저, 웹 서버, 데이터베이스 3개의 요소로 구성.

 

인터넷 브라우저 : 사용자의 입력 처리, 웹 서버로부터 받은 데이터를 가공해 화면을 구성.

웹 서버 :             http 요청을 분석해 정해진 기능 수행. 데이터 처리가 필요한 경우 데이터 베이스를 연결해 관련                                작업 수행.

데이터베이스     : 데이터를 안전하게 관리, 자료 입력과 조회 기능 지원.

 

파일 업로등 기능일 이용해 웹 셸 파일과 악성 코드를 업로드 한다. 업로드한 파일의 위치를 알아내 웹 셸 파일을 실행하면 해커는 웹 서버 장악 가능.

 

 

1. XSS(Cross-SITE Scripting)

게시판 게시물에 악성코드를 포함하는 스크립트를 심어놓고 게시물 읽은 사용자 pc에서 개인정보를 추출하는 해킹 기법.

악성 코드는 대부분 스크립트 코드, 쿠키를 읽어 특정 url로 전송하는 기능 수행. 현재는 장비발달로 인해 공격 빈도 감소

 

 

2.CSRF(Cross Site Request Forgery)

게시판에 악성코드 삽입, 사용자가 해당 게시물 읽으면 공격이 수행 됨.(XSS와 비슷)

차이점은 사용자 pc를 통해 웹 서버 공격. 

 

 

3. 피싱

은행이나 증권사이트와 비슷한 웹사이트 만들어, 사용자의 금융정보나 개인정보 타루치하는 기법. 

 

 

4. 파밍

DNS를 해킹, 정상적인 도메인 이름을 호출해도 위장 사이트가 전송되게 하는 해킹 기술. 

위장 사이트의 IP가 사용자 브라우저에 정송되면 사용자는 해커가 만든 웹 사이트에 개인정보를 입력하게 됨.

 

 

5. SQL 인젝션

HTML input 태그를 활용.

브라우저에서 사용자 아이디와 비밀먼호를 입력받아 웹 서버로 전달하면 웹 서버는 데이터베이스에 일치하는 정보가 있는지 sql문을 통해 확인.

이때 아이디와 비밀번호에 일반적인 값을 넣는 것이 아니라, 데이터베이스에 오동작을 유발할 수 있는 값 입력.

다양한 비정상 sql문을 반복적으로 입력하면서 데이터를 관찰하면 시스템 해킹이 가능한 sql 문 획등 가능.

 

 

6. 웹 셸 (web shell)

웹에서 제공하는 파일 업로드 기능 악용. 서버를 원격에서 조정할 수 있는 파일을 웹 서버를 통해 업로드.

해커는 업로드 한 파일 위치를 파악하고 접근 가능한 url을 찾아냄.

이 url을 통해 웹 셸 파일을 실행해서 운영 체제를 통제할 수 있는 강력한 권한 획등 가능.

 

반응형

'보안' 카테고리의 다른 글

네트워킹 해킹 기술  (0) 2019.07.05
애플리케이션 해킹 기술  (0) 2019.07.05

1. 메시지 후킹

 user32.dll 의 SetWindowsHookExA() 메서드를 이용.

윈도우는 키보드, 마우스 등에서부터 들어오는 메시지를 훅 체인을 통해 처리.

훅 체인은 메시지를 처리하는 일련의 함수 포인터를 모아놓은 리스트.

훅 체인 상에 강제적으로 프로그래머가 원하는 처리 프로세스에 대한 포인터를 등록 -> 메시지 들어올 때 원하는 작업 가능.

 

이를 이용한 해킹 기법 

key logger : 키보드 입력 메시지를 중간에 가로채 해커에게 전송.

 

 

2. API 후킹

운영체제에서 제공하는 디버깅 프로세스를 이용.

디버거 이용해 애플리케이션 특정 명령어에 breakpoint 설정, 특정 메서드를 수행하도록 등록.

애플리케이션은 작업을 수행하다 중단점을 만나면 등록된 메서드를 실행.(콜백 메서드라고 함)

여기에 해킹 코드를 심어 놓으면 원하는 동작 가능.

 

 

3. DLL 인젝션

 

동적으로 사용할 수 있는 라이브러리인 DLL을 애플리케이션에 삽입하는 기술.

 

3가지 방법

 - 레지스트리를 사용. 레지스트리의 특정위치에 원하는 dll 이름을 입력해 놓음. 

 - 후킹 함수 사용. 특정 이벤트가 발생했을 때 dll을 로딩하는 후킹 함수로 등록하는 것.

 - 실행 중인 애플리케이션에 원격 스레드 생성해 dll을 삽입하는 것.(윈도우는 CreateRemoteThread() 함수 제공)

 

 

4. 코드 인젝션(code injection)

스레드를 활용한 dll인젝션 기법과 유사. 

차이점은 dll 대신 직접 샐항 가능한 셸 코드(shell code)를 삽입.

 

장점 : dll을 미리 시스템 특정 위치에 저장할 필요 x, 속도 빠르면 노출이 쉽지 않음.

단점 : shell code의 특성상 복잡한 해킹 코드 삽입 불가.

반응형

'보안' 카테고리의 다른 글

네트워킹 해킹 기술  (0) 2019.07.05
웹 해킹 기술  (0) 2019.07.05

+ Recent posts