본문 바로가기

/LOB

(7)
LOB #6 wolfman ID : wolfman Passwd : love eyuna - darkelf.c 내용을 확인 버퍼의 크기는 40이고, 코드의 내용은 위와 같다 - main 함수 디버깅 스택의 크기는 44 (buffer(40)+i(4))이므로 dummy값은 존재하지 않는다 sfp에서 40만큼 떨어진 거리에 buffer가 존재한다 - argv[1]의 길이가 48까지만 허용되므로 buffer(40) + sfp(4) + ret(4) =48만큼만 들어갈 수 있다 그러므로 쉘코드는 argv[1]에 들어가면 안된다 -> argv[1] 대신 argv[2]에 쉘코드를 넣고 argv[2]의 주소를 ret에 넣는 방법 사용 - argv[2]의 주소를 알아내기 위해 strcpy 다음 코드에 break point를 걸고 디버깅 창에서 다음과 ..
LOB #5 orc ID : orc Passwd : cantata wolfman에 다음레벨의 seteuid가 걸려있는 것 확인 가능! - wolfman.c 소스 코드 현재 버퍼의 크기는 40이고, 환경변수를 비우는 for loop문을 사용중이다. 또한 strcpy 함수를 사용해서 bof 취약점이 발생하고 있다. 이번 문제에서는 buffer hunter를 사용해서 buffer를 비우는 memset 함수를 사용하였지만 strcpy 함수 이후에 사용하였으므로 상관없음 -> lob 4번과 똑같은 방법으로 풀면된다! main 함수 디버깅으로 가기 전 extern에 대해 알아보고 가자! * extern extern 자료형 전역변수; : 선언한 전역 변수를 다른 파일의 코드에서 사용하고 싶을 때 extern 사용 - main 함수 디버..
LOB #4 goblin - argv[2] + NOP Sled이용 https://rsy99.tistory.com/42에서 main 함수에서 에 breakpoint를 건 이후를 기준으로 한다! 먼저 argv[2]의 주소를 알아내야 한다. 일단 argv[1][47]이 "\xbf"가 되어야 하므로 "\xbf"*48을 해준다. 그 후 " "(공백)를 추가 후 argv[2]를 삽입해줘야 한다. 우리는 argv[2]와 NOP Sled를 모두 이용할 것이므로 argv[2]에 "\x90"*100+"25byte shellcode", 총 125byte가 필요하다. 위와 같이 payload를 작성해준다. 그 후 "A"(41)이 나타나는 주소공간을 찾아주어야한다. 위에서 "00" 이후가 argv[2]의 주소공간이다! argv[2]의 공간 중 하나를 골라 ret에 넣어준다 ret -> 0xb..
LOB #4 goblin - NOP Sled 이용 ID : goblin Passwd: hackers proof 먼저 파일 목록을 살펴보면 orc 파일에 다음 level의 seteuid가 걸려있는 것을 확인할 수 있다 orc.c 소스 코드를 살펴보면, 먼저 버퍼의 크기가 40만큼 할당된 것을 알 수 있고, int i가 선언된 것을 확인 가능 또한 주어지는 인자의 개수가 2 미만이면 종료되는 것을 알 수 있다. 각 번호 별로 주요 소스 내용을 보면, ① * environ int main(int argc, char **argv, char **envp)에서 3번째 인자에 해당 : 환경변수 배열의 포인터. environ을 통해 모든 환경변수에 접근할 수 있으며, 마지막 항목 뒤에는 NULL 값을 가짐. main 함수의 세번째 매개변수를 이용하여 환경 변수 목록을..
LOB #3 cobolt ID : cobolt Passwd : hacking exposed 먼저 파일 목록을 살펴보면, goblin에 다음 level의 seteuid가 걸려있는 것을 확인할 수 있다. goblinl.c를 살펴보면, main 함수에서 gets 함수를 사용해서 버퍼오버플로우 취약점이 있는 것을 확인할 수 있다. ret과의 거리를 확인하기 위해 gdb를 이용해서 main함수를 디버깅하면, 에서 gets함수를 호출하고 있으며, 인자로 %eax=[%ebp-16]을 넘겨주는 것을 확인할 수 있다. 그러므로 ret과 buffer사이의 거리가 16bytes이고, 소스코드에서 버퍼가 16bytes였으므로 dummy값이 없이 모두 버퍼임을 확인할 수 있다. 그림으로 구조를 그려보면, 위와 같이 되며 16(buffer)+4(sfp)..
LOB #2 gremlin ID : gremlin Passwd : hello bof world cobolt에 gremlin 다음 level의 setuid가 걸려있는 것 확인 가능! cobolt.c를 확인하면, strcpy함수를 사용해서 버퍼오버플로우 취약점이 있는 것을 확인할 수 있다. gdb로 main 함수를 디버깅해보면, 에서 strcpy 함수를 호출하는데 인자로 주는 push 값을 보면 %eax=[ebp-16] 인 것을 확인할 수 있다. 즉, ret와 buffer 사이의 거리가 16bytes임을 알 수 있다 (자세한 이유는 LOB #1에 설명해놓음!) 구조를 그려보면, 위와 같이되며, 16(Buffer)+4(sfp)=20bytes만큼을 다른 데이터로 채워주고 ret값이 4byte를 쉘코드 주소로 변경해주면 exploit이 가..
LOB #1 gate ID : gate Password : gate ls -al 명령을 통해 gremlin 파일에 다음 레벨인 gremlin의 setuid가 걸려있는 것을 확인할 수 있다! gremlin.c 소스 코드를 보면, buffer의 크기는 총 256byte이고, strcpy()함수가 사용된 것을 확인할 수 있다 strcpy 함수는 버퍼에 크기를 제한받지 않고 입력받을 수 있기 때문에 버퍼오버플로우 취약점이 존재한다 이걸 통해 exploit 해보자! - main 함수 디버깅 exploit을 하기 위해서 ret와 buffer사이의 거리를 구해야 한다. 에서 strcpy를 호출하고 있으므로 호출 전에 push해준 %eax가 buffer가 될 것이다. 를 통해 %eax에는 [%ebp-256] 값이 들어가 있는 것을 확인할 ..