System hacking training/Hackerschool LOB
-
LEVEL 13 bugbear write-upSystem hacking training/Hackerschool LOB 2018. 4. 26. 01:54
darkknight -> bugbear [문제 + 힌트] 문제를 보면 bof는 터지지만 argv[1][47]의 값이 bf라면 예외처리가 되며 종료되기 때문에ret에 스택의 주소 말고 다른 영역의 주소를 적어야할것같다. 힌트 부분을 보면 알다시피 이 문제는 RTL을 이용하여 풀면된다. [Link - RTL 이란?] 페이로드는 `python -c 'print "A(dummy)" * 44 + "system() address" + "dummy 값" * 4 + "/bin/sh\00"'` 이런식으로 구성하면 된다. 이 페이로드를 작성하기 위해 준비물이 필요한데system()의 주소와 system()에 인자로 줄 /bin/sh\00가 필요하다. 그전에 이 바이너리가 static linked 인지 dynamic lin..
-
LEVEL 12 darkknight write-upSystem hacking training/Hackerschool LOB 2018. 4. 22. 03:42
golem -> darkknight 오늘은 golem을 풀이를 작성해보겠다. [문제 + 힌트] 문제를 보니 main()에서 하는 일은 인자가 2개 이상인지 검사하는 일뿐나머지의 처리는 problem_child()에서 처리한다. 그리하여 problem_child() 를 보니 기존의 bof 와는 다르게 strncpy()를 이용하여 입력의 길이를 제한했는데 buffer 는 40byte임에 불구하고 41byte 입력을 받을 수 있게 설계가 되어있다. 따라서 SFP의 하위 바이트 1byte를 Overflow(Overwrite) 할 수 있다. 그래서 뭘 할 수 있을까 생각하던 중 힌트 부분의 FPO가 보인다. FPO에 대해 알아봤는데 결정적인 힌트였다. FPO 란? ==> [Link] Frame Pointer Ov..
-
LEVEL 11 golem write-upSystem hacking training/Hackerschool LOB 2018. 4. 20. 05:47
skeleton -> golem 오늘은 golem에 대해 풀이를 하였다. 문제는 답정너였는데 풀이하는데 꽤 애먹었다. [문제 + 힌트] 문제를 보면 딱 답정너라는걸 알 수 있다. 역시 지금껏 풀어왔던 문제처럼 쉘코드를 어디에 넣을지...가 관건이다. 먼저 if(argv[1][47] != '\xbf') 일때 예외처리가 되면서 exit(0)로 바이너리가 종료된다. 따라서 스택에 쉘코드를 올리고 return 해야된다. 그런데 stack destroyer! 부분을 보면 ret 하기 전에 memset()로 buffer와 ret (buffer+8) 보다 높은 주소의 모든 스택을 0으로 세팅하는것을 확인할 수 있다. 그렇다면 남은 공간은 스택의 낮은 주소가 있다. 이해를 위해 그림을 그려보면 현재 스택은 이러한 형태..
-
LEVEL 10 skeleton write-upSystem hacking training/Hackerschool LOB 2018. 4. 11. 16:58
vampire -> skeleton [문제] 조건들이 많다. 하나씩 살펴보면 이러하다. 먼저 인자는 두개 이상 줘야하고 egghunter에 의해서 eggshell을 사용하여 익스플로잇할 수 없다.그리고 ret 주소의 마지막 바이트에는 \xbf가 들어가 있어야한다. 이 말은 즉 스택에 쉘코드가 있어야한다는 것으로 생각이 된다.그리고 argv[1] (첫 번째 인자)의 길이가 48이상이면 안된다.마지막으로 buffer와 argv[N]의 모든 값들을 0으로 초기화하며 종료한다. 그리하여 이전까지 넣어줬던 공간 argv, 환경변수, buffer가 모두 0이된다. [삽질 - 풀이와 무관함] 그리하여 살질을 하였는데.. 생각해낸 방법이 argc를 integer overflow하여 int의 범위를 넘어서 음수 혹은 0..
-
LEVEL 09 vampire write-upSystem hacking training/Hackerschool LOB 2018. 4. 4. 17:20
troll -> vampire 오늘은 vampire라는 문제를 풀이해 보도록 하겠다. [문제 + 힌트] vampire.c 파일을 열었을때의 모습이다. main()에서 인자를 한개 이상 받고 argv[1][47] 부분에서 \xbf 가 맞는지 아닌지 검사를 한다. 여기까지는 뭐 대충 이전 문제에서 많이 봐왔던 형태이다. 바뀐부분은 바로 here is changed 라는 주석이 달린 곳인데 이곳을 보게 되면 argv[1][46] 부분의 값이 \xff 와 같다면 but it's not forever 라는 문장을 출력하고 exit(0) 함으로써 종료를 시킨다. 그리고 그 밑에서 strcpy() 로 argv[1]의 값을 buffer에 그대로 복사해주는 것을 확인할 수 있는데바로 여기서 bof 취약점이 터지는 것을 ..
-
LEVEL 08 troll write-upSystem hacking training/Hackerschool LOB 2018. 3. 31. 20:28
orge -> troll [문제] troll.c 파일을 살펴보면 많은 조건들이 걸려있다. 그 조건들은 아래와 같다. 1. argc 는 무조건 2여야한다. 이 말은 즉 바이너리 이름 + 인자 1개가 아닐경우 종료시킨다는 것이다.2. egg hunter로 환경변수에 쉘코드를 올려도 0으로 초기화되므로 환경변수를 사용하는 것은 의미가 없다.3. argv[1] 첫번째 인자값 마지막에 \xbf 인지 검사한다.4. argument의 길이를 체크해서 48보다 크면 종료시킨다.5. strcpy() 의 사용으로 bof 취약점이 존재한다.6. one more 부분에서 argv[1]의 값을 0으로 초기화 해주면서 argv[1]에 쉘코드를 올리더라도 사용할 수 없다. 결론 : buffer hunter로 인해서 buffer에 ..
-
LEVEL 07 orge write-upSystem hacking training/Hackerschool LOB 2018. 3. 31. 03:07
darkelf -> orge [문제 + 힌트] orge.c 파일을 열어보면 바이너리에 대한 c 코드가 나온다. 먼저 이 바이너리는 strcpy()의 사용으로 인해 bof 취약점이 존재한다.strcpy()는 문자열의 길이를 확인하지 않아서 NULL 이전의 모든 문자를 복사하기 때문에main 함수의 인자 argv[1]에 40byte 이상의 문자열을 넣어준다면 return address 를 변조할 수 있을것이다. 따라서 우리는 이 바이너리를 이용하여 다른 행위를 가능케하는데 (쉘을 띄울 수 있다.)orge.c 파일을 보면 많은 조건들이 있다. 그 조건들은 아래와 같다. 1. argc < 2 이면 exit(0) 으로 종료한다. 인자가 2개 이상이여야한다. 2. argv[0]의 길이가 77이 아닐경우 역시 종료한..
-
LEVEL 06 darkelf write-upSystem hacking training/Hackerschool LOB 2018. 3. 21. 15:02
LOB darkelf에 대한 풀이를 하겠다. darkelf.c 를 열어보면 바이너리에 대한 c 코드가 나온다. 이 바이너리는 strcpy()로 buffer에 argv[1]의 문자열을 그대로 받아옴으로서 bof 취약점이 존재한다. 하지만 egghunter로 인해 환경변수에 쉘코드를 올려 사용할 수 없다.buffer hunter로 인해 buffer에 쉘코드를 올려서 쉘을 띄울 수 없다. buffer hunter로 인해서 strcpy() 호출 후 memset()로 buffer를 다시 0으로 세팅해주기 때문에 쉘코드를 buffer에 올리더라도 사용할 수 없다. 그리고 argument argv[1]의 길이를 체크하여 argument의 길이가 48보다 크면 오류 메시지를 출력하고 종료시킨다. 따라서 argv[2]를..