목록Wargame (116)
cgy12306

[asm] #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(write), 0); se..

[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 argc, char* argv[], char** envp){ delete_env..

[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로 PATH 환경변수값을 thankyouverymuch로 변경한다. PATH 환경변수는 명령어를 사용할 때 이곳을 참조한다. filter함수를 호출하게되는데 argv[1]을 ..

[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 lotto[6]; if(read(fd, lotto, 6) != 6){ printf("e..

[blackjack] http://cboard.cprogramming.com/c-programming/114023-simple-blackjack-program.html 해당 주소로가면 blackjack에 대한 코드가 있다. 블랙잭은 확률게임이기 때문에 18 이상이 되면 stay를 하고, 딜러가 버스트 되는 것을 기다리는 코드를 짰다. remote('pwnable.kr', 9009) #context.log_level = 'debug' r.recv() r.sendline('Y') r.recv() r.sendline('1') while True: print r.recvuntil('Cash: $') cash = int(r.recvline()) r.recvuntil('Your Total is ') mycard =..

[coin1] nc로 pwnable.kr 9007에 접속해보면 다음과 같이 뜬다. 60초안에 100개의 가짜 코인을 찾으면 상을 준다고 한다. N개의 코인이 주어지는데 C번의 횟수안에 가짜 코인을 찾아야 한다. 코인 한개당 무게가 10이 나가는데 가짜 코인은 9가 나온다. index번째 코인을 여러개 입력하면 무게의 총합을 알려준다. 술게임 Up & Down 하는기분.. 입력할 수 있는 횟수의 제한도 있고, 하나씩 입력하게 되면 시간상의 문제가 발생한다. 그래서 절반씩 나눠서 입력하기로 했다.(나중에 알고보니 이진탐색 기법이라고 한다.) from pwn import * import time r = remote('pwnable.kr', 9007) sleep(3.1) r.recvuntil('- Ready? ..
[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(argv['B'],"\x20\x0a\x0d"))..
[random] 소스코드를 살펴보자. rand() 함수로 임의의 난수 값을 뽑아내서 key 와 xor연산한 후 0xdeadbeef와 같으면 /bin/cat flag 명령어를 실행하는 소스코드이다. rand() 함수는 실행할 때 마다 같은 값을 뽑아내는 취약점이 있다. 우선 rand() 함수값을 출력하는 코드를 로컬에서 만들어서 실행해보자. #include int main(){ int ran; ran = rand(); printf("%d", ran); return 0; } 실행할 때 마다 1804289383이라는 같은 값을 반복해서 뽑아내는 것을 알 수 있다. 그럼 rand 값은 1804289383이다. 여기서 key와 rand 값을 xor 연산해야하는데 xor 연산 특성상 a ^ b = c 라는 식이 있..