ALL 61

LOB: gate - 수정중

FTZ를 거의 끝내가서 LOB를 시작했다. 아직 조금 남았지만 LOB를 병행하며 하기로 했다. 밀린 FTZ는 미래의 내가 하겠지... FTZ와 달리, LOB는 로그인을 연결 후 진행한다. 가장 첫번째 계정은 ID : gate / PW : gate로 로그인할 수 있다. 시작하면 다음과 같이 두 파일이 존재한다. (gremlin만 grep으로 뽑은 이유는 풀면서 만든 파일이 존재하기 때문) 실행 파일인 gremlin부터 살펴보면, gremlin으로 set-uid가 설정되어 있다는 것을 알 수 있다. LOB의 특징은 다음 레벨의 ID를 실행 파일의 이름으로 정해놓는다는 것이다. 즉, 우리가 이번 gremlin 파일을 BOF 하여 얻은 password는 gremlin에 로그인하여 사용해야 하는 것. 버퍼 위치가..

Write-Up/LOB 2019.11.22

FTZ: Level17

setreuid 함수가 level18로 권한을 올려주는 함수. 이 뒤에 call이 호출되므로 미리 buf에 쉘코드를 넣어놓고 call에 buf의 주소를 넣으면 될 줄 알았으나..! FTZ 상태가 이상한건지 내가 주소를 읽는 눈치가 이상한건지 한번도 맞아떨어지지 않으므로 마음 편하게 쉘코드를 환경변수로 저장하기로 했다. 다음과 같이 환경변수를 만들고, getenv라는 $SHELLCODE 전용 주소 알아내기 코드를 짠다. 다음과 같이 코드를 찾을 수 있다. 다음과 같이 nop sled를 40바이트 넘기고, call이 가리키는 위치에 환경변수의 주소를 넣어주면 바로 익스플로잇 되어 비밀번호를 탈취할 수 있다. 쉘코드 출처 더보기 http://blog.naver.com/PostView.nhn?blogId=sth..

Write-Up/FTZ 2019.11.20

FTZ: Level15

*level14 와 차이점 : check가 가진 주소를 받느냐 or check가 가리키고 있는 곳 내부의 값을 받느냐 1. buf에 0xdeadbeef를 입력한 후, BOF를 통해 check가 buf의 주소를 가지게 함. (문제 : 스택 주소는 실행시마다 바뀜. 프로그램이랑 눈치싸움 필요) 간단하게, buf에서 check까지는 40바이트 거리니 0xdeadbeef*10+(buf 주소 - 4바이트) 를 해주자. 그럼 중요한 것은 buf의 주소를 어떻게 찾느냐. if문 안에서 deadbeef가 맞는지 비교하기 직전에 브레이크 포인트를 걸고, 프로그램 실행. 인자값으로는 찾기 편하게 AAAAA를 넣어줄 예정 (메모리에 0x41로 들어감) 딱 버퍼자리에 AAAAA가 잘 들어간 것을 확인할 수 있음. check는..

Write-Up/FTZ 2019.11.20

FTZ: Level11

이제는 hint를 출력하면 설명이 없이 소스코드를 출력한다. 아마 폴더에 같이 있던 attackme의 소스코드일 것으로 판단한다. 이번에는 3092번으로 uid를 설정한다. 확인해보면 level12의 uid인 것을 확인할 수 있다. 코드는 간단하게 프로그램 실행할 동시 parameter를 받고, 그 첫번째 값을 str에 저장하고, 출력한다. uid는 level12의 것으로 바뀌지만, 그외에 명령을 실행할 수 있는 방법이 없다. 인자값에 쉘코드를 박아, printf를 리턴할 때 쉘코드로 넘어가 쉘을 올리면 level12의 권한을 가진 쉘을 실행할 수 있다. argv[1]의 값을 str에 저장하기 때문에, argv[1]에 쉘코드를 입력하여 놉슬레드를 태워 ret까지 넘기는 방법이 존재하는데 스택의 주소가 실..

Write-Up/FTZ 2019.11.13

FTZ: Level 9

문제의 힌트를 보면 바로 소스코드를 보여준다. char형 배열을 두개 선언해주고, 40크기의 문자열을 표준 입력(키보드)로부터 입력받는다. 이때 배열은 둘 다 10바이트인데 40바이트를 입력받으니, buf에 입력을 받아도 버퍼 오버플로우를 이용하여 buf2의 값을 임의로 수정할 수 있을 것이라 생각된다. if문을 살펴보면, go와 buf2의 문자열을 앞 2글자만 비교하는데 즉 buf2에 go라는 문자열을 입력시키면 if문 안으로 진입할 수 있다. if문 안에서는 uid를 3010(level10의 권한)으로 변경시킨 상태에서 bash쉘을 띄운다. 즉, if문 안으로 들어가기만 하면 level10의 권한으로 쉘을 실행할 수 있는 것. /usr/bin/bof 파일은 디버거를 할 수 없으므로, 동일 코드를 le..

Write-Up/FTZ 2019.11.12

#5 C언어로 개발하기!

본 포스트를 시작하기 전, VM과 윈도우 간의 공유폴더가 설정되어있다는 하에 진행합니다. * 전 안돼서 그냥 복붙머신 했어요 클립보드 공유 최고 우선 다음과 같은 C 코드를 짭니다. 해당 코드는 간단하게 비디오 세그먼트 부분에 HelloWorld를 쓰는 코드이다. 컴파일은 gcc를 이용하여 다음과 같이 진행한다. 첫번째 명령어는, gcc를 이용하여 main.c 코드를 obj 코드로 바꾸는 코드이다. 두번째 명령어를 이용하여 main.img를 얻는데, 해당 코드를 메모리의 0x10200에 올리겠다는 의미이다. 마지막 명령어는 main.img에서 필요한 부분만 추출하여 disk.img를 만들어 낸다. 여기까지 하면, disk.img를 읽기 위해 기존에 짰던 코드에 수정이 필요하다. 기존의 al은 1을 넣었는..

#4 어셈블리_함수

사실 어셈블리는 함수라는 것이 존재한다기보다는 레이블을 이용하여 함수를 구현해내는 것에 가깝다고 생각함. printf: push eax printf_loop: or al, al jz printf_end mov al, byte [esi] mov byte [es:edi], al inc edi mov byte [es:edi], 0x09 inc esi inc edi jmp printf_loop printf_end: pop eax ret 위 코드는 3번째 포스트에서 썼던, 문자열을 출력시키는 코드이다. 보통 함수라고 한다면, 저기 표시되어 있는 printf:, printf_loop: 등, 콜론이 달려 있는 부분이 함수 이름이고 함수를 호출하면 그 안에서 돌고 알아서 끝나지 않나 싶은데 아니다. 어셈블리에서 pri..

포인터의, 포인터에 의한, 포인터를 위한 포스트 였는데 문자열도 좀 낌 사실 뭐가 주인지 모르겠어요 우선 포스트를 쓰고 와봅시다

이 모든 일의 시작은 단지 포인터와 주소 개념을 알려주려고 짠 코드의 실행 결과 때문이었습니다. 시작된 코드는 다음과 같습니다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #include using namespace std; int main() { char a[] = "hello"; char &ref = a[1]; char * ptr = a; cout

Programming/C, C++ 2019.10.12