System hacking training
-
LEVEL 18 nightmare write-upSystem hacking training/Hackerschool LOB 2018. 6. 27. 09:03
succubus -> nightmare nightmare문제를 풀었으니 LOB도 얼마 남지 않았네요 ㅎ 생각해보면 꽤 오래 끌었군요...! FTZ 는 6개월 정도가 걸린것 같은데 LOB도 3개월 정도 걸리겠네요 ㅎㅎ (언제 갓되는지..) 암튼 문제는 이렇습니다. 코드 분석부터 하겠습니다. 1. 인자에 바이너리명 빼고 한개 더 줘야한다. 2. check address에서 char 형 포인터 변수 addr에 strcpy()의 PLT를 받아와서 argv[1]+44 즉 ret 공간의 주소값과 memcmp()를 통해 비교를 하여 다르다면 예외처리를 하며 바이너리를 종료한다. 3. overflow! 부분에서 strcpy()를 이용하여 buffer에 argv[1]의 값을 때려박는다. 4. dangerous water..
-
LEVEL 17 succubus write-upSystem hacking training/Hackerschool LOB 2018. 5. 17. 20:42
zombie_assassin -> succubus 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394[zombie_assassin@localhost zombie_assassin]$ cat succubus.c/* The Lord of the BOF : The Fellowship of the BOF - succubus - calling functions continuously */ #include #include #include // the ..
-
LEVEL 16 zombie_assassin write-upSystem hacking training/Hackerschool LOB 2018. 5. 13. 17:09
assassin -> zombie_assassin 소스코드를 분석해보면 힌트부분에 FEBP라는 중요한 힌트가 있다. Fake EBP라는 기법을 이용하면 풀릴것같다. 인자는 2개 이상이여야하고, argv[1][47]이 이전 문제와 동일하게 \xbf, \x40이면 예외처리가 된다. 그리고 strncpy()로 buffer에 argv[1]의 값을 48개 받기 때문에 bof가 터진다. 이 문제의 의도에 맞게 Fake ebp 기법을 이용하여 문제를 풀면된다. Fake ebp에 대해서는 자세하게 따로 다루기로 하고 페이로드를 짜는 요령만 먼저 익혀보자. 사실 Fake ebp 는 FPO와 매우 유사하기 때문에 풀이가 쉬웠다. 먼저 페이로드의 구성은 다음과 같다. `python -c 'print "dummy(4byte)..
-
LEVEL 15 assassin write-upSystem hacking training/Hackerschool LOB 2018. 5. 13. 15:37
giant -> assassin [문제 + 힌트] 소스코드 먼저 분석을 해보면 argc가 2이상 즉 인자값이 2개 이상이여야하고 argv[1][47] 가 \xbf 혹은 \x40이면 안된다. 저 말은 return 할 주소가 \xbf 로 시작하는 스택의 어느 공간도 안되고 \x40으로 시작하는 코드영역도 안된다는 것이다. 그리고 취약점은 strcpy()의 사용으로 인해서 bof가 터진다. 그 후 memset()로 buffer+SFP를 0으로 초기화하면서 프로그램이 종료된다. 이 문제는 간단하게 ret가젯을 이용하여 쉽게 우회가 가능하다. ret의 주소는 \xbf도 \x40도 아니기 때문에 ret 가젯을 이용하여 system()를 불러오던 환경변수에 쉘코드를 넣고 쉘코드를 실행시키던 할 수 있다. objdum..
-
LEVEL 14 giant write-upSystem hacking training/Hackerschool LOB 2018. 5. 12. 19:45
bugbear -> giant 소스코드를 분석해보면 인자가 두개 이상인지 먼저 체크하고 맞다면 gain address of execve 부분을 통해서 execve()의 주소를 구해온다. 이 주소를 구하는 방법은 먼저 lib_addr에 libc의 base주소를 구하고, execve_offset에 execve()의 offset을 구하여 마지막 execve_addr에 lib_addr + (int)execve_offset을 하여 execve()의 주소를 구한다. 그리고 memcpy()를 이용하여 ret에 argv[1][44]의 값을 넣고 execve()의 주소와 같은지 확인한다. 다를경우 예외처리가 되고 같을 경우 strcpy()를 통해 bof가 터진다. 따라서 익스를 하기 위해서는 execve()의 주소를 a..
-
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..
-
FPO (Frame Pointer Overflow)System hacking training/Knowledge 2018. 4. 26. 00:57
안녕하세요. FPO (Frame Pointer Overflow) 에 대해 포스팅을 시작하겠습니다. 먼저 FPO 란? SFP의 1byte를 overflow (overwrite) 하여 실행코드가 있는 원하는 주소로 eip 를 변조하는 기법입니다. 이를 학습하기 위해서는 함수 에필로그 과정을 이해하고 있어야하는데요. LOB golem의 문제를 예로들겠습니다. 이 바이너리에는 main()와 problem_child 라는 서브 함수가 있습니다. problem_child 함수에는 buffer[40]으로 버퍼가 40byte 할당됩니다.또 이 바이너리는 buffer가 40byte 할당되었지만 SFP가 1byte 오버플로우가 일어납니다. 본격적으로 에필로그에 대해서 알아봅시다. 함수 에필로그에는 leave 와 ret i..
-
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..