- Today
- Total
목록Pwnable (104)
Phantom
대망의 Level20입니다. 소스를 보니 마지막 문제는 포맷스트링이네요. 의외로 간단하지 않을까 싶습니다. 우선 쉘코드를 환경변수에 넣고 위치를 알아냅니다. 이제 DTOR의 위치를 알아내고 소멸자에 쉘코드 주소를 넣으면 쉘은 떨어집니다 아직 포맷스트링에 익숙하지 않으시다면 level11을 다시 보고 오셔도 됩니다. nm으로 소멸자의 주소가 뜨지 않습니다. 다른 방법을 알아봐야 겠습니다. Dtor의 주소가 0x8049594로 뜹니다. 그러나 DTOR_END는 이 주소의 +4인 0x8049598에 있습니다 우리는 DTOR_END에 쉘코드 주소를 넣을 것입니다. 그렇다면 이제 0xbffffc17을 0xbfff와 0xfc16로 나누어서 계산하고 넣기만 하면 되겠네요 그럼 공격은 이렇게 됩니다. 이렇게 모든 FT..
이번 단계는 은근히 쉬워 보입니다. 허나 setreuid로 권한 상승이 되지 않으며 버퍼도 작습니다. 더미까지 더해도 얼마나 커질지는 모르겠습니다. 그리고…ASLR로 스택이 랜덤이 되니 Basic BOF는 힘들거같고..뭐… 가능은 하지만 Setreuid 함수가 없으니 권한 상승이 되지 않겠군요. 그래서 제가 생각한 페이로드는 Chaining RTL을 할 생각입니다 Chaining RTL이란 나중에 다시 배우게 되겠지만 기본적인 RTL을 연속적으로 사용하는 것을 말합니다. 기본적인 Chaining RTL은 함수의 return 부분에 다른 함수의 주소를 넣어 다른 함수를 실행 시키며 이어가는 것을 말합니다. 아! 다른 방법도 있습니다. Pop-pop-ret을 이용하여 함수를 실행시키고 그 다음 ret 부분에..
#include #include #include #include void shellout(void); int main(){char string[100];int check;int x = 0;int count = 0; fd_set fds; //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) // check안에 0xdeadbeef가 입력되어 있을 시 shelldout()함수 실행shellout();else{FD_ZERO(&fds); // fds의 소켓셋을 비움FD_..
이번에도 함수 포인터 문제인데 조금 다르다 다른 함수 뭐 이런 것이 없고 setreuid로 권한을 올린다음에 call()을 호출한다 뭐지? 그리고 call의 포인터로 printit()함수를 실행한다 함수 내용은 볼게 없다 음…. 그래서 생각한 것인데 함수 포인터도 포인터이다 그냥 BOF처럼 공격하면 그것을 실행하지 않을까? 그러기 위해 우선 스택 구조부터 살펴보자 보아 하니 전단계의 스택과 똑같다고 생각한다 그렇다면 스택은 다음과 같다 buf[20] | dummy(20) | call *(4) | dummy(12) | SFP(4) | RET(4) 우리는 기본적인 BOF를 사용할 생각이다 Buf에 쉘코드를 넣으려 했지만 ASLR때문에 그게 여의치 않다 그래서 환경변수에 쉘코드를 넣고 그 주소를 call에 담..
이번 문제는 함수 포인터에 대한 문제다 저번 단계의 포인터문제에서도 조금 머리를 썩였는데 이번은 어떨지… 일단 스택 구조부터 알아보자 먼저 스택 프레임으로 0x38. 56바이트 만큼 할당된다 그리고 buf의 시작은 ebp-56부터 시작한다 그리고 call함수가 호출되는 부분이 ebp-16이다 그렇다면 ebp-56에서 20만큼 그리고 다음 변수인 call이 ebp-16에서부터 4만큼 Buf와 call사이에 20만큼이 빈다, 더미다 그리고 call다음에 crap이 온다 그 후에 dummy가 8만큼온다 다음 처럼 보일 수 있다 buf[20] | dummy(20) | call(4) | crap(4) | dummy 이렇게 되는 것이다 자 이제..main+33에 BP를 걸고 아무값이나 넣고 뭐가들어가있는지 확인해보..
이번 문제는 저번 14에 이어 루틴 분기 문제이다 이번에는 포인터를 써서 조금 꼬아놓은 문제이다 우선 스택 구조부터 알아보자. 소스에서는 총 28바이트가 사용되고 스택 프레임에서 0x38, 56바이트를 할당했다 더미가 있다 더미를 추측해보자 우선 ebp-56 부분에 buf가 시작된다 그리고 ebp-16값을 0xdeadbeef와 비교한다 이 부분은 check인 것 같다 그렇다면 우선 56바이트에서 16바이트를 빼면 40바이트, 그리고 20바이트가 먼저 buf로 사용된다 그럼 나머지 20바이트는 더미 그리고 check가 나오고 그 이후의 정보는 알 수 없다 그래서 이렇게 생기지 않았을까 추측했다 buf[20] | dummy(20) | check(4) | dummy(8) | crap(4) | SFP(4) | ..
이번 문제는 BOF문제인거같으면서도 아닌것같다 분기문제이다 쉘코드나 다른 기법을 사용할 필요 없이 저 check부분에 0xdeadbeef가 들어가면 권한이 상승되고 쉘을 얻을 수 있다 간단하게 스택의 구조를 보고 값을 넣으면 쉽게 끝날 것 같다 스택의 구조를 살펴보자 먼저 스택프레임에서 0x38, 즉 56이 할당되었고 fget함수는 ebp-56부분의주소를 eax에 넣고 실행된다 buf는 ebp-56부터 20바이트만큼이다 그리고 ebp-16에서 0xdeadbeef를 비교하는데 이곳이 check부분이다 그러면 buf와 check사이에 더미가 있다는 것이다 56부터 20만큼, 36에서 16사이, 즉 더미는 20바이트를 차지한다 스택을 그려보면 다음과 같다 bufDummyCheckDummycrapSFPRET 2..
이번 단계는 기본적인 BOF문제에 스택가드가 있다 스택가드란 우리가 레벨12에서와 같은 방법으로 버퍼오버플로우 시켜서 리턴주소를 변조하게 되면 당연히 스택가드 영역도 함께 다른 값으로 변조될 수밖에 없다 그러므로 스택가드에 저장돼있는 값이 바뀌었다는 것은 버퍼 오버플로우 공격이 일어났다는 것을 의미 하고 스택가드의 변경이 확인되면 프로세스 실행을 차단해서 공격을 방어할 수 있다 그러므로 우리는 스택가드의 영역을 건들이지 않고 공격을 해야한다 지금 우리가 푸는 문제는 아주 쉽지만 소스 없이 프로그램만으로 알아내기란 무척 어렵다는 것을 알아두자 자 그럼 이제 문제를 풀어보자 우선 스택을 살펴보자 Buf 1024, I 4 바이트 소스에는 1028바이트가 사용됐다 그리고 스택 프레임을 보면 0x418, 1048..
자 이번문제부터 본격적인 BOF문제이다 소스코드를 보니 버퍼는 256바이트이며 gets함수를 사용한다 gets함수도 strcpy와 같이 길이를 재지 않고 복사를한다 아 우선 BOF에 대해 설명하자면 BOF란 Buffer OverFlow의 약자로 버퍼가 넘치는 데이터를 집어 넣어 쉘을 얻는 공격기법중 하나이다 시스템 해킹 공격기법중의 기초라고도 할 수 있으며 BOF의 공격기법 또한 다양하다 우리는 가장 기초적인 BOF공격기법과 환경변수를 이용한 공격기법, 그리고 RTL이라는 공격기법을 통해 쉘을 얻을 것이다 아 참고로 기본적인 RET SFP이런것들은 알고 있다고 가정하고 설명하겠다 우선 스택을 파악해보자 우선 스택에 0x108, 즉 264가 할당이 됐다 버퍼가 256바이트인데 264가 할당이 됐다, 더미가..
이번 난이도부터는 attackme라는 파일과 힌트에는 소스코드가 주어진다 취약점을 보고 공격하란 뜻인 것 같다 소스코드를 보니 취약점이 2개가 있다 Strcpy(str, argv[1])에 BOF취약점 하나와 Printf(str)에 포맷 스트링 취약점 먼저 첫번째 BOF취약점은 strcpy함수가 문자열의 길이를 검사하지 않고 복사하는 것 때문에 오버플로우 취약점이 생긴 것이다 그리고 두번째 포맷스트링은 원래 기본적인 printf함수 라면 printf("%d",x) 나 printf("%s",str)이렇게 아니면 printf("hello world"); 처럼 인자가 정해져 있어야 한다 그런데 소스에는 printf함수 안에 배열 이름이 적혀져 있다 잘은 모르겠지만 실행해보면 출력이 된다 그러나 이렇게 사용하게 ..