System hacking training/Protostar
-
Stack7 풀이System hacking training/Protostar 2019. 4. 11. 01:50
#include #include #include #include char *getpath() { char buffer[64]; unsigned int ret; printf("input path please: "); fflush(stdout); gets(buffer); ret = __builtin_return_address(0); if((ret & 0xb0000000) == 0xb0000000) { printf("bzzzt (%p) ", ret); _exit(1); } printf("got path %s ", buffer); return strdup(buffer); } int main(int argc, char **argv) { getpath(); } Stack의 마지막 문제 풀이를 해봤습니다. 이 문제의..
-
heap2 풀이System hacking training/Protostar 2018. 12. 22. 22:30
[heap2.c] heap2는 heap overflow, use after free를 이용한 문제인것 같다. 코드상에 auth chunk의 데이터가 들어가는 주소를 출력해주는 부분이 있는데, 이를 이용해서 쉽게 "you have logged in already!"라는 문구를 띄울 수 있다. 처음 "auth "를 입력하면 auth구조체의 크기 만큼 malloc을 해주는데 이 위치가 0x804c008이다. 이후 service를 입력하면 0x804c018의 위치에 메모리를 할당 받고, string을 복사해주는데, 이는 strdup()의 특성이다. strdup()는 malloc() + strcpy()인데, malloc()을 호출하여 string의 사본에 대한 기억장치 공간을 예약한다. 예를 들어 strdup("..
-
heap1 풀이System hacking training/Protostar 2018. 12. 21. 11:57
[heap1.c] #include #include #include #include #include struct internet { int priority; char *name; }; void winner() { printf("and we have a winner @ %d\n", time(NULL)); } int main(int argc, char **argv) { struct internet *i1, *i2, *i3; i1 = malloc(sizeof(struct internet)); i1->priority = 1; i1->name = malloc(8); i2 = malloc(sizeof(struct internet)); i2->priority = 2; i2->name = malloc(8); strcpy..
-
heap0 풀이System hacking training/Protostar 2018. 12. 21. 10:23
[heap0.c] #include #include #include #include #include struct data { char name[64];};struct fp { int (*fp)();};void winner(){ printf("level passed\n");}void nowinner(){ printf("level has not been passed\n");}int main(int argc, char **argv){ struct data *d; struct fp *f; d = malloc(sizeof(struct data)); f = malloc(sizeof(struct fp)); f->fp = nowinner; printf("data is at %p, fp is at %p\n", d, f);..
-
Stack6 풀이System hacking training/Protostar 2018. 2. 16. 21:20
[문제] 문제를 보면 쉘코드를 올려서 문제를 풀 수 없도록 되어있네염 0xbf로 시작하는 모든 주소는 예외처리에 걸리기 때문이지요~ㅎ 하지만 취약점은 존재합니다. 역시나 gets()를 사용하였기 때문에 bof 취약점이 존재하는데요. 쉘코드를 쓸 수 없지만 쉘을 띄우기 위해서는 RTL이라는 기법을 쓸 필요가 있겠네요~ 보면 메인은 별게 없고, getpath()를 보면 총 스택공간을 0x68 (dec : 104) 만큼 할당하고 ebp-76이 buf의 시작주소임을 알 수 있습니당 그렇다면 SFP까지 총 80 byte 더미값을 채우고 system()를 return address로 덮고, 인자값을 주기 위해 더미 4 byte 채운뒤 /bin/sh이 위치한 주소를 적어주면 system("/bin/sh")가 실행되어..
-
Stack4 풀이System hacking training/Protostar 2018. 2. 4. 20:59
[문제] 이전문제와는 다르게 함수 포인터가 없다. 하지만 여전히 gets() 사용으로 인해 bof 취약점이 존재한다. ret 을 win()의 주소로 변조시키면 win()가 실행될것이다. [풀이] gdb로 열어보면 main()에서 80바이트의 공간을 할당한 것을 알 수 있다. 따라서 SFP와 buffer[64] 사이의 dummy가 들어가는지 체크할 필요가 있다. 예상한 스택 구조는 이러하다. | char buffer[64] | dummy | SFP | RET | 따라서 buffer와 dummy, sfp를 A로 모두 덮고 마지막에 win()의 주소를 넣어줬다.
-
Stack3 풀이System hacking training/Protostar 2018. 2. 4. 16:13
[문제] win()를 실행시키면 된다. 이 프로그램 역시 gets()의 사용으로 bof 취약점이 존재하고 이 취약점을 이용하여 함수 포인터 fp에 win()의 주소를 넣어주면 된다. [풀이] dummy값 확인을 위해 gdb로 열어본다. win()의 주소도 함께 알아보았다. 이 프로그램 역시 페이로드에 참고해야할 dummy값이 없다. 즉, 함수 포인터 fp와 char buffer[64]가 붙어있다는 뜻이다. 따라서 gets()의 bof 취약점을 이용하여 64 바이트 A를 넣어주고, 위에서 구한 win()의 주소를 구하면 성공한다. 주소가 정확히 win()의 주소로 변경이 되었음을 확인할 수 있다.
-
Stack2 풀이System hacking training/Protostar 2018. 2. 4. 15:49
[문제] 문제를 보면 variable에 getenv()를 이용하여 환경변수의 값을 넣어주는것을 볼 수 있다. 그리고 취약점은 역시 strcpy() ! 문자열의 길이를 검사하지 않기 때문에 bof 취약점이 존재한다. 풀이를 위해 buffer[64] 와 modified 사이의 offset을 구해야한다. 이는 gcc 컴파일 과정에서 들어가는 쓰레기값 즉, dummy 값이 존재하는지 확인을 하기 위함이다. [풀이] 먼저 gdb로 열어본다. dummy 값만 체크를 해보자. 아 여기서 dummy 값은 문제 풀이를 위해 modified 와 buffer[64] 사이만 확인을 했다. 결과는 이전 문제와 동일하게 없었다. 따라서 이 프로그램의 스택 구조를 확인해보면 이러하다. | char *variable(esp) | d..