$ 시스템 해킹 $/Los Of BufferOverflow
-
Level19 (nightmare -> xavius)$ 시스템 해킹 $/Los Of BufferOverflow 2020. 1. 1. 14:47
이번 문제의 키워드는 arg 입니다. stack영역 사용 불가능, binary 영역 사용 불가능 leave 와 ret로 끝나는 libc 함수도 사용 불가능 합니다. stack도 RET를 제외하고 모두 초기화를 시킵니다. 또한 취약한함수로 fgets 를 사용하고 stdin 을 사용합니다. \xbf , \x08 로 시작하는 값은 이용할 수 없기 때문에 stdin 영역이 사용하는 주소가 \xbf, \x08이 아니라면 쉽게 해결할 수 있을 것 같습니다. 먼저 stdin 부분에 break를 걸어서 stdin 중에서 어디에 데이터가 들어가는지 알려가보겠습다. 3번째 push 된 값인 ds:0x08049a3c가 stdin 이라는 것을 알 수 있습니다. fgets 전과 후를 break 해서 비교해 보도록하겠습니다. 먼..
-
Level18 (succubus -> nightmare)$ 시스템 해킹 $/Los Of BufferOverflow 2020. 1. 1. 14:44
이번 문제의 키워드는 PLT입니다. 코드를 보면 RET에 strcpy의 주소를 넣어야 하는 것으로 보이네요! 하지만 memset으로 RET이후에 오는 4byte 까지 A로 초기화를 하게 됩니다. strcpy의 PLT를 이용하는 문제 인것 같지만 간단하게 strcpy을 이용한 간단한 문제 풀이로도 풀이가 됩니다. strcpy의 기본 형식은 아래와 같습니다. 해당 문제는 아래의 페이로드로 문제를 해결해 보려고 합니다. [system 주소] + [Dummy 4 byte] + ["/bin/sh 주소"] + [Dummy 32 byte] + [strcpy 주소 (실행 파일 RET)] + [Dummy 4 byte] + [ebp+8주소 (strcpy Dest)] + [buf 주소 (strcpy Source)] 위의 페..
-
Level17 (zombie_assassin -> succubus)$ 시스템 해킹 $/Los Of BufferOverflow 2020. 1. 1. 14:43
소스코드가 좀 많이 길어졌습니다. DO -> GYE -> GUL -> YUT ->MO 순으로 함수를 호출해서 system(cmd) 를 이용하는 문제입니다. argv[1]에는 libc를 사용할 수 없고, RET 에는 DO 함수의 주소가 들어가야 합니다. 일단 RET를 DO함수 주소로 맞춰주면 아래와 같이 페이로드를 작성하면 됩니다. [Dummy 44 byte] + [DO 함수 주소 (프로그램 RET)] + [GYE 함수 주소 (DO 함수 RET)] + [GUL 함수 주소 (GYE 함수 RET)] + [YUT 함수 주소 (GUL 함수 RET)] + [MO 함수 주소 (YUT 함수 RET)] 의 형식으로 넣어야 할것 같습니다. 각 함수의 주소를 objdump를 이용해서 알아보겠습니다. DO : 0x080487..
-
Level16 (assassin -> zombie_assassin)$ 시스템 해킹 $/Los Of BufferOverflow 2020. 1. 1. 14:39
15번 문제와 다른 부분은 strcpy가 strncpy로 바꼈다는 것과, RET 까지만 입력을 받는다 것 뿐입니다. 이번문제는 FEBP라는 키워드를 이용해야 하는 것 같습니다. FEBP는 Fake EBP의 약자로, EBP를 조작하여 leave-ret Gadget을 이용해서 IP(Instruction)를 조작하는 공격 기법입니다. RET에 Stack주소와 Libc 주소를 쓰지 못할때 사용합니다. 사용할 페이로드는 아래와 같습니다. [ &system ] + [Dummy 4 byte] + [ &"/bin/sh" ] + [Dummy 28 byte] + [ &buf-4 (Fake EBP in SFP) ] + [ &leave (RET) ] 필요한 주소를 모아보면 아래와 같습니다. system과 "/bin/sh"의 ..
-
Level15 (giant -> assassin)$ 시스템 해킹 $/Los Of BufferOverflow 2020. 1. 1. 14:38
이번에는 no stack, no RTL 이라고 되어 있습니다. 스택과 RTL 기법에 이용되는 libc를 사용할 수 없고, buffer+sfp hunter로 44까지 0으로 초기화 됩니다. stack과 libc 가 안된다면 함수 내부의 명령어 주소를 RET에 넣어서 문제 풀이를 하면 될 것 같습니다. RET에 다시 RET를 넣게 되면 system 주소를 이어서 넣을 수 있기 때문에 가능할 것 같습니다. 사용하게될 exploit 페이로드는 아래와 같습니다. [Dummy 44 byte] + [ret (실행파일 RET 위치)] + [system (추가한 RET의 RET위치)] + [Dummy 4 byte] + [/bin/sh] 똑같은 libc를 사용하고 있기 때문에 system 주소와 /bin/sh 주소가 매번..
-
Level14 (bugbear -> giant)$ 시스템 해킹 $/Los Of BufferOverflow 2020. 1. 1. 14:37
소스코드를 확인해 보면 좀 길어졌습니다. RTL2로 RTL을 이용하는 2번째 문제인것 같습니다. 주석을 위아래로 싸고 있는 코드를 살펴 보면 execve의 주소를 가져오는 기능을하는 코드라는 것을 확인 할 수 있습니다. 또한 RET에 execve의 주소를 넣지 않으면 안된다는 것을 알 수 있습니다. 하지만 문제가 되는 부분이 있습니다. 아래의 코드는 /home/giant/assassin에 접근을 하는 코드인데 기존에 tmp에 실행파일을 복사 해서 문제를 해결 했었는데 권한을 가질 수 없습니다. 그렇기 때문에 실행파일을 복사해서 문제를 해결할 수 없습니다. 그렇기 때문에 소스코드를 복사해서 소스코드를 좀 수정해서 컴파일을 해야 할 것 같습니다. 아래의 경로부분을 수정해 주면 됩니다. gcc를 이용해서 컴파..
-
Level13 (darkknight -> bugbear)$ 시스템 해킹 $/Los Of BufferOverflow 2020. 1. 1. 14:34
이번 문제는 RTL 기법을 이용한 문제인 것 같습니다. RET부분에 해당되는 argv[1][47]의 값이 \xbf 가 되면 안되는것 같습니다. RTL 이란? Return To Library의 약자로 동적 라이브러리 영역에 존재 하는 함수의 주소를 이용해서 바이너리에 존재하지 않는 함수를 사용할수 있도록 하는 기법입니다. 바이너리에 존재 하지 않는 함수는 system 함수, execl 함수 등이 있습니다. 이전 문제들 에서는 stack 에다가 shellcode를 넣어서 문제를 해결 했었지만 stack 의 주소를 보면 0xbf~~~~~~로 RET에 넣을수 없는 주소입니다. 그렇기 때문에 RTL 기법을 이용해서 문제를 해결 해야 합니다. 쉘을 실행하기 위해서는 쉘코드가 아닌 system 함수를 사용하는데 /b..
-
Level12 (golem -> darkknight)$ 시스템 해킹 $/Los Of BufferOverflow 2020. 1. 1. 14:33
위의 코드를 확인해 보면 FPO 기법을 이용하는 문제 입니다. SFP는 무엇인가, FPO 기법이 무엇인가 에 대해서 먼저 공부를 해봐야 할 것 같습니다. FPO를 사용하기 위해서는 필요한 조건이 존재 합니다. 1. SFP 영역에서 1바이트 오버플로우가 반드시 일어나야 합니다. (strncpy에 보면 41-40 = 1 바이트) 2. 메인 함수 이외의 sub 함수가 필요합니다. (main 함수 이외에 problem_child 함수가 존재 한다.) SFP 란? Stack Frame Pointer의 약자로 Saved Frame Pointer 라고도 불립니다. 이전의 함수의 EBP 주소를 저장하는 공간 입니다. 1바이트를 이용해서 OverFlow를 실행해야 하는데, 여기서 1바이트는 SFP의 첫 바이트를 이야기 ..