본문 바로가기

High Level Technique/System Hacking

Bypass Canary Bypass Canary 개념 BOF가 발생할 수 있는 환경이지만 buffer를 모두 채운 뒤에 다음 4바이트가 Canary로 채워져 있어 해당 값이 변경이 될 때 에러를 출력하면서 프로그램이 종료되는데, 이 Canary를 유추해서 우회를 하는 방법을 말한다. 설명 1. Brute Force buffer를 모두 채운 후 다음 4바이트가 Canary로 채워져 있는데 1바이트를 넘어가도록 buffer를 채운다.그러면 Canary 영역에 1바이트가 침범하여 값이 다를 경우 에러를 출력하는데 이때 이 1바이트를 0x00 ~ 0xFF(256)까지 모두 넣어서 뜨지 않는 경우를 찾아낸다. 이렇게 4바이트를 모두 찾아낸다. 2. recv, strncpy recv와 strncpy 함수는 문자열을 입력받을 시 NULL이.. 더보기
Double Stage Format String Bug (DSFSB) Double Stage Format String Bug (DSFSB) 개념 일반적으로 Format String Bug(이하 FSB)는 스택의 값을 조작하여 원하는 결과가 나타나도록 공격하는 방법 이지만. buffer가 전역으로 선언되어있고 스택에 존재하는 값을 변조할 적절한 값이 없을 경우 사용한다. 설명 기본적인 FSB는 변조하고 싶은 주소(got)를 넣고 해당 값이 나오는 곳에 %n 지시자를 이용해서 실제 실행하고 싶은 주소를 넣어 실행시키도록 하는 것이죠.하지만 buffer가 전역으로 선언되어있으면 변조하고 싶은 주소(got)를 조작할 수 없게 됩니다. 이번 설명은 pwnable.kr의 fsb 문제를 이용하여 설명하도록 하겠습니다. fsb 바이너리를 gdb를 이용해서 확인해보면 fsb라는 함수가 존.. 더보기
Use After Free (UAF) Use After Free (UAF) 개념 프로그래머가 코드를 작성시 실수를 하여 발생하는 것을 말한다. Heap 영역에 할당하여 사용 후에 free를 하면 해제가 되는 것이 맞지만 같은 크기로 다시 할당하는 경우 한번 할당된 영역을 다시 재사용 됨으로써 발생하는 것을 뜻한다. 브라우저 익스플로잇을 할 때 많이 사용된다. 설명 먼저 간단한 C 코드를 보면서 UAF가 어떻게 발생 되는지 알아보도록 하겠습니다. test라는 구조체에는 int형 변수가 선언되어 있습니다. 그리고 main()에서는 p1, p2로 구조체 포인터로 선언이 되있습니다. p1과 p2는 각각 동적할당으로 256만큼 할당하도록 되어있죠. 프로그램이 동작하는 순서를 보면, p1이 동적할당되고 초기화가 안된 num의 값을 가져옵니다. 그리고 .. 더보기
SigReturn Oriented Programming (SROP) SigReturn Oriented Programming (SROP) 개념 Return Oriented Programming (ROP)의 변종으로서 system call를 이용한 기법으로 가젯이 충분하여 register를 원하는대로 조작할 수 있으면 상관 없으나 그렇지 않은 경우 사용하는 방법이다. SROP는 가젯이 많이 필요하지 않고 INT80 가젯만 있으면 가능한 기법이다. 설명 SigReturn Oritented Programming(이하 SROP)는 sigreturn을 이용하여 쉘을 따내는 기법을 말합니다.sigreturn은 syscall table을 통하여 찾아보게 되면 아래와 같이 나타납니다. eax값으로 119를 넣어주면 sigreturn이 실행이되는 것이죠. 그리고 sigreturn의 파라미.. 더보기
Return Oriented Programming (ROP) - final Return Oriented Programming (ROP) - final 목표 ROP를 stage0, 1로 나누어 정확한 개념을 통해 이해해 보자. 설명 이번에 설명할 것은 step1, step2를 통해서 ROP를 어떻게 수행하는지에 대해서 알아봤습니다.이번 step3에서는 좀 더 ROP에 대해서 자세하게 알아보도록 하겠습니다. ROP는 stage0, 1에 따라서 실행을 합니다. 이번에 사용할 바이너리를 받아주세요. shayete 형 ㄱㅅ 해당 바이너리를 사용하는 법은 ./rop port 입니다. 해당 바이너리에는 아래와 같은 취약한 부분이 있습니다. vuln이라는 배열에는 100만큼의 공간이 있지만 recv()를 통해서 200만큼 받을 수 있게 해두었습니다. 따라서 BOF가 발생할 수 있습니다. 먼저.. 더보기
Return Oriented Programming (ROP) - step 2 Return Oriented Programming (ROP) - step 2 목표 L.O.B FC3 evil_wizard를 이용하여 ROP를 socket을 이용하여 어떻게 페이로드를 작성하는지 알아보도록 하자. 설명 위 C 코드는 LOB FC3 evil_wizard 입니다. 해당 문제의 주석을 확인해 보면 8888포트로 접속하여 하라고 합니다. 먼저 공격 방법을 생각해 봅니다. step1에서도 system("/bin/sh")를 만들어서 사용했었습니다. /bin/sh를 .bss영역에 넣어뒀었죠. system() 주소, /bin/sh 주소, pop pop ret 주소 strcpy() 주소 를 찾아야 합니다. .bss 주소 .bss section의 주소는 0x8049868 입니다. strcpy() 주소 str.. 더보기
Return Oriented Programming (ROP) - step 1 Return Oriented Programming (ROP) - step 1 개념 Return Oriented Programming(이하 ROP)는 운영체제의 보호기법인 NX, PIC, PIE, ASLR을 우회하여 해커가 원하는 명령어를 가지고 실행할 수 있도록 조합하여 권한 상승을 하는 기법.쉽게말해서 이것 저것 제약이 걸린 상태에서 BOF, RTL과 같은 기법들이 수행되지 못하는 경우 원하는 함수를 실행하기 위해 필요한 값들을 하나하나 찾아 조합하여 실행시킬 수 있는 방법을 뜻합니다. 설명 ROP는 해커가 제약된 환경에서 쉘을 얻어내기 위해 조각들을 모아 실행 시키는 것을 말합니다. 간단한 예제를 통해서 어떠한 방식으로 ROP가 이루어지는지 살펴보도록 하겠습니다. 해당 소스코드를 보면 main에서는 .. 더보기
Return to Library Chain (RTL Chain) Return to Library Chain (RTL Chain) 개념 Return to Library Chain(이하 RTL Chain)은 BOF가 일어나는 취약한 프로그램에서 사용하고자 하는 라이브러리 함수들을 계속해서 호출하여 사용할 수 있는 기법.Rreturn Oriented Programming의 기본 바탕이 된다. 설명 RTL Chain은 RTL을 연속적으로 사용하여 원하는 함수를 사용하는 것을 말합니다. 간단한 예제를 통해서 알아보도록 하겠습니다. 위 C 코드는 main에서 buf의 16개의 공간에 argv[1]을 통해서 값을 저장시키는 함수입니다. 그러나 func1, func2, func3의 함수들은 실행을 할 수 없죠.하지만 앞서 공부한 내용들을 바탕으로 buf + SFP + Ret 구조라.. 더보기
Format String Bug (FSB) Format String Bug (FSB) 개념 Fortmat String Bug(이하 FSB) 는 printf()를 사용할 때 프로그래머의 실수로 인해 배열 안의 값을 printf("%s", buf)로 사용하는 것이 아니라 printf(buf)로 사용함에 있어서 나타나는 버그를 말한다. printf(buf)와 같이 소스코드를 작성하여 실행할 경우 buf안에 문자를 넣는 것이 아니라 서식문자, 지시자를 넣었을 경우 스택에 쌓여있는 값을 출력하는 버그를 발생한다. 설명 먼저 Format String에 대해서 알아보도록 하겠습니다. Format String은printf("num is %d \n, num"); 과 같이 작성된 코드에서 "num is %d \n"를 말합니다. 쉽게 생각하면 printf()안에서 .. 더보기
Return To Library (RTL) Return To Libray (RTL) 개념 NX Bit(Never Execute Bit)가 적용된 스택을 우회하기 위해서 사용되는 기법. * NX BitNX Bit는 프로세스 명령어나 코드 또는 데이터 저장을 위한 메모리 영역을 따로 분리하는 CPU의 기술. 지정된 모든 메모리 구혁은 데이터 저장을 위해서만 사용되며, 프로세서 명령어가 그 곳에 상주하지 않음으로써 실행되지 않도록 만들어준다. 설명 메모리 보호기법(DEP)의 NX Bit를 우회하여 사용하는 방법이 RTL입니다. 먼저 RTL에 대해서 설명하기 전에 알아야 할 개념이 Plt와 Got 입니다. http://kblab.tistory.com/217 RTL은 Plt와 Got를 이용하여 쉘을 실행시키는 방법입니다. 위 C 코드를 보면 argv로 받.. 더보기
Plt 와 Got Plt와 Got 개념 PLTProcdedure Linkage Table의 약자로 프로시져들을 연결해 주는 테이블을 말합니다. 프로그램을 어떻게 구현 했느냐에 따라 달라지기도 합니다.실제 호출 코드를 담고 있으며 이 내용을 참조해 _dl_runtime_resolve가 수행되고, 실제 시스템 라이브러리 호출이 이루어 집니다. GOTGlobal Offset Table의 약자로 함수들의 주소를 담고 있는 테이블입니다. 라이브러리 함수를 호출할때 PLT가 GOT를 참조하게 됩니다.첫 호출시엔 코드의 영역의 벡터 주소가 들어가 있고, 두번째 호출부터 그 함수의 실제 주소가 들어가져 있다. 설명 위 C 코드를 보면 매우 간단하게 printf와 puts를 사용하고 있습니다. 그저 단순 출력 소스코드 입니다. 해당 파일.. 더보기
Fake EBP Fake EBP 개념 변조시킬 Return Address에 \xbf(스택), \x40(라이브러리) 주소를 사용할 수 없을 때, Return Address 이후에 사용할 만한 공간이 없을 때 사용하는 방법.Save Frame Pointer Overwrite처럼 SFP를 변조하여 메모리의 다른 부분을 프로그램의 일부분 처럼 실행하도록 하는 기법입니다. 설명 위 C 코드는 LOB의 assassin 소스코드 입니다. strncpy를 이용해서 총 48자리까지 buffer에 값을 넣을 수 있습니다. 48까지라는 것은 buffer의 크기 40 + SFP 4 + RET 4까지 덮어 쓸 수 있다는 이야기입니다. gdb를 통해서 분석을 해보도록 하겠습니다. 일단은 r `python -c 'print "a"*40 + "AA.. 더보기
main의 SFP는 왜 0이 되는가? main의 SFP는 왜 0이 되는가? 목적 main함수 외 프로그래머가 만든 함수에 진입 시 ebp의 값을 저장하기 위해 SFP 공간에 ebp를 저장되는 것을 알 수 있다.하지만 main함수 또한 libc_start_main에서 넘어와 main함수가 시작 되는데, 그러면 main의 SFP에도 libc_start_main에서 사용된 ebp가 저장되어야 하지 않을까?라는 의문이 든다. 왜 main함수에서의 SFP의 값이 0이 되는지에 대해 분석해 보았다. 탐구 위와 같이 아주 간단한 C 코드를 작성하여 -fno-stack-protector -mpreferred-stack-boundary=2 옵션을 사용하여 컴파일 후 gdb로 분석을 합니다. gdb를 이용하여 실행 되기 전 i func 명령어를 통해서 함수들.. 더보기
Save Frame Pointer Overwrite (SFO) Save Frame Pointer Overwrite (SFO) 개념 Buffer Over Flow (이하 BOF, bof)가 일어나는 프로그램 취약점을 이용하여 Save Frame Pointer를 덮어씌워 원하는 주소로 이동하는 기법. 설명 앞서 BOF에 대해서 공부를 하셨다면 SFP Overwrite도 쉽게 이해 할 수 있을 것입니다. SFP는 Save Frame Pointer로 이전 함수의 ebp를 저장해 두어 함수의 실행이 끝나고 이전 함수로 돌아가기 위해 저장해두는 역할을 하게 됩니다. 위 C 코드를 보면 main 함수에서는 출력과, sub_func()을 호출합니다.sub_func에서는 buf가 8개의 공간이 할당 되어 있고, scanf를 이용하여 buf에 값을 저장합니다. 앞서 BOF의 포스팅 .. 더보기
Buffer Over Flow (BOF) Buffer Over Flow (BOF) 개념 Buffer Over Flow (이하 BOF, bof)는 정해진 공간에 정해진 만큼 값을 넣어야 하지만 "크기 제한"을 하지 않아 정해진 공간 보다 더 값을 넣을 수 있는 취약점을 말합니다. 가령, buf[10]이라는 배열을 만들었다면 buf라는 배열은 총 10개의 공간을 갖게 됩니다. 하지만, 프로그램이 실행 되면서 buf에 10개의 값이 아닌 11개, 12개 혹은 그 이상의 값이 들어가는 것을 확인하지 않고 처리함 으로서 발생하게되는 취약점을 뜻합니다. bof는 stack에서 발생하기 때문에 stack corruption 으로도 불립니다. 설명 위 소스코드를 보면 매우 간단한 프로그램입니다. buf라는 char형 배열은 총 8개의 공간을 갖고 있고, sc.. 더보기