방학 총 정리(22년 여름방학)

RoughBoy·2023년 9월 9일
0

시스템 구조

목록 보기
10/11
post-thumbnail
post-custom-banner

개요

방학이란 긴 시간동안 교수님이 내신 코드 문제를 풀고 남은 한달을 드림핵에서 시스템 해킹을 나름 열심히 이해하고 내껄로 만들려고 노력했다.

지금부터 정리하는건 이번 한달동안 내머리속에 습득했던것들을 안보고 기억나는대로 설명해볼것이다.

shellcode

리눅스에서 쉘을 통해 명령어를 입력하고 컴퓨터가 프로그램을 실행할수 있게해주는 사용자와 컴퓨터를 연결해주는 인터페이스다.

쉘코드는 우리가 공격하려는 대상의 쉘을 실행시키게 만들어주는 코드이다. 드림핵에서 파이썬을 통해 작성했으며 언어를 조금이라도 해본적있으면 쉽고 빠르게 습득할수있다.

Stack Buffer OverFlow

bof를 이해할려면 스택을 이해해야한다. 내가 이해한것은

x86기준으로 변수들이 늘어날수록 ebp기준으로 아래로 스택이 확장된다. 여기서 스택 버퍼 오버플로우는 버퍼와 sfp를 임의의 값으로 채우고 ret를 자신이 원하는 흐름으로 바꿔서 공격하는 기법이다. scanf, read, gets, strcpy등 입력받는 크기를 버퍼의 크기보다 크게하거나 제한이 없으면 이 공격을 할수가있다.

이 공격을 막기위해서 scanf_s(버퍼보다 입력받는 크기가 크면 저장을 안함), read(입력받는 크기를 버퍼보다 작게설정), fgets(입력받는 크기를 제한) strncpy 등의 함수들이 개선되어 나왔고, 스택 카나리라는 보호기법이 생겼다.

Stack Canary

위에서 본 스택은 버퍼와 sfp만 채우면 ret를 원하는 값으로 뒤집어 쓸수있어서 공격하기 쉽다. 하지만 Canary 보호기법을 적용하면 버퍼와 sfp 사이에 함수가 시작될때마다 임의의 값을 삽입하여 함수가 종료될때 Canary에 부여된 임의의 값이 오염됬다고 판단되면 프로그램을 강제종료시키는 보호기법이다.

디버그로 본


main 함수 초기에 gs(x86 레지스터)에 생성된 임의의 값을 ebp-8에 넣어주고 eax값을 초기화 시켜주는 부분이다. 카나리를 생성하고 대입한 부분이다.

main 함수 끝자락에 ebp-0x8에 넣어줬던 카나리 값을 edx로 꺼내 gs:0x14에 있는 맨처음에 생성된 카나리값을 비교해서 ebp-0x8에 있던 값이 오염됬다고 판단하면 함수의 끝으로가 프로그램을 종료시킨다.

카나리 보호기법을 우회하기 위해서 우리는 Canary leak라는 방법을 사용하는데 내가 배운 리눅스(아키텍처마다 다를수있다.)에서 Canary는 \x00으로 시작하기 때문에 버퍼보다 한바이트 크게 오버라이트하면 카나리를 알아낼수가있다. 그래서 우리는 한바이트 크게 오버라이트하고 카나리를 알아내서 main으로 리턴해서 알아낸 카나리로 우회해 ret를 덮던가 다음 입력으로 ret를 덮어씌워 공격한다.

Bypass NX, ASLR

먼저 ASLR은 Address Space Layout Randomization의 약자로 main함수를 제외한 라이브러리 함수 주소, 코드 함수 주소, 라이브러리 매핑주소, 스택 주소, 힙 주소등을 파일이 실행할때 마다 랜덤한 주소를 주는 보호기법이다.

NX는 메모리의 쓰기영역과 실행영역을 분리하는 보호기법이다.
공격자가 임의 버퍼에 주입한 코드를 실행하기 어렵게 만든다..NX를 적용하기 전에는 ret를 쉘코드 주소로 덮어서 공격하면 실행이되지만 NX를 설정하면 실행권한이 제한되어서 쉘코드를 이용한 bof 공격은 불가하다.

그래서 생긴게 NX를 우회하는 RTL (Return to Library)이다. 쉘을 획득하는 코드는 system("/bin/sh")이다.

"임시저장" (추가 작성 필요)

profile
The day⋯ is doomed⋯. Thanks to⋯ the Rowdyruff Boys⋯.
post-custom-banner

0개의 댓글