[▒] 보안/LOB
LOB 주소로 6666 포트에서 연결을 받고 있네요. Reverse TCP Shellcode를 보내면 될 것 같습니다. qhdks.tistory.com/68 Shellcode - Shell Reverse TCP Shellcode 환경 UBUNTU 16.04.07 VMware Workstation 15 Player 개요 Shell Reverse TCP Shellcode란 Remote BOF 기법에서 쓰이는 쉘코드로, Reverse connection 방식을 이용한다. 다른 방식에는 Bind가 있으며 추후에 다룰.. qhdks.tistory.com 위에 나와있는 내용은 로컬에서만 먹히는 쉘코드였습니다. 즉, 이 문제에는 안먹힌다는 소리죠 ㅋㅋ 이 사실을 알아내는데에 많은 시간을 날려먹었네요. 그래서 앞으로 ..
스택, LD_, 공유 라이브러리, 라이브러리 함수, 바이너리 코드. 여러가지를 못쓰네요. 보통 argv[1]을 사용할 때는 main 함수 프롤로그에서 main 함수보다 먼저 push 된다는 사실은 이미 수없이 접해왔기 때문에 알 수 있었습니다. 하지만, stdin을 통해 입력을 받는다면 어디에 저장되어있다가 buffer로 복사될까요? 인자를 보면 알 수 있습니다. 딱봐도 stdin => buffer로 들어가게 되는데요. stdin을 gdb 도구를 통해 알아봅시다. 제일 처음 들어오는 인자인 0x8049a3c라는 위치가 stdin을 가리키는 위치인 것 같네요. A 100개를 넣고 돌려보겠습니다. 아까 그 주소를 확인했더니, stdin이라는 문구에 0x401068c0이라는 값이 들어있었습니다. 또한 0x40..
위에 PLT가 써있길래 PLT와 연관된 GOT Overwrite에서 열심히 공부했는데 이걸로 푸는 문제가 아니더군요 ㅋㅋ 아쉬워서 간단하게 어떤 원리인지만 적겠습니다. GOT Overwrite PLT : 어떠한 코드를 담고 있습니다.(GOT로 JMP하는 코드) GOT : 실제 함수의 주소 또는 PLT+6의 주소를 담고 있습니다. PLT의 주소에 포인터를 첨가해 원하는 주소를 가리키면 됩니다.(system 함수 등) set *0x80~~ = 0x400~~ 위에서 확인할 수 있듯이 set을 통해 프로그램 흐름을 바꾸는 것은 gdb 도구를 사용했을 때만 가능합니다. 따라서, 저는 이 기법으로 문제를 푸는것이 아니라는 판단을 하고, strcpy의 함수 원형을 확인했습니다. char* strcpy(char* de..
어우.. 기네요. 사실 별거없는 문제입니다. 'MO'라는 사용자정의 함수에 system 함수가 존재하기 때문에 RET을 연계해 "/bin/sh"라는 문자열만 전달하면 됩니다. payload로 넣어야할 값을 간단하게 적어보겠습니다. "A"*44 | addr 'DO' | addr 'GYE' | addr 'GUL' | addr 'GUL' | addr 'YUT' | addr 'MO' | dummy(4) | &"/bin/sh" | "/bin/sh" 이제 필요한 재료들을 모아보겠습니다. 각각의 주소가 나와있네요. 참고로 "/bin/sh"의 주소는 40으로 시작하기에 초기화되어있습니다. 따라서 "/bin/sh" 문자열을 직접 payload에 입력해 저장되는 주소를 인자로 주겠습니다. .c 확장자 소스파일을 복사해 저..
buffer에 48글자 입력받고, 스택주소 사용 X, LD_PRELOAD 사용 X, 인자 한 개 X 제약 조건엔 별로 없네요. FPO를 쓸까해서 봤더니 사용자 정의 함수가 없기 때문에 불가능하고, FS는 당연히 아니고, RET Sled를 쓸까했더니 딱 RET 덮을 때까지만 받기 때문에 안되네요. 문제 위를 보면 FEBP라고 나와있습니다. 이는 Fake EBP로, EBP를 속인다는 뜻이죠. 원리는 이렇습니다. 함수의 에필로그는 leave와 ret으로 이루어지죠. mov esp, ebp pop ebp leave -------------------------- pop eip ret jmp eip 여기서 leave는 SFP에 지정된 주소를 사용합니다. 만약, SFP에 쉘코드 주소가 있다면 어떻게 될까요? 이 점..
이번에는 '\xbf', '\x40'를 검열하는 것으로 보아 스택과 공유 라이브러리를 못쓰게한 것 같네요. 처음엔 이것을 그냥 그저 안쓰려고 하고, 힙과 데이터 영역에서 그 해답을 찾고있었습니다. 하지만, 조금의 힌트를 얻고자 검색을 했습니다. 그러자 RET Sled를 이용하라고 하더군요. 딱 이거 읽자마자 나왔습니다. RET Sled, 무슨 뜻일까요? 지금까지는 NOP Sled만 이용해왔습니다. NOP 바이트는 아무것도 수행하지않는 어셈블리어 연산으로 눈썰매 타듯이 내려가 쉘코드를 실행하곤 했죠. 그렇다면 RET Sled도 ret를 여러번 실행하는 것일까요? 저는 차근차근 생각해보기로 했습니다. ret를 여러번 실행하게 되면 어떻게 되지? RET에는 주소가 담겨있습니다. 이를 POP하며 4바이트를 더함과..
이번엔 엄청 복잡한 소스코드가 보이네요. 상단에는 RTL2 라고 써있습니다. 아무래도 RTL chain 공격을 하라는 것 같습니다. 함수와 함수를 연계하라는 것이죠. 위에서도 볼 수 있듯이 execve를 사용하라는 듯 보이네요. execve - system - exit - "/bin/sh\x00" 순으로 메모리에 넣어주면 될 것 같습니다. RET - RET - RET - argv 먼저 파일을 복사하겠습니다. 이제 디버깅을 통해 execve, system, exit의 주소를 알아내겠습니다. execve : 0x400a9d48 exit : 0x400391e0 system : 0x40058ae0 이제 "/bin/sh\x00" 주소를 찾아봅시다. 소스코드를 작성하고, 컴파일 뒤에 실행하면 주소가 나옵니다. "/..
48번째의 글자가 '\xbf'가 되는 것을 검열하네요. 이는 스택 전체를 못쓴다고 봐야죠. 이로써 공유 라이브러리를 사용해야겠다고 어느정도 유추가 가능하죠. 그렇다면 공유메모리를 어떻게 써야할까요? 상단에 힌트가 있습니다. 바로, RLT이죠. RLT 기법이란 Return-to-libc로 NX bit 즉, 스택에 쉘코드를 삽입하고 이를 악용하는 것을 우회하는 기법입니다. 공유 라이브러리에서 system 함수가 있는지 확인해보죠. 0x40058ae0이 공유 라이브러리에 있는 system 함수의 주소네요! 이제 system 함수에 "/bin/sh"문자열이 있는지 확인해보겠습니다. 소스코드를 직접 작성해 메모리 값을 하나씩 늘려가며 "/bin/sh\x00"과 일치하는지 확인하고 일치하다면 주소를 던지도록 했습니..
이번에는 main 함수의 인자 개수가 두 개 이상이기만 하면 되고, 사용자정의 함수가 보이네요. 그리고 문제 상단에 보면 FPO라고 나와있습니다. FPO란 Saved Frame Pointer Overwrite로 SPO라고도 불립니다. SFP를 이용해 BOF를 야기하는 것입니다. 이 기법에 관한 것은 따로 자세하게 글을 올릴 예정입니다. 먼저 파일을 복사합니다. 이제 디버깅을 합시다. problem_child 함수의 내용을 봅니다. FPO 공격에서 핵심은 에필로그로 leave와 ret을 잘봐야겠죠? problem_child+41로 break pointer를 겁니다. 이제 인자로 A 40개를 줍니다. 성공적으로 도달했습니다. 이제 메모리 값을 살펴보겠습니다. 처음의 8바이트(0xbffffa8c~0xbffff..