목록Wargame (39)
Sh4n3e
우리는 소스에서 이상한 점을 발견해야 한다. 또한 Hint의 숫자를 나중에 Unpacking한 소스에 이용해야 한다. 이 소스는 Packing된 Script언어임을 알아야 한다. http://www.strictly-software.com/unpacker 다음의 사이트를 통해 unpacking을 할 수 있다. 패킹된 결과이다. var digitArray = new Array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'); function PASS(n) { var result = ''; var start = true; for (var i = 32; i > 0;) { i -= 4; var digit = (n >> ..
우리는 다음의 힌트와 같이 Point를 50까지 만들어야 한다. 하지만 25를 넘어가면서 다음과 같은 경고창을 띄워주게 된다. 우리는 이것을 우회해야만 한다. 여기서 단순히 Request를 변조하면 좋겠지만 25번의 작업을 거쳐야 하므로, 우리는 Burp Suit를 이용해서, 계속적으로 User-Agent를 SuNiNaTaS로 변조할 것이다.
이번 문제는 Notice Board에 글을 써야 하는 문제이다. 하지만 우리는 Notice Board에 대한 권한이 없다. Notice Board URL : http://suninatas.com/board/list.asp?divi=notice Q&A Board URL : http://suninatas.com/board/list.asp?divi=Free 우리는 Q&A Board의 글쓰기 권한을 통해 변조해서 접근하면 된다. http://suninatas.com/board/write.asp?page=1&divi=Free 이 주소는 Q&A Board의 Write Page이다. 뒷부분의 divi를 notice로 변조해서 접근하면 우리는 게시판에 접근할 수 있다. http://suninatas.com/board/..
문제는 아래와 같다. [golem@localhost golem]$ cat darkknight.c/* The Lord of the BOF : The Fellowship of the BOF - darkknight - FPO*/ #include #include void problem_child(char *src){char buffer[40];strncpy(buffer, src, 41);printf("%s\n", buffer);} main(int argc, char *argv[]){if(argc
스크립트 코드를 분석해보자. id와 pw가 같다면 You can’t join! Try again이라는 경고문이 뜨게 된다. 하지만 이것이 아니라면 submit()함수를 호출하게 된다. 여기서 우리는 Join을 위해서는 id와 pw가 같아야 한다는 힌트를 봐야 한다. Paros를 통해서 Request를 변조해보자. 이렇게 request하면 다음과 같은 결과를 얻어낼 수 있다.
이제부터 시간이 날때마다 SuNiNaTaS의 풀이방법에 대해서 작성해놨던 WriteUp을 가지고 포스팅해보고자 한다... 간단한 소스코드 분석 문제 str = Request(“str”) // 입력 받은 str을 str변수에 저장 If not str = “” Then // 받은 문자열이 공백이 아니라면 if문의 참을 알림 result = Replace(str, “a”, “aad”) // a를 aad로 교체해서 result에 저장 result = Replace(result, “i”, “in”) // i를 in으로 교체해서 result에 저장 result1 = Mid(result,2,2) // result의 문자열을 2번째부터 2개를 result1에 저장함 result2 = Mid(result,4,6) // ..
해당 문제를 풀어보기위해 다양한 삽질을 했지만, 풀이법이 보이지 않아 힌트를 찾아보았고 Shared Library Hijacking을 사용해야 한다는 것을 알았다.. 이부분에 대한 상세한 내용은 http://leekeezz.tistory.com/32 해당 위치에서 확인할 수 있다. 그럼 왜 풀이법이 보이지 않았을까 부터 시작해보자. 해당 프로그램의 소스는 아래와 같은데, 골때리게 Stack의 Ret부분을 제외하고는 변수 buffer의 공간, EBP, Argv[0], Argv[1], Env를 다 0으로 초기화해버린다. 도대체 어찌하란 말인가?! 라는 생각에 잠기게 된다. [skeleton@localhost skeleton]$ cat golem.c /* The Lord of the BOF : The Fell..
[vampire@localhost vampire]$ cat skeleton.c /* The Lord of the BOF : The Fellowship of the BOF - skeleton - argv hunter */ #include #include extern char **environ; main(int argc, char *argv[]) { char buffer[40]; int i, saved_argc; if(argc < 2){ printf("argv error\n"); exit(0); } // egghunter for(i=0; environ[i]; i++) memset(environ[i], 0, strlen(environ[i])); if(argv[1][47] != '\xbf') { printf("..
디스어셈블이 필요없다.. 약간의 아이디어만 필요할뿐...0xbfff대역을 사용하지 못하기 때문에 우리는 환경변수 영역을 많은 양으로 채워서 0xbfff대역을 벗어나 이용한다. [troll@localhost troll]$ cat vampire.c/* The Lord of the BOF : The Fellowship of the BOF - vampire - check 0xbfff*/ #include #include main(int argc, char *argv[]){char buffer[40]; if(argc < 2){printf("argv error\n");exit(0);} if(argv[1][47] != '\xbf'){printf("stack is still your friend.\n");exit(0);..
우선 문제를 설명하기 앞서 문제의 코드부터 살펴보자. [orge@localhost orge]$ cat troll.c/* The Lord of the BOF : The Fellowship of the BOF - troll - check argc + argv hunter*/ #include #include extern char **environ; main(int argc, char *argv[]){char buffer[40];int i; // here is changedif(argc != 2){printf("argc must be two!\n");exit(0);} // egghunter for(i=0; environ[i]; i++)memset(environ[i], 0, strlen(environ[i])); ..