Pwnable/FTZ

Pwnable/FTZ

FTZ - level16 [Buffer Overflow 𝜻]

LEVEL 16 [level16] passcode : about to cause mass (NO DRAG, NO PASSCODE) attackme.c 이라는 파일이 있지만 읽기 권한이 거부되어 있다. 그냥 attackme의 소스 코드인 것 같다. hint의 코드를 살펴보자. 새로운 오버플로우 문제이다. 문제 해결은 다음과 같다. fgets 함수에서 입력 받는다. 앞의 버퍼들을 다 채우고 fgets 함수가 종료되면 다음 call 함수가 호출되는데, 이는 printit 함수의 주소가 들어가 있다.(함수의 이름 = 그 함수의 주소) 따라서 *call의 메모리 영역을 shell 함수의 주소로 덮으면 마지막에 쉘이 실행될 것이다. 따라서 우리는 메모리 구조를 분석하고 shell 함수의 주소를 찾아야 한다. 먼저 ..

Pwnable/FTZ

FTZ - level15 [Buffer Overflow 𝜺]

LEVEL 15 [level15] passcode : guess what? (NO DRAG, NO PASSCODE) hint의 코드를 분석해보자. 이번 문제는 level14와 아주 유사하지만 check 변수가 포인터 변수로 바뀐 것을 볼 수 있다. level15 에서는 다음과 같이 해결한다. check 부분에 0xdeadbeef 값을 직접 입력해주는 것이 아니라 0xdeadbeef 값이 들어있는 주소 자체를 넣어주어야 한다. if 문 조건식의 check → check에 주소를 넣어주게 되면 간접참조연산자(*)가 이 주소값 안에 있는 값을 읽어올 것이다. 이 주소에는 0xdeadbeef 가 들어있기 때문에 if 문을 pass 한다. attackme 프로그램을 tmp로 복사하고 gdb를 이용하여 뜯어보자. ..

Pwnable/FTZ

FTZ - level14 [Buffer Overflow 𝜹]

LEVEL 14 [level14] passcode : what the nigga want? (NO DRAG, NO PASSCODE} hint의 코드를 분석해보자. 일반적인 버퍼 오버플로우 문제이다. 바로 gdb를 이용하여 attackme 프로그램을 뜯어보자. 할당된 메모리 → (0x38 + 0x8) = 64 예상되는 메모리 구조 → buf(20) + dummy(20) + check(4) + dummy(8) + crap(4)+ SFP(4) + RET(4) = 64 그러나 이 문제는 ret을 덮을 필요는 없다. 그냥 check = 0xdeadbeef 이면 system 함수로 쉘이 실행되기 때문에 check의 위치에 0xdeadbeef 를 넣어주면 된다. 바로 쉘이 따졌다. my-pass 를 입력하여 pass..

Pwnable/FTZ

FTZ - level13 [Buffer Overflow 𝜸]

LEVEL 13 [level13] passcode : have no clue (NO DRAG, NO PASSCODE) 또다시 attackme 프로그램이 존재한다. 힌트 가보자. 다시 오버플로우 문제인 것 같다. 코드를 살펴보자. 또다시 오버플로우 문제인 것 같다. gdb로 뜯기 전에 tmp 디렉토리에 attackme 프로그램을 복사해주자. 바로 메모리 구조를 살펴보자. 할당된 메모리 → (0x418 + 0x8) = 1056 예상되는 메모리 구조 → buf(1024) + dummy(12) + i(4) + dummy(8) + SFP(4) + RET(4) = 1056 buf의 시작 주소를 구해야 하므로, 우선 strcpy 함수가 호출된 다음인 main + 66 부분에 break point 를 걸어준다. 그리고..

Lucvs
'Pwnable/FTZ' 카테고리의 글 목록 (2 Page)