일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- tensorflow
- 텐서플로
- leg
- 기능개발
- AI
- pwnable.kr
- Algorithm
- Python
- Softmax classification
- logistic regression
- Linear_regression
- programmers
- 인공지능
- Today
- Total
목록pwnable/FTZ (14)
나혼자 공부장
hint 파일을 보면, gets 함수로 buf를 받을 때 인덱스 갯수를 제한하지 않고 있다. 이번에도 역시 BOF를 이용해서 푸는 문제겠다. 패스워드를 알아내기 위해 우리가 해결해야할 문제는 크게 두가지다. 1. 코드에 setreuid() 와 같은 권한 설정을 해주는 부분이 없다. 2. 쉘로 떨어지는 부분이 없다. 공격대상 파일은 setuid 설정이 되어있는 상태긴 하지만, rethat 7.0 이후부터 만큼은 쉘을 실행시킬 때 만큼은 drop privileges 정책에 의해 ruid 로 실행된다. 일반 setuid는 euid만 바꿔주는 것이고 ruid는 그대로기 때문에 setreuid() 함수로 따로 처리해주지 않으면 쉘을 실행해봤자 권한이 그대로인 상태로 실행된다. 따라서 아래와 같은 코드가 추가적으로..
hint 파일을 조회해서 문제 해결 방향을 생각해보면, buf에 사용자 입력이 들어가고 그걸 call 포인터가 printit의 주소를 가리키고 있는 부분까지 BOF를 일으켜 풀 수 있을 듯 하다. 즉 이 문제를 해결하려면 1. 쉘 코드를 환경변수로 만들어준다. 2. 쉘 코드의 환경변수의 주소를 알아내는 코드를 짜고 실행해서 주소를 알아낸다. 3. printit의 주소가 오는 부분에 쉘 코드 환경변수의 주소를 넣는 형태로 페이로드를 짜서 실행한다. gdb 로 더 자세히 살펴보자. 위와 같이 구성할 수 있다. 쉘코드를 환경변수를 지정해준다. 환경변수를 구하는 코드는 위와 같이 짤 수 있다. 그냥 getenv로 받아서 출력하기만 하면 프로그램 길이에 영향을 받아서 환경변수 주소가 밀리기 때문에 위와 같이 연산..
cat 파일을 조회해보면, check 변수가 가리키고 있는 주소의 값이 0xdeadbeef이면 풀리는 문제임을 알 수 있다. 일단 처음 생각난건 fgets 에서 stdin으로 buf값 입력을 받고 있으니, buf 주소에서 시작해서 check 까지 오버플로우를 일으키면 되는 문제라고 생각이 들었다. 하지만 check가 포인터 변수이기 때문에 불가능하다. check 자체의 값이 문제가 아니라 check가 가리키고 있는 주소의 값이 무엇이냐가 문제기 때문에, 값 보다는 주소를 가지고 놀아야하는 레벨이 되겠다. 일단 gdb로 컴파일해서 대충 스택이 어떻게 구성될런지 분석해보자. 간단하게 main 지역변수들의 스택 구성을 구현해보면 위와 같다. 이제 이 구성을 토대로 문제를 풀것이다. 방법 1. check가 bu..
hint 파일을 조회해봤을 때, 이제는 그냥 서론도 없이 코드만 달랑 던져준다. attackme 파일의 코드인듯 한데, 자세히 보면 setUID 권한을 실행 시키기만 하고 쉘에 뛰어들진 않는다. 하지만 우리는 level12 권한으로 쉘을 실행해서 my-pass로 패스워드를 알아내는게 목표다. 이 코드를 실행해서 어떻게 level12 쉘로 던져질 수 있을지 고민하던 때에, strcpy (str, argv[1]) 부분을 보면 사용자에게 입력받은 문자열을 아무 예외처리도 없이 str에 그대로 복사하고 있다. 사용자가 str 사이즈를 뛰어넘는 문자열을 입력할지 어떻게 알고? 일단 여기서 BOF를 이용해야 한다는건 확실해진다. 일단 열심히 머리를 싸맨 결과, 사용자가 입력할 문자열이 str에 저장되므로 1. st..
언제나처럼 이번 레벨에도 hint 파일이 제공된다. cat hint로 내용을 확인해보면, /usr/bin/bof의 소스를 알려준다. 일단 파일 이름부터 bof 라 버퍼 오버플로우 문제라는걸 짐작할 수 있다. strncmp 함수를 사용하는 부분의 조건문을 충족시키면 레벨이 통과되는 것을 알았다. buf2 배열의 처음 두 인덱스 값을 합쳐서 "go" 로 만들면 된다. 일단 처음 직관적으로 떠오르는대로 무식하게 시도해보자 그냥 buf의 크기가 10byte니까 그걸 2byte 만큼 넘겨서 go를 입력해주면 되지 않을까 싶었다. 하지만 너무 쉽게 생각했던듯 하다. 통하지 않았다. gdb로 어셈블리어를 조회해서 자세히 분석해보고자 했으나 권한이 막혀있어서 그것도 할 수 없다. 이 상태에선 아무것도 할 수 있는게 없..
다음과 같이 코드를 짜준다. 컴파일 한 후 gdb로 디버깅을 시작한다. 위 디스어셈블 결과로 스택 프레임의 구성을 분석해본다. 명령어 내용 스택 push ebp 베이스 포인터 입력 (입력 전 먼저 프로그램 호출 전의 스택 구조의 주소를 스택에 저장 - RET) mov ebp, esp 베이스 포인터를 스택 포인터 주소로 이동 (해당 명령 시 저장하는 포인터 - SFP) sub esp, 0x8 esp = esp - 0x8 함수에서 사용할 변수 공간 확보 (8바이트 만큼 비움) and esp,0xfffffff0 mov eax,0x0 sub esp,eax sub esp,0x4 push 0x3 esp가 0ffffff0인지 비교 후 0x0을 eax(산술연산레지스터)에 저장 esp = esp - eax(0x0) es..
hint 파일을 보니 level9의 shadow 파일이 있다고 한다. shadow 파일은 암호화된 비밀번호들을 저장해두는 곳이니까 그 파일 내부에 비밀번호가 있다는 의미로 해석된다. 용량이 2700이라는게 2700bit인지 2700byte인지 모호하다. 일단 SetUID 걸린 파일은 아예 없는 것 같고, 사이즈가 2700인 파일을 find 돌렸더니 권한이 막힌 파일들만 잔뜩 나온다. find -size 10b : 512 바이트 단위의 블록 사이즈 검색 find -size 10c : 10바이트 사이즈 검색 find -size 10k : 10K바이트 사이즈 검색 find -size 10w : 10워드 사이즈 검색 등등의 옵션을 이용해보자. 그럼 c 를 붙이고 검색해봤을 때 found.txt 라는 파일이 보인..
로그인 하자마자 특이한 화면이 뜬다. 보통은 쉘이 실행되는데 바로 hint 문구가 뜬다. 그 많이 사용되던 해킹방법이라는게 뭔지 알아야 힌트를 사용하니까 검색해보려 했는데 FTZ Level6 풀이들 밖에 안 나와서 그만 알아보기로 했다. Enter를 눌러보자. 그럼 위와 같은 프로그램이 실행된다. 아무 bbs 번호나 눌러보면 어떤 ip에 접속하려고 하다가 아예 쉘을 나가버린다. 프로그램을 나가려고 하면 Ctrl+C 를 막아버린다. 문구까지 띄워주는걸 보아 프로그램 자체에서 막고있는 것 같다. Ctrl+D도 되긴 하나 아예 쉘을 나가버리므로 소용이 없다. 이 프로그램에 도달하면 문제를 푸는게 어려워보인다. 그래서 프로그램 실행 전 hint 파일을 띄울 때 Ctrl+C를 눌러봤더니 쉘로 이동되었다. 이제 뭘..
1. Race Condition exploit hint 파일을 보면 /tmp/level5.tmp라는 임시파일을 생성하는 프로그램이 있다고 한다. 아마 그 임시파일의 내용이 핵심일듯 하다. level5 프로그램을 실행하고 tmp 디렉토리를 확인해보자 풀이를 마친 상태라 파일이 좀 많은데, 원래는 mysql.sock만 남고 비어있다. 분명히 level5.tmp를 생성하는 프로그램이랬는데 어떻게 tmp가 비어있는가? 힌트가 거짓말일리는 없다. 그럼 level5 프로그램이 level5.tmp를 생성한 후 바로 삭제해 버린다는 결론이 나온다. level5.tmp 파일 생성 순서 1. 프로세스 시작 2. 같은 이름의 파일 존재 여부 검사 3. 존재 시 삭제, 없을 시 패스 4. level5.tmp 파일 생성 5. ..