- Today
- Total
목록분류 전체보기 (300)
Phantom
이번 문제도 이름과 시리얼을 크랙하는 문제로 보인다 비베로 짜였고 비교 함수가 있을 것으로 추측된다. 두개에 BP를 걸고 한번 실행해본다. 조금 아래로 내려보면 이것이 있다. 난 이게 아스키인줄 알고 3일간 삽질했다 무시하고…..그냥 넣으면 되더라 그래서 시리얼을 넣고 실행해보면
초보자를 위한 시스템 해킹 공부 가이드라인 from H4C
PPT를 올리고 몇 일 만일까? 이제부턴 개인적인 경험? 의견을 블로그에 담으려 한다. 처음 PPT에는 대회 공부법? 만을 올린 것 같다는 지적이 있었다. 어느 정도 공감 하고 어느 정도는 반박을 하고 싶다. 먼저 공감 – 대회위주로 쓴 것은 맞다. 위주로 썼다기 보단 내가 공부하는 방법을 쓰다가 보니 그런 방식이 나온 것 같다. 그리고 반박 – 내가 생각 하는 보안이란 흔히 말하는 화이트와 블랙, 나는 그 사이인 그레이라고 생각한다. 관리적인 보안으로 보안의 체계를 만들고 그 체계 속에 네트워크 보안, 그리고 시큐어 코딩, 제품의 보안에 대한 안티디버깅, 패킹, 그리고 그 시스템의 OS, OS 패키지프로그램 등이 속해 있다. 그것을 공격자 입장에서는 뚫고 들어오는 것인데. 이 분야 중에 우리는 하나를 ..
대망의 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..