System hacking training
-
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으로 세팅하는것을 확인할 수 있다. 그렇다면 남은 공간은 스택의 낮은 주소가 있다. 이해를 위해 그림을 그려보면 현재 스택은 이러한 형태..
-
x64 BOF(Buffer Overflow)System hacking training/Knowledge 2018. 4. 18. 20:32
오늘은 x64 즉 64 bit 환경에서의 buffer overflow에 대해 포스팅하겠습니다. 먼저 x86 vs x64에 대해 선행 지식이 필요합니다. 바이너리 하나를 받았는데 이제서야 풀이해보네요.ㅠ 먼저 바이너리를 확인해보겠습니다. char buffer가 256 byte로 할당되었지만 gets()의 사용으로 인해 bof가 터집니다. gets()는 NULL문자가 오기전까지 모든 문자열을 입력받는데 바로 여기서 ret 를 침범하여 우리가 원하는 shell()를 실행할 수 있습니다. 이전의 x86 bof 문제에서 처럼 payload를 구성해보면 [x86 payload] python -c 'print "A"*256+"SFP(4)"+"ret(4)"' 이렇게 buf 를 의미없는 문자로 덮어주고 SFP를 4byt..
-
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]를..
-
[x86 vs x64] Memory AddressSystem hacking training/Knowledge 2018. 3. 19. 22:18
오늘은 x86과 x64에 대해 전반적으로 정리를 하겠다. 추후 x86의 BOF, RTL, ROP 등 64 bit환경에서의 공격 기법에 대해서도 포스팅하겠다. x86 vs x64하면 가장 먼저 떠오르는 것은 메모리 주소 체계일것이다. x86의 메모리 주소 체계는 이러하다. [x86] Memory Address (windows 기준) 0x0000 0000 - 0xffff ffff 0x0000 0000 - 0x7fff ffff (User Section, Ring3)0x8000 0000 - 0xffff ffff (Kernel Section, Ring0) 0x0000 0000 부터 0xffff ffff 까지 사용할 수 있는 주소 공간이 있고,이는 unsigned int의 범위 0 ~ 4294967295와 동일하다..