이번 포스트에서는 Pwnable의 cmd2 문제에 대해 다루겠다. 문제 코드는 다음과 같다. #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..
이번 포스트에서는 Pwnable의 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; } ## 문제 해석 : 문제 코드를 살펴 보니, "flag", "sh", "tmp"를 필터링하는 filter..
이번 포스트에서는 Pwnable의 lotto 문제에 대해 다루겠다. 문제 코드는 다음과 같다. #include #include #include #include unsigned char submit[6]; void play(){ int i; printf("Submit your 6 lotto bytes : "); fflush(stdout); int r; r = read(0, submit, 6); printf("Lotto Start!\n"); //sleep(1); // generate lotto numbers int fd = open("/dev/urandom", O_RDONLY); if(fd==-1){ printf("error. tell admin\n"); exit(-1); } unsigned char lot..
이번 포스트에서는 Pwnable의 blackjack 문제에 대해 다루겠다. ## 문제 해석 : 해당 문제는 블랙잭 게임 문제이다. 총 100만 달러를 획득하면 flag를 획득할 수 있는 것으로 보인다. 또한 문제에서 제공된 링크를 통해 해당 프로그램의 소스 코드를 확인할 수 있었고, 그 코드 중의 취약점을 통해 문제를 해결할 수 있다. 링크 : http://cboard.cprogramming.com/c-programming/114023-simple-blackjack-program.html ## 문제 풀이 : 문제 코드 중 일부는 다음과 같다. int betting() //Asks user amount to bet { printf("\n\nEnter Bet: $"); scanf("%d", &bet); if..
이번 포스트에서는 Pwnable의 coin1 문제에 대해 다루겠다. 문제는 다음과 같다. ## 문제 해석 : 가짜 코인을 찾는 문제이다. N는 동전의 갯수이며 C는 시도 가능 횟수이다. 총 100개의 가짜 코인을 찾으면 flag를 획득할 수 있는 것으로 보인다. 해당 문제는 이진탐색 알고리즘을 통해 쉽게 해결할 수 있다. ## 문제 풀이 : 우선 임의의 정수를 넣어서 시도해보겠다. 임의의 정수 "50"을 넣었을 때 "50"의 무게값이 출력된 것을 확인할 수 있다. 이어서 "1", "2", "3", "4"를 넣었을 때 네 가지 수의 무게값의 합이 출력된 것을 확인할 수 있다. 이어서 이진탐색을 활용하여 공격코드를 작성해보겠다. ## 최종 결과 : ### 공격 코드 : from pwn import * POR..
이번 포스트에서는 Pwnable의 shellshock 문제에 대해 다루겠다. 문제 코드는 다음과 같다. #include int main(){ setresuid(getegid(), getegid(), getegid()); setresgid(getegid(), getegid(), getegid()); system("/home/shellshock/bash -c 'echo shock_me'"); return 0; } ## 문제 해석 : setresuid()와 setresgid()를 통해 user, group ID를 설정하고 bash를 실행하여 "shock_me"가 출력된 것을 알 수 있다. 여기서 해당 문제 이름을 보면 shellshock라고 되어있는데 이는 곧 CVE-2014-6271(Bash Shellsho..
이번 포스트에서는 Pwnable의 mistake 문제에 대해 다루겠다. 문제 코드는 다음과 같다. #include #include #define PW_LEN 10 #define XORKEY 1 void xor(char* s, int len){ int i; for(i=0; i 0)){ printf("read error\n"); close(fd); return 0; } char pw_buf2[PW_LEN+1]; printf("input password : "); scanf("%10s", pw_buf2); // xor your input xor(pw_buf2, 10); if(!strncmp(pw_buf, pw_buf2, PW_LEN)){ printf("Password OK\n"); system("/bin/ca..
이번 포스트에서는 Pwnable의 leg 문제에 대해 다루겠다. 문제 코드는 다음과 같다. #include #include int key1(){ asm("mov r3, pc\n"); } int key2(){ asm( "push {r6}\n" "add r6, pc, $1\n" "bx r6\n" ".code 16\n" "mov r3, pc\n" "add r3, $0x4\n" "push {r3}\n" "pop {pc}\n" ".code 32\n" "pop {r6}\n" ); } int key3(){ asm("mov r3, lr\n"); } int main(){ int key=0; printf("Daddy has very strong arm! : "); scanf("%d", &key); if( (key1()+k..
이번 포스트에서는 Pwnable의 input문제에 대해 다루겠다. 문제 코드는 다음과 같다. #include #include #include #include #include int main(int argc, char* argv[], char* envp[]){ printf("Welcome to pwnable.kr\n"); printf("Let's see if you know how to give input to program\n"); printf("Just give me correct inputs then you will get the flag :)\n"); // argv if(argc != 100) return 0; if(strcmp(argv['A'],"\x00")) return 0; if(strcmp(..
이번 포스트에서는 Pwnable의 random 문제에 대해 다루겠다. 문제 코드는 다음과 같다. #include int main(){ unsigned int random; random = rand(); // random value! unsigned int key=0; scanf("%d", &key); if( (key ^ random) == 0xdeadbeef ){ printf("Good!\n"); system("/bin/cat flag"); return 0; } printf("Wrong, maybe you should try 2^32 cases.\n"); return 0; } ## 문제 해석 : 해당 문제의 코드를 살펴보니 key값과 random값의 XOR 연산 값이 0xdeadbeef가 되어야 해결할 ..