System hacking training/Hackerschool LOB
-
LOB All Clear!System hacking training/Hackerschool LOB 2018. 10. 4. 14:56
드디어 미루고 미루던 LOB를 올클 하였다. login: death_knight Password: Last login: Mon Apr 23 00:33:26 from 192.168.0.1 [death_knight@localhost death_knight]$ ls dropped_item.txt [death_knight@localhost death_knight]$ cat dropped_item.txt You're so great! This is a token to the next gate. ,. ,' `. ,' __ `. ,'.-'____`-.`. ,'_.-'' ``-._`. ,',' /\ `.`. ,' /.._ O / \ O _.,\ `. ,'/ / \ ``-;.--.:-'' / \ \`. ,' : : \ ..
-
LEVEL 20 death_knight write-upSystem hacking training/Hackerschool LOB 2018. 10. 4. 14:56
xavius -> death_knight [xavius@localhost xavius]$ cat death_knight.c /* The Lord of the BOF : The Fellowship of the BOF - dark knight - remote BOF */ #include #include #include #include #include #include #include #include #include main() { char buffer[40]; int server_fd, client_fd; struct sockaddr_in server_addr; struct sockaddr_in client_addr; int sin_size; if((server_fd = socket(AF_INET, SOCK_..
-
LEVEL 19 xavius write-upSystem hacking training/Hackerschool LOB 2018. 8. 12. 18:47
nightmare -> xavius 풀이를 하였습니다. [nightmare@localhost nightmare]$ cat xavius.c /* The Lord of the BOF : The Fellowship of the BOF - xavius - arg */ #include #include #include main() { char buffer[40]; char *ret_addr; // overflow! fgets(buffer, 256, stdin); printf("%s\n", buffer); if(*(buffer+47) == '\xbf') { printf("stack retbayed you!\n"); exit(0); } if(*(buffer+47) == '\x08') { printf("binary im..
-
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..