Hackerschool FTZ의 Level 20 풀이입니다. 배열의 길이는 80인데 fgets 함수로 입력받는 길이는 79네요. 그렇다면 버퍼 오버플로우 공격을 할 수 없습니다. 그런데 printf 함수에서 %s 를 사용하지 않고 문자열을 출력했습니다. 그래서 FSB, 즉 포맷 스트링 버그를 이용해서 풀 수 있을 것 같습니다. 포맷 스트링 중에 %n이 있는데 %n은 쓰인 총 바이트 수를 지정할 정수형 포인터를 출력할 때 쓰는 것입니다. 그리고 이번에는 버퍼 주소 대신 함수가 끝나고 실행하는 소멸자 .dtors를 이용할 것입니다. 먼저 .dtors의 주소를 알아보겠습니다. .dtros가 끝날 때 호출하는 명령을 저장한 주소는 0x0849598입니다. 이번에는 쉘코드를 환경변수에 등록하고 주소를 알아내겠습니..
Hackerschool FTZ의 Level 19 풀이입니다. 18번 코드와 비교하면 너무나도 짧네요.. ㅋㅋ 하지만 자세히 보면 setreuid 함수가 없습니다. level 20의 uid를 'cat /etc/passwd | grep level20' 명령어로 확인해보니 3100이 나왔습니다. 그러니 기존의 쉘코드 앞에 setreuid(3100,3100);를 추가하면 될 것 같습니다. buf부터 ret까지의 거리는 0x100000000+4-0xffffffd8=44이므로 44입니다. 그럼 이제 setreuid(3100,3100);를 추가한 쉘코드를 환경변수에 등록하고 주소를 알아내겠습니다. 이제 공격 코드를 만들어서 넣어주면.. Password : we are just regular guys
Hackerschool FTZ의 Level 18 풀이입니다. 이번에는 코드가 엄청나게 깁니다.. shellout 함수를 실행시키면 될 것 같습니다. 그러려면 check 값을 0xdeadbeef로 만들어야 하는데 check에 값을 입력하는 부분이 없습니다. 그러므로 char string[100]; 보다 더 작은 주소에 있는 check에 접근하기 위해서 case 0x08: count--; printf("\b \b"); break; default: string[count] = x; count++; break; 위 코드를 이용해서 0x08로 4byte 뒤로 이동해서 check에 값을 넣어주면 됩니다. Password : swimming in pink
Hackerschool FTZ의 Level 17 풀이입니다. 16번 문제와 유사하지만 이번에는 shell 함수가 보이지 않습니다. 직접 shell을 실행시켜주는 코드를 작성해야 할 것 같습니다. 16번 문제와 shell 함수가 없다는 것만 빼고는 똑같기에 이번에도 40개의 문자를 앞에 넣어주면 됩니다. 이제 직접 쉘코드를 환경변수로 등록하고 shell 코드의 주소를 알아보겠습니다. 이제 공격 코드를 작성해서 넣어주면.. Password : why did you do it
Hackerschool FTZ의 Level 16 풀이입니다. void 형 call 변수에 들어가 있는 printit 함수를 shell 함수로 바꿔주면 될듯합니다. 0xfffffff0 - 0xfffffc8 = 40이므로 40개의 문자 뒤에 shell 함수의 시작 주소를 넣어주면 될 것 같습니다. shell 함수의 시작주소는 0x080484d0 이제 공격 코드를 만들어서 넣어주면.. Password : king poetic
Hackerschool FTZ의 Level 15 풀이입니다. 14번 문제와 거의 같지만 check 변수가 포인트 변수라서 check 포인트 변수에 있는 값이 가르키는 메모리 주소에 0xdeadbeef를 넣어줘야 합니다. gdb로 디버깅 해보니 14번 문제와 같게 buf와 check 사이의 거리가 40으로 같습니다. 0xdeadbeef 값이 존재하는 주소를 찾기 위해서 0x080484b0 주소부터 메모리들을 출력해보았더니, 0x08048b2 주소에 저장되어있는 것을 확인했습니다. 이제 공격 코드를 만들어서 넣어주면... Password : about to cause mass
Hackerschool FTZ의 Level 13 풀이입니다. 버퍼 오버플로우를 일으켜야 하는데 i 값을 보존시키면서 쉘코드를 삽입해야 할 것 같습니다, main 함수를 분석해보니 변수 i의 값을 보존시켜야만 한다는 것만 제외하면, 기존의 문제와 같게 strcpy 함수를 이용해서 버퍼 오버플로우 공격을 해야 하네요. 입력받은 값을 0xfffffbe8부터 붙였는데 0xfffffff4가 변수 i 값입니다. 0xfffffff4 - 0xfffffbe8 = 1036 그러므로 1036개의 값 뒤에 변수 i의 값을 넣고 ebp-4 까지 덮어 씌어주기 위해 12byte를 더 쓰고 RET과 더미 크기만큼인 4byte, 그리고 공격 코드를 넣어주는 방식으로 쉘코드를 작성하면 될 것 같습니다. 변수 i 값과 버퍼값을 비교하는..
Hackerschool FTZ의 Level 12 풀이입니다. level 11과 굉장이 비슷하지만 입력받는 함수가 다르네요. 입력을 strcpy가 아닌 gets로 받아서 main 함수의 인자로 넘겨 줄 수 없어서 입력 대기 상태에서 입력해주어야 합니다. 먼저 버퍼의 크기를 알아내 보겠습니다. 0x08048473과 0x08048479에서 264와 8, 총 272를 빼주고 있습니다. 메모리 구조는 다음과 같습니다. [Buffer(256)][dummy(8)][SFP(4)][RET(4)] level 11과 같은 메모리 구조로 되어 있네요. 이제 버퍼를 저장하는 주소를 찾아보겠습니다. 버퍼가 저장되는 주소는 0xbfffdfc0이네요. gets는 입력 대기 상태에서 값을 입력받으므로 위처럼 공격 코드를 괄호로 묶어주..
Hackerschool FTZ의 Level 11 풀이입니다. 버퍼 오버플로우 기법에 대해서 공부를 한 뒤 풀었습니다. attackme 파일의 소스코드로 보입니다. strcpy 함수에서 문자열 길이 검사를 하지 않아서 오버플로우 취약점이 발생합니다. printf 함수에서 포맷 스트링 버그 취약점도 있네요. 이번에는 버퍼 오버플로우 취약점을 이용해서 풀어보겠습니다. attackme를 실행시키니 입력한 숫자를 다시 똑같이 출력해줍니다. gdb를 사용해서 분석해보겠습니다. 0x08048473과 0x08048479에서 264와 8, 총 272를 빼주고 있습니다. 메모리 구조는 다음과 같을 것입니다. [Buffer(256)][dummy(8)][SFP(4)][RET(4)] 그렇다면 공겨코드는 25바이트 쉘코드를 사용..
Hackerschool FTZ의 Level 10 풀이입니다. 도청하려면 key_t의 값을 활용해서 코딩을 해야 될 것 같습니다. 공유 메모리를 참조하려면 shmget 함수를 이용하면 됩니다. shmget 함수로 해당 공유 메모리에 요정을 한 후, shmat 함수를 이용해서 해당 메모리를 사용할 수 있게 만들어줍니다. get으로 7530 key를 가진 1024 크기로 IPC를 생성하고, 생성한 곳에서 가져와서 읽는 코드입니다. 위 코드를 컴파일 후 실행시켜보면.. Key : what!@#$?
Hackerschool FTZ의 Level 9 풀이입니다. 문제에 접속해서 힌트를 확인해보면 위와 같이 출력됩니다. 위 코드를 보면, 입력은 buf에 받고 있는데 buf2가 go와 같게 만들라고 하고 있습니다. fgets는 경계선 검사를 하지 않는 함수이니 아마 이 함수에 정답이 있을 겁니다. 일단 hint에 있는 c 코드를 복사하고 똑같은 파일을 만든 뒤 컴파일 후 gdb로 디버깅했습니다. 0x8048320에 fgets로 입력받는데 strcmp로 비교하는 부분은 0x8048330입니다. 0x8048330 - 0x8048320 = 16 fgets 함수는 경계선 검사를 안 하므로 16글자가 넘어가면 bof2의 영역으로 갈수있습니다. bof 파일 실행 후 gggggggggggggggggo를 입력하면, lev..
Hackerschool FTZ의 Level 7 풀이입니다. 접속해서 힌트를 확인해보면 위와 같은 문장이 나타납니다. bin 디렉토리에 들어가서 level7을 실행시켜보면 패스워드를 입력받는데, 아무것이나 쳐보니 wrong.txt를 찾을 수 없다고 합니다. 원래 wrong.txt 파일이 있었는데 없어졌다고 합니다. 올바르지 않은 패스워드 입니다. 패스워드는 가까운곳에... --_--_- --____- ---_-__ --__-_- 원래 level7을 실행시킨 뒤 올바르지 않은 패스워드를 입력하면 위와 같은 문자열이 출력됩니다. '--_--_- --____- ---_-__ --__-_-'는 딱 봐도 2진수네요. 위 문자열을 2진수 -> 10진수 -> 아스키코드로 변환해주면 'mate'가 됩니다. 패스워드로 m..
- Total
- Today
- Yesterday
- c++
- 안드로이드
- 17th HackingCamp CTF
- Write-up
- unity2d
- hackerschool
- 멘토링
- Level 05
- 안드로이드 멘토링
- xcz.kr
- Unity
- 풀이
- C#
- HackingCamp
- Level 03
- Programming
- Android
- Basic RCE
- ftz
- reversing.kr
- Level 04
- Advance RCE
- 유니티
- pwnable
- wargame
- Level 06
- Reversing
- CodeEngn
- Level 02
- Level 01
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |