본문 바로가기

시스템 해킹59

[Dreamhack] oneshot // gcc -o oneshot1 oneshot1.c -fno-stack-protector -fPIC -pie #include #include #include #include void alarm_handler() { puts("TIME OUT"); exit(-1); } void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); signal(SIGALRM, alarm_handler); alarm(60); } int main(int argc, char *argv[]) { char msg[16]; size_t check = 0; initialize(); printf("stdout: %p\n", stdout); pr.. 2021. 5. 11.
[Dreamhack] Off_by_one_001 #include #include #include #include void alarm_handler() { puts("TIME OUT"); exit(-1); } void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); signal(SIGALRM, alarm_handler); alarm(30); } void read_str(char *ptr, int size) { int len; len = read(0, ptr, size); printf("%d", len); ptr[len] = '\0'; } void get_shell() { system("/bin/sh"); } int main() { char name[20];.. 2021. 5. 7.
[Dreamhack] basic_rop_x64 #include #include #include #include void alarm_handler() { puts("TIME OUT"); exit(-1); } void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); signal(SIGALRM, alarm_handler); alarm(30); } int main(int argc, char *argv[]) { char buf[0x40] = {}; initialize(); read(0, buf, 0x400); write(1, buf, sizeof(buf)); return 0; } 문제에서 주어진 코드는 위와 같다. 이번 문제는 basic_rop_x86과 비슷하다.. 2021. 5. 5.
[Dreamhack] basic_rop_x86 #include #include #include #include void alarm_handler() { puts("TIME OUT"); exit(-1); } void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); signal(SIGALRM, alarm_handler); alarm(30); } int main(int argc, char *argv[]) { char buf[0x40] = {}; initialize(); read(0, buf, 0x400); write(1, buf, sizeof(buf)); return 0; } 위 코드는 문제에서 주어진 파일의 코드이다. buf에 0x40의 공간을 할당하고 r.. 2021. 5. 3.
[Pwnable.kr] cmd1 문제: 엄마! 리눅스 환경변수가 뭐야? #include #include int filter(char* cmd){ int r=0; r += strstr(cmd, "flag")!=0; r += strstr(cmd, "sh")!=0; r += strstr(cmd, "tmp")!=0; return r; } int main(int argc, char* argv[], char** envp){ putenv("PATH=/thankyouverymuch"); if(filter(argv[1])) return 0; system( argv[1] ); return 0; } 위 코드는 문제에서 주어진 코드이다. putenv로 환경변수를 새롭게 설정하고 입력 값을 필터링하고 필터링을 통과하면 system 함수를 통해 입력 값을 쉘에.. 2021. 4. 21.
[Pwnable.kr] mistake 문제: 우리는 항상 실수를 한다. 시작해보자. (여기서 해킹 스킬은 필요없다. 진지하게 생각하지 말자.) #include #include #define PW_LEN 10 #define XORKEY 1 void xor(char* s, int len){ int i; for(i=0; i연산자를 잘못 사용하였다. fd가 0이므로 read 함수는 pw_buf에 입력한 문자열 갯수를 반환하는데 0보다 클것이므로 참이고 앞에 !가 붙어서 거짓이된다. scanf("%10s", pw_buf2); 위 코드는 pw_buf2에 입력을 받는다. xor(pw_buf2, 10); 다음 함수는 10만큼 xor 연산을 한다. if(!strncmp(pw_buf, pw_buf2, PW_LEN)) 마지막으로 pw_buf와 pw_buf2를 .. 2021. 4. 21.
[Pwnable.kr] flag 문제: 아빠가 포장된 선물을 사왔어, 빨리 열어보자! 문제에서 주어진 파일을 다운로드 받아서 IDA PRO나 gdb로 분석하면 upx 패킹이 되어있어 분석을 제대로 할 수 없다. 해당 문제에서는 IDA Pro 7.5에서 파일에 포함된 String 정보를 확인하면 upx라는 문자열이 있기 때문에 upx 패킹임을 확인할 수 있다. 패킹을 기본적으로 탐지하는 방법은 탐지 툴을 이용하면 편하다.\ 위 그림과 같이 upx 언패킹을 한다. 언패킹 후 gdb를 실행하면 flag 파일의 main 함수를 분석할 수 있다. 다음으로 flag라고 적혀있는 0x6c2070을 확인하겠다. 0x6c2070을 확인하면 flag의 주소 값이 존재하고 해당 주소에 있는 문자열을 확인하면 플래그를 볼 수 있다. 플래그: UPX...? .. 2021. 4. 19.
[Pwnable.kr] collision 문제: 아빠가 오늘 MD5 해쉬 충돌에 대해서 알려줬어. 나도 하고 싶어! 문제에서 주어진 포트에 ssh로 접속하면 3개의 파일이 주어진다. flag 파일은 권한이 없어 읽을 수 없고 col은 실행권한이 있다. col 실행파일은 setuid가 설정되어있어 일반 사용자가 col 안에서 col_own의 권한을 가지므로 flag를 출력할 수 있는 권한이 있다. #include #include unsigned long hashcode = 0x21DD09EC; unsigned long check_password(const char* p){ int* ip = (int*)p; int i; int res=0; for(i=0; i 2021. 4. 19.
[Dreamhack] off_by_one_000 #include #include mov esp ebp // esp가 ebp와 같은 곳을 가르키게 된다. mov ebp [esp] // 1바이트가 00으로 오염된 sfp 값을 ebp에 저장한다. add esp 4 // esp가 4바이트 만큼 더해진다. ret -> mov eip [esp] // sfp+4에 있는 ret 주소가 eip에 저장된다. add esp 4 // esp가 4바이트 만큼 더해진다. jmp eip // eip로 점프 현재 단계에서는 ret 주소를 건드릴 수 없지만 2번째 함수 에필로그에서 ret 주소를 오염시킬 수 있다. leave -> mov esp ebp // esp가 ebp와 같은 곳을 가르키게 된다. ebp는 위에서 오염되었기 때문에 현재 main 함수의 본래의 ebp가 아닌 엉뚱.. 2021. 4. 18.