LEVEL
[해커스쿨] FTZ level18 풀이과정
2017/01/12 - [Study :)/FTZ] - [해커스쿨] FTZ level17 풀이과정 #include #include #include #include void shellout(void); int main() { char string[100]; int check; int x = 0; int count = 0; fd_set fds; printf("Enter your command: "); fflush(stdout); while(1) { if(count >= 100) printf("what are you trying to do?\n"); if(check == 0xdeadbeef) shellout(); else { FD_ZERO(&fds); FD_SET(STDIN_FILENO,&fds); if(sel..
[해커스쿨] FTZ level17 풀이과정
2017/01/12 - [Study :)/FTZ] - [해커스쿨] FTZ level16 풀이과정 힌트 보자..level16에서는 shell()함수가 따로 존재하여 shell()함수에 setreuid()함수가 들어있었다.그래서 printit()함수를 불러오는 주소에 shel()함수 주소를 대체해서 넣어서 문제를 풀었다면,level17에서는 shell()이라는 함수가 따로 없고 main()함수에 포함되어 있다.문제를 풀기 전 예상을 해보면, main()함수에 call(); 명령어를 통해서 원하는 주소의 값을 실행 하는 방법과, 앞서 풀었던 BOF방식으로 RET주소에 원하는 주소를 넣는 방법이 있을 것 같다고 판단된다.이렇게 2가지 방법을 생각해 두고 문제를 풀어보자.... 먼저, hint의 내용을 /home..
[해커스쿨] FTZ level16 풀이과정
2017/01/11 - [Study :)/FTZ] - [해커스쿨] FTZ level15 풀이과정 힌트 볼깝숑~ㅋㅋㅋㅋㅋshell()함수가 정의되고, printit()함수가 정의되고, main함수에서 printit()함수가 불러지는 것을 확인 할 수 있다.딱 보니 감이 오지 않는가? shell()함수는 정의해놓고 안불러오는것을 보니, printit()함수를 불러오는 버퍼에 shell()함수의 주소를 대체해서 넣으면, printit()함수가 아닌 shell()함수를 불러오게 되면서 해결될 것 같지 않은가? 음하하하하하하하하하하하하하하~ㅋㅋㅋ; [ebp-16]에 "0x8048419"주소를 넣는다. 그리고 부분에보면 [ebp-16]의 값을 eax에 넣고, eax의 값으로 call을 한다. 이부분이 분명 prin..
[해커스쿨] FTZ level15 풀이과정
2017/01/11 - [Study :)/FTZ] - [해커스쿨] FTZ level14 풀이과정 level14(http://eunice513.tistory.com/59)랑 매우 흡시하지만.. 이번엔 check라는 변수가 포인터이다. 이것만 다르고 다 똑같다.gdb로 파헤쳐보자~ 0x38(56byte)만큼 공간 할당하고... 사용자로 부터 입력받은 값을 [ebp-56]에 저장하고..[ebp-16]의 주소를 eax에 넣어서 , eax에 있는 주소의 접근한 값이 "0xdeadbeef"인지 확인.. 맞으면 setreuid를 실행...일단, 사용자로부터 입력받은 값은 [ebp-56]이고, "0xdeadbeef"의 주소가 들어있는 값은 [ebp-16]이니까, 40byte만큼 떨어져있다는것을 확인 할 수 있다.에 B..
[해커스쿨] FTZ level14 풀이과정
2017/01/11 - [Study :)/FTZ] - [해커스쿨] FTZ level13 풀이과정 보자보자!! 힌트를 보자!!!int 변수를 2개 선언하고, 20byte 배열 하나 선언하고 ... 그런데 45byte만큼 buf로 fgets 하네...check라는 변수에 0xdeadbeef가 들어있나 확인하네.. 정확하게 gdb로 파헤쳐보자. 보아하니.. 0x38(56byte)만큼 공간 할당하고, [ebp-56]에 fgets로 받은 문자열을 저장하고, [ebp-16]에 0xdeadbeef가 있구먼... fgets함수 바로 다음인 에 BP걸고 대충 아무 값인 "AAAAAAAA"을 넣고 실행해보니..일단 입력 받은 문자열이 들어가는 주소는 "0xbffff210"이네... 그런데 "0xdeadbeef"값이 안보인..
[해커스쿨] FTZ level13 풀이과정
2017/01/11 - [Study :)/FTZ] - [해커스쿨] FTZ level12 풀이과정 소스코드를 보니 long형 변수 i가 존재하고, i의 값이 0x1234567이 아니면 경고 메시지가 출력하는걸 볼 수 있다. 즉, i라는 변수의 값을 체크해서 오버플로우됬는지 판단하는 보안코드라고 볼 수 있겠다.하지만, 이는 너무 단순한 보안코드이다. 그러면 i형 변수가 가리키는 버퍼에 0x1234567을 넣으면 되지 않을까? 공격하자! gdb로 분석해보면, 일단 0x418(1048)만큼 공간을 확보하고, 0x1234567을 [ebp-12]에 저장한다.그리고 strcpy로 argv[1]인자를 복사하고나서 부분에 ebp-12의 값이 0x1234567의 값으로 잘 저장되어 있는지 체크한다.그럼 우리는 앞서 했던 ..
[해커스쿨] FTZ level12 풀이과정
2017/01/11 - [Study :)/FTZ] - [해커스쿨] FTZ level11 풀이과정 자.. 뭘해야될지.. 알지?...요? 힌트를 보장~ level11이랑 비슷하게 보이지만, 다르다.(당연히 다르니까 level12겠지!!)level11은 인자값으로 문자열을 입력받았다면, level12은 gets함수를 통해서 문자열을 입력 받는다. level12도 str(256) + dummy(8) + SFP(4) + RET(4) 이렇게 메모리 구조가 되겠다.level11과 똑같은 구조이지만, 입력받는 방식이 다르다는 차이점이다. 와 을 비교해보면 알 수 있다. 따라서, 문자열을 입력시키는 방법만 다르게 하면 문제는 level11과 똑같이 풀릴것이다.그래서 우린 Pipe('|')를 이용할 것이다. Pipe명령어..
[해커스쿨] FTZ level11 풀이과정
2017/01/11 - [Study :)/FTZ] - [해커스쿨] FTZ level10 풀이과정 힌트!!! 보자고~ attackme 라는 파일이 보이고, 힌트에는 어떤 소스코드가 들어있다. attackme 를 실행시켜 보니. 역시 소스코드데로 실행된다. 즉, 힌트가 attackme의 소스코드 인것이다. 그러면 이 문제는 어떻게 풀어야 될까... 소스 코드를 보니 단순히 256byte의 str배열을 선언하고 setreuid를 실행하고 argv[1]의 인자값을 str에 복사하고 str를 출력하는게 끝이다. 그런데.. strcpy를 사용하는 것을 보니 이또한 버퍼 오버플로우에 취약하다. level9 풀이(http://eunice513.tistory.com/54)를 보면 Buffer Overflow에 대한 설명..