Wargame/pwnable.kr

    [Pwnable.kr] unlink 풀이 (10pt)

    unlink.c #include #include #include typedef struct tagOBJ{ struct tagOBJ* fd; struct tagOBJ* bk; char buf[8]; }OBJ; void shell(){ system("/bin/sh"); } void unlink(OBJ* P){ OBJ* BK; OBJ* FD; BK=P->bk; FD=P->fd; FD->bk=BK; BK->fd=FD; } int main(int argc, char* argv[]){ malloc(1024); OBJ* A = (OBJ*)malloc(sizeof(OBJ)); OBJ* B = (OBJ*)malloc(sizeof(OBJ)); OBJ* C = (OBJ*)malloc(sizeof(OBJ)); // doubl..

    [Pwnable.kr] horcruxes 풀이 (7pt)

    풀이 토들러 난이도 클리어까지.. 단 1문제! 이번 문제는 소스코드가 제공되지 않는다. 그래서 그냥 gdb로 계속 까보면서 풀었는데.. 풀고 다른 분들 Write-Up 보니까 전부 파일을 받아오더라.. 나도 이젠 그렇게 해야겠다. 먼저 main 함수쪽 어셈을 봐보자. 0x0809ff62 : call 0x809fc90 0x0809ff67 : add $0x10,%esp 0x0809ff6a : call 0x80a0324 0x0809ff6f : call 0x80a0177 처음에 디버깅하다가 엄청 짜증 났던 것이, alarm 함수 때문에 일정 시간이 지나면 프로세스가 종료된다. hint 함수를 출력하고 init_ABCDEFG 함수를 출력하는데 먼저 hint 함수가 뭔지 봐보자. 0x080a0324 : push e..

    [Pwnable.kr] memcpy 풀이 (10pt)

    풀이 다음은 memcpy.c의 코드이다. // compiled with : gcc -o memcpy memcpy.c -m32 -lm #include #include #include #include #include #include #include unsigned long long rdtsc(){ asm("rdtsc"); } char* slow_memcpy(char* dest, const char* src, size_t len){ int i; for (i=0; i= 64){ i = len / 64; len &= (64-1); while(i-- > 0){ __asm__ __volatile__ ( "movdqa (%0), %%xmm0\n" "movdqa 16(%0), %%xmm1\n" "movdqa 32(%0)..

    [Pwnable.kr] asm 풀이 (6pt)

    풀이 다음은 asm.c의 코드이다. #include #include #include #include #include #include #include #include #define LENGTH 128 void sandbox(){ scmp_filter_ctx ctx = seccomp_init(SCMP_ACT_KILL); if (ctx == NULL) { printf("seccomp error\n"); exit(0); } seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(open), 0); seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(read), 0); seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(..

    [Pwnable.kr] uaf 풀이 (8pt)

    풀이 Use After Free 취약점을 아는지 물어보는 문제이다. (나는 뭔지 몰라서 찾아봤다.) 다음은 uaf.cpp의 코드이다. #include #include #include #include #include using namespace std; class Human{ private: virtual void give_shell(){ system("/bin/sh"); } protected: int age; string name; public: virtual void introduce(){ cout

    [Pwnable.kr] blukat 풀이 (3pt)

    풀이 다음은 blukat.c의 코드이다. #include #include #include #include char flag[100]; char password[100]; char* key = "3\rG[S/%\x1c\x1d#0?\rIS\x0f\x1c\x1d\x18;,4\x1b\x00\x1bp;5\x0b\x1b\x08\x45+"; void calc_flag(char* s){ int i; for(i=0; i

    [Pwnable.kr] cmd2 풀이 (9pt)

    풀이 다음은 cmd2.c의 코드이다. #include #include int filter(char* cmd){ int r=0; r += strstr(cmd, "=")!=0; r += strstr(cmd, "PATH")!=0; r += strstr(cmd, "export")!=0; r += strstr(cmd, "/")!=0; r += strstr(cmd, "`")!=0; r += strstr(cmd, "flag")!=0; return r; } extern char** environ; void delete_env(){ char** p; for(p=environ; *p; p++) memset(*p, 0, strlen(*p)); } int main(int argc, char* argv[], char** env..

    [Pwnable.kr] coin1 풀이 (6pt)

    풀이 주어진 서버로 접속해보자. 이번 문제는 N개의 코인 속 안에 있는 1개의 위조 코인을 C번의 저울질을 이용해 찾아내는 문제다. 널리 알려져있는 저울 문제는 양팔 저울을 이용하지만 이 문제에서는 한팔 저울을 이용한다. 총 100개의 위조 코인을 발견하면 보상을 얻을 것이라고 한다. 코인 N개에 대해 주어지는 기회 C번은 $C\,=\, log_{2}{n} $다. 이번 문제는 이진 탐색을 이용해 문제를 해결할 수 있다. 다음을 예시로 들어보도록 하자. (코인은 0번부터 시작함) 코인: 100개, 기회: 7번 위조 코인: 87번 first = 코인 시작 넘버, last = 코인 마지막 넘버 1번째 first = 0, last = 50 0 - 50 사이에는 위조 코인이 없음. 2번째 first = 51, l..