본문 바로가기
반응형

pwnable63

Fake EBP Fake EBP EBP를 속이는 기법 입니다. ret 영역을 침범하여 입력값을 덮을 수 있을 때 사용합니다. (이 기법은 주로 ret까지만 덮어쓸 수 있고 특정 영역에 필터링 될 때 유용한 기법이다.) 이 공격의 핵심은 leave-ret 입니다. sfp를 조작하고, 처음 호출하는 ret 주소에 leave-ret 가젯을 실행시킴으로써 원하는 코드를 실행시킬 수 있습니다. 즉 sfp에 buf-4의 주소를 넣어주어 ebp가 buf-4로 가게하여 buf에 저장된 쉘코드가 온전하게 실행될 수 있도록 해줍니다. leave mov esp, ebp pop ebp ret pop eip jmp eip ret에다가 leave-ret가젯을 넣음으로서 총 2번 leave-ret 이 일어납니다. 먼저 처음 leave가 수행되면서.. 2021. 8. 10.
Frame Pointer Overwriting Frame Pointer Overwriting 이란 Fake ebp의 하위 개념으로써 서브 함수가 필요하고 1바이트 오버플로우가 일어나면 사용할 수 있는 기법입니다. 1byte overflow라고도 하네요 버퍼 위의 SFP 부분의 1바이트를 오버플로우 할 수 있게 되면 에필로그시에 ebp 레지스터를 조작할 수 있게 됩니다. 에필로그 과정은 leave ret 으로 이루어져 있는데 leave move esp,ebp pop ebp ret pop eip jmp eip 로 되어 있습니다. 만약 여기서 ebp를 변조시킨다면 leave가 수행되면서 변조된 주소로 내려가겠지요 그리고 ret가 수행될 것입니다. RET SFP BUFFER 의 형택의 스택이 존재할 때 이것을 RET SFP (1byte overflow) N.. 2021. 8. 10.
RTL이란? (Return to Library) RTL이란? Return To Library의 약자로서 Return 주소에 시스템 함수의 주소를 덮어 씌우고 인자로 /bin/sh의 주소를 넣는 방법입니다. 공유 라이브러리(libc)는 스택상에 있는 것이 아니기 때문에 가능합니다. 주로 NX bit(프로세서 명령어나 코드 또는 데이터 저장을 위한 메모리 영역을 따로 분리하는 CPU의 기술) 우회할 때 사용합니다. 즉 쉘코드 없이 exploit 가능합니다!! 시스템함수의 인자는 +8 위치에 넣어줘야 합니다. system() 또는 execl 함수는 ebp+8 위치의 값을 인자로 인식하기 때문입니다. 즉 공격을 할때 공유라이브러리의 시스템함수를 호출하고 (4) 더미값 (4) 그리고 인자값을 넣어주는 것입니다. RTL공격 코드는 버퍼값 + 시스템함수 주소(4).. 2021. 8. 10.
LOB Level20 xavius 마지막 xavius 로 접속합니다. 우선 소스코드를 보면 40바이트 buffer가 선언되어있고 6666포트를 여네요 그리고 recv(client_fd, buffer, 256,0) 에서 40바이트 buffer에 256바이트를 저장하네요?? 으잉? 오버플로우가 일어나는 코드네요. 우선 페이로드를 생각해보면 buffer 40 + ebf 4 + ret 4 + shellcode 입니다. 하지만 여기서 정확한 ret를 알수 없기 때문에 브루트 포싱해줍니다. 그런데 알고보니 로컬에서 사용하는 쉘코드와 원격으로 사용하는 쉘코드가 다릅니다. 원격으로 공격할때 로컬에서 쓰는 쉘코드는 동작하지 않습니다. 그 이유는 네트워크를 통해 쉘을 활성화 시켜 주어야 하기 때문입니다. 그래서 포트 바인딩 쉘코드를 사용할 건데 포트 바인.. 2021. 8. 10.
LOB Level 19 nightmare nightmare -> xavius 로 접속합니다. 소스코드를 보는데 뭐 다막아놨어요 우선 계속 strcpy 가 나오다가 갑자기 fgets가 나온 것에 의문이 듭니다. char *fgets(char *s, int size, FILE *stream); 이소스에서는 fgets(buffer, 256, stdin)이라고 되어있는데 여기서 stdin이 뭔지 궁금해서 검색해보면 stdin이란, 표준입력 파일 스트림으로 표준 입력을 이야기할 때 흔히 '버퍼'를 이야기한다고 합니다. 그렇다면 fgets로 입력받은 값들이 stdin에 저장되는 것 같습니다. 제대로 알아보기 위해 gdb로 보면 fgets (main+21)에 break 를 걸고 stdin을 보면 0x00000000 이군요... 여기서 이게 아닌가 싶었는데 .. 2021. 8. 10.
LOB Level 18 succubus succubus -> nightmare 로 접속합니다. plt라는 힌트와 함께 흠? ret 부분에 strcpy 의 주소가 들어가야 하네요 우선 plt에 대해서 공부하면 PLT(Procedure Linkage Table) PLT는 일종의 실제 호출 코드를 담고 있는 테이블로써 이 내용 참조를 통해 _dl_runtime_resolve가 수행되고, 실제 시스템 라이브러리 호출이 이루어지게 됩니다.. GOT(Global Offset Table) GOT는 PLT가 참조하는 테이블로써 프로시져들의 주소를 가지고 있습니다. PLT가 어떤 외부 프로시져를 호출할 때 이 GOT를 참조해서 해당 주소로 점프하게 됩니다. 한마디로 strcpy가 실행되는 것 같습니다. strcpy 구조 char * strcpy ( char .. 2021. 8. 10.
반응형