Pwnable.kr [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; } 그냥 간단하다. rand()함수를 호출하지만 srand()를 사용하지 않고, 그럴 경우 srand(1)이 자동으로 할당된다. 즉 seed 1 고정인 상태에서 항상 동일한 시퀀스가 나오는 상황이다. 맨 처음에 소스코드만 보고 잠깐.. Pwanble.kr [passcode] #include #include void login(){ int passcode1; int passcode2; printf("enter passcode1 : "); scanf("%d", passcode1); fflush(stdin); // ha! mommy told me that 32bit is vulnerable to bruteforcing :) printf("enter passcode2 : "); scanf("%d", passcode2); printf("checking...\n"); if(passcode1==338150 && passcode2==13371337){ printf("Login OK!\n"); system("/bin/cat flag"); } else{ printf("Login Failed!.. Pwnable.kr [flag] 바이너리 파일만 띡 던져줌 하면서 느낀 게 여태는 BOF 문제나 풀었는데, 아예 리버싱이라고 생각하니 느낌이 많이 달라서 힘들었음 어제 몇 시간정도 삽질하면서 프로그램 실행 흐름을 파악한 결과 반복적으로 계속 바이트를 옮기는, 문자열로 만드는 듯한 행위를 파악했으나 정확히 스트링 형태로 나오지가 않았음 그러다가 위 사진의 cmp 문들이 flag 값을 변화시키고 그로 인해 실행 분기가 계속 갈라지는데, 일반적인 형태로는 수십번 반복해도 잘 가지 않는 분기들을 파악하였다. 그래서 gdb set으로 reg값을 임의로 바꿔서 실행 분기를 틀어보았고 다음 사진과 같은 내용을 얻을 수 있었다. ! 이거 솔직히 진짜 메모리 다 뒤지고 삽질해서, 거기다가 풀려고 만들어진 문제니까 이렇게 얻을 수 있었는데, 원래 더 스.. Pwnable.kr [bof] #include #include #include 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; } 아직도 너무 수련이 부족하다... gdb로 본 func 함수 내용. 키값이랑 입력 버퍼 시작 주소 간의 차이는 52byte이고 노란색 순서를 보면 버퍼를 덮고(gets), 키값이랑 검사를 하고, 쉘이 열리고(system), 이후에 canary 체.. Pwnable.kr [collision] #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 Pwnable.kr [fd] #include #include #include char buf[32]; int main(int argc, char* argv[], char* envp[]){ if(argc FC10 balog 문제 전문 /* The Lord of the BOF : The Fellowship of the BOF - talos - Local BOF on Fedora Core 10 */ #include #include #include #include extern char **environ; char *saved_argv1; int len_of_argv1; int main(int argc, char *argv[]) { char buffer[4]; int egg_hunter; if(argc != 2) { printf("argc Error!!\n"); exit(-1); } // EggHunter!! for(egg_hunter=0; environ[egg_hunter]; egg_hunter++) memset(environ[.. FC10 titan 문제 전문 /* The Lord of the BOF : The Fellowship of the BOF - balog - Local BOF on Fedora Core 10 */ #include #include #include int main(int argc, char *argv[]) { char buffer[256]; if(argc != 2) { printf("argc Error!!\n"); exit(-1); } // overflow!! strcpy(buffer, argv[1]); printf("%s\n", buffer); return 0; } 메모리 영역 권한 정보 코드상 특별한 건 없는 것 같다. 스택과 heap에 ASLR이 걸려있고, 아스키 아머가 보임 함수 프롤로그에 코드가 추가된 것이 보인다. e.. 이전 1 2 3 4 5 다음