목록분류 전체보기 (553)
Self-Improvement
RELRO ELF 바이너리에서 printf와 같이 동적으로 링크된 라이브러리의 함수를 호출할 때, 호출된 함수의 주소를 찾기 위해 PLT(Procedure Linkage Table)와 GOT(Global Offset Table)를 사용한다. GOT에는 처음에 라이브러리 함수의 주소를 구하는 바이너리 코드 영역 주소가 저장되어 있다가, 함수가 처음 호출될 때 라이브러리 함수의 실제 주소가 저장되며 바이너리가 실행되는 도중, 함수가 처음 호출될 때 주소를 찾는 방식을 Lazy Binding이라고 한다. Lazy Binding을 할 때는 프로그램이 실행되고 있는 도중 GOT에 라이브러리 함수의 주소를 덮어써야 하기 때문에 GOT에 쓰기 권한이 있어야 합니다. GOT에 값을 쓸 수 있다는 특징 때문에 ROP 익..
소스코드 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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 #include #include #include #include #include using namespace std; class Human{ private: virtual void give_shell(){ system("/bin/sh"); } protected: int age; string na..
보호되어 있는 글입니다.
보호되어 있는 글입니다.
소스코드 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 #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,..
소스코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #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; } Colored by Color Scripter cs 코드를 보게되면 putenv("PATH=/thankyouverymu..
소스코드 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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 #include #include #include #include unsigned char submit[6]; void play(){ int i; printf("Submit your 6 lotto bytes..
풀이 C언어로 blackjack을 구현한 코드를 찾아서 사용한다고 한다. 게임 소스코드에서 betting() 함수를 확인해 본다. 처음 입력한 배팅 금액이 보유한 cash보다 클 경우 다시 배팅값을 받는다. 근데 이때 다시 배팅값을 받을 때 또 보유한 cash보다 큰 값을 입력할 때 그냥 입력 값을 return하게 되어진다. 실제로 접속해서 해보니 게임이 실행되는 걸 확인할 수 있으며 이 상황에서 게임에서 이기면 flag를 획득할 수 있다.
소스코드 1 2 3 4 5 6 7 #include int main(){ setresuid(getegid(), getegid(), getegid()); setresgid(getegid(), getegid(), getegid()); system("/home/shellshock/bash -c 'echo shock_me'"); return 0; } Colored by Color Scripter cs setresuid, setresgid가 존재하며 현재 경로의 bash 파일로 echo를 실행하고 있다. 이 부분을 이용하여 flag를 읽으라는 것 같다. 같은 경로에 존재하는 bash 파일이 취약한 것으로 파악되며 export 명령어로 취약한 환경변수를 만들어주고 bash 파일을 실행해 본다. bash 파일은 취약한..
소스코드 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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 #include #include #define PW_LEN 10 #define XORKEY 1 void xor(char* s, int len){ int i; for(i=0; i